我正在嘗試編寫一個簡單的腳本來通過我的gmail帳戶發送郵件。但我是初學者,所以不是那麼簡單。我嘗試谷歌,但免除了駭客,沒有任何幫助或例子。使用tls-extra用於簡單的smtp
的問題是,我沒有找到使用TLS-EXTRA(或TLS)發起STARTTLS交換的方式。
好,這裏是代碼:
import Network
import Network.TLS.Extra
import System.IO
import Text.Printf
server = "smtp.gmail.com"
port = 25 --that has to chage, I think
forever a = a >> forever a
main = test1
write :: Handle -> String -> IO()
write h s = do
hPrintf h "%s\r\n" s
printf "> %s\n" s
listen :: Handle -> IO()
listen h = forever $ hGetLine h >>= putStrLn
test1 = do h <- connectTo server (PortNumber (fromIntegral port))
hSetBuffering h NoBuffering
write h "EHLO"
write h "STARTTLS"
listen h
另一件事是,我用聽的功能就知道是怎麼回事。但我無法弄清楚如何將它與寫入一起使用。也就是說,我希望在發送某些數據時能夠看到服務器端發生了什麼。
我發現可以解決我的問題有兩個功能:
connectionClient :: CryptoRandomGen g => String -> String -> TLSParams -> g -> IO (TLSCtx Handle)
forkIO :: IO() -> IO ThreadId
,第一對TLS和第二發送和在同一時間收到。 但似乎無法讓他們工作。
我希望我不要在這裏混亂,任何幫助將不勝感激。
PS:英語不是我的母語。
編輯: 所以,我已經取得了一些進展。
import Network
import Network.TLS
import Network.TLS.Extra
import System.IO
import Text.Printf
import Control.Monad (forever)
import Control.Concurrent (threadDelay)
import qualified Data.ByteString.Char8 as B
import Crypto.Random
serv :: String
serv = "smtp.gmail.com"
port :: Int
port = 25 --that has to chage, I think
main :: IO()
main = test1
write :: Handle -> String -> IO()
write h s = do
hPrintf h "%s\r\n" s
printf "> %s\n" s
listen :: Handle -> IO()
listen h = forever $ hGetLine h >>= putStrLn
printSock :: Handle -> String -> IO()
printSock h s = do write h s
hGetLine h >>= putStrLn
threadDelay 25
params :: TLSParams
params=defaultParams {pConnectVersion=TLS12
,pAllowedVersions=[TLS10, TLS11, TLS12]
,pCiphers=ciphersuite_all}
test1 = do h <- connectTo serv (PortNumber (fromIntegral port))
hSetBuffering h NoBuffering
printSock h "EHLO"
printSock h "STARTTLS"
--google waits for tls handshake
--the problem is from here
g <- newGenIO :: IO SystemRandom
tlsH <- client params g h
handshake tlsH --the handshake is failling
不過,我無法弄清楚如何協商tls握手。我不得不說,我對沒有答案感到驚訝。其他人幾次遇到問題,社區很快就會提供幫助。但是這似乎沒有意義(只是一個常式)。在SO或甚至在#haskell或developpez.com。
反正一些關於谷歌和tls的指針將受到歡迎。 我看了一下msmtp客戶端代碼,但坦率地說我沒有所需的級別。
我有完全相同的問題。你設法弄清楚了嗎? – Salil
與你的問題沒有太大的關係,但讓我指出'永遠'是在基礎庫中定義的。參見[Hackage](http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Monad.html#v:forever)。 –