Использование tls -дополнительно для простого smtp

Я пытаюсь написать простой скрипт для отправки почты через мою учетную запись gmail. Но я новичок, поэтому все не так просто. Я пробовал гуглить, но, кроме взлома, нет никакой помощи или примеров.

Проблема в том, что я не нашел способа использовать 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 или developmentpez.com.

В любом случае, некоторые указатели на google и tls будут приветствоваться. Я просмотрел код клиента msmtp, но, честно говоря, у меня нет необходимого уровня.

9
задан Sarfraz 5 July 2012 в 00:51
поделиться