Ich versuche, ein einfaches Skript zu schreiben, um eine Mail über meine Google Mail-Konto zu senden. Aber ich bin ein Anfänger, also ist es nicht so einfach. Ich habe versucht Google aber außer für Hacker, gibt es keine Hilfe oder Beispiele.Verwenden von TLS-Extra für einfache SMTP
Das Problem ist, dass ich nicht die Möglichkeit gefunden habe, tls-extra (oder tls) zu verwenden, um den STARTTLS-Austausch zu initiieren.
Ok, hier ist der Code:
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
Eine andere Sache ist, dass ich die Funktion hören verwenden zu wissen, was los ist. Aber ich kann nicht herausfinden, wie man es zusammen mit Schreiben verwendet. Das heißt, ich würde gerne sehen, was auf der Serverseite passiert, während ich Daten sende.
fand ich zwei Funktionen, die meine Probleme lösen können:
connectionClient :: CryptoRandomGen g => String -> String -> TLSParams -> g -> IO (TLSCtx Handle)
forkIO :: IO() -> IO ThreadId
Die erste für tls und die zweite zu senden und gleichzeitig zu empfangen. Aber kann nicht scheinen, dass sie funktionieren.
Ich hoffe, ich bin hier nicht unordentlich, jede Hilfe wäre willkommen.
PS: Englisch ist nicht meine Muttersprache.
EDIT: Also, ich habe ein paar Fortschritte gemacht.
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
Noch kann ich nicht herausfinden, wie man diesen tls Händedruck aushandelt.
Ich muss sagen, ich bin ziemlich überrascht von der fehlenden Antwort. Die anderen Male hatte ich ein Problem, die Gemeinde war ziemlich schnell zu helfen. Aber das scheint nicht zu interessieren (nur eine Konstration). Hier bei SO oder sogar bei #haskell oder entwickepez.com.
Anyway einige Hinweise über Google und Tls wäre willkommen. Ich habe mir den msmtp-Client-Code angeschaut, aber offen gesagt, habe ich nicht das erforderliche Level.
Ich habe genau dasselbe Problem. Hast du es geschafft, es herauszufinden? – Salil
Nicht wirklich relevant für Ihre Frage, aber lassen Sie mich darauf hinweisen, dass 'forever' in den Basisbibliotheken definiert ist. Siehe [Hackage] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Monad.html#v:forever). –