Using tls-extra for simple smtp

后端 未结 2 1826
礼貌的吻别
礼貌的吻别 2021-02-14 18:47

I am trying to write a simple script to send a mail via my gmail account. But I am a beginner so it is not that simple. I tryed google but exept for hackage, there is no help or

相关标签:
2条回答
  • 2021-02-14 18:58

    I don't know exactly what's causing the problem you're having (My SMTP is a little rusty), but I believe part of the problem is that you're connecting on the wrong port. I think these are the correct parameters for using SMTP with Google.

    Gmail SMTP server address: smtp.gmail.com
    Gmail SMTP user name: Your full Gmail address (e.g. example@gmail.com)
    Gmail SMTP password: Your Gmail password
    Gmail SMTP port: 465
    Gmail SMTP TLS/SSL required: yes 
    

    Edit: I did a quick search of Hackage to see if there was an SMTP package that would allow you to login with a username and password, using TLS/SSL, but I didn't see anything. (I could have overlooked something, though!) The closest I found was simplesmtpclient. I don't think it supports SSL, but perhaps you could extend that, or use it as a guide for writing your own.

    0 讨论(0)
  • 2021-02-14 19:14

    You could use the connection package which simplify client connection and provide all the necessary bits for this. The following code will works to connect to smtp.gmail.com:

    {-# LANGUAGE OverloadedStrings #-}
    import qualified Data.ByteString as B
    import Data.ByteString.Char8 ()
    import Network.Connection
    import Data.Default
    
    readHeader con = do
        l <- connectionGetLine 1024 con
        putStrLn $ show l
        if B.isPrefixOf "250 " l
            then return ()
            else readHeader con
    
    main = do
        ctx <- initConnectionContext
        con <- connectTo ctx $ ConnectionParams
                                { connectionHostname  = "smtp.gmail.com"
                                , connectionPort      = 25
                                , connectionUseSecure = Nothing
                                , connectionUseSocks  = Nothing
                                }
    
        -- read the server banner
        connectionGetLine 1024 con >>= putStrLn . show
        -- say ehlo to the smtp server
        connectionPut con "EHLO\n"
        -- wait for a reply and print
        readHeader con
        -- Tell the server to start a TLS context.
        connectionPut con "STARTTLS\n"
        -- wait for a reply and print
        connectionGetLine 1024 con >>= putStrLn . show
    
        -- negociate the TLS context
        connectionSetSecure ctx con def
    
        ------- connection is secure now
        -- send credential, passwords, ask question, etc.
    
        -- then quit politely.
        connectionPut con "QUIT\n"
        connectionClose con
    
    0 讨论(0)
提交回复
热议问题