私のGmailアカウントを介してメールを送る簡単なスクリプトを書こうとしています。しかし、私は初心者ですので、それは簡単ではありません。私はgoogleを試してみましたが、ハッキングのために実行しました。ヘルプや例はまったくありません。簡単なsmtpのためのtls-extraの使用
問題は、tls-extra(またはtls)を使用してSTARTTLS交換を開始する方法が見つからないことです。
[OK]を、ここでのコードは次のとおりです。
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
もう一つは、私は何が起こっているかを知るために聞く機能を使用することです。しかし、私は書き込みと一緒にそれを使用する方法を把握することはできません。つまり、私はいくつかのデータを送信しながらサーバ側で何が起こっているのかを見ることができるようにしたいと考えています。
私は私の問題を解決することができる二つの機能が見つかりました:TLSと同時に送受信する第二のための最初の
connectionClient :: CryptoRandomGen g => String -> String -> TLSParams -> g -> IO (TLSCtx Handle)
forkIO :: IO() -> IO ThreadId
を。 しかし、それらを機能させるように見えることはできません。
私はここで乱雑ではないと思いますが、どんな助けもありがたいです。
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ハンドシェイクを交渉するのか分かりません。
私は、答えの欠如に非常に驚いています。他にも何度か問題がありましたが、コミュニティはすぐに手伝ってくれました。しかし、これは黙っているようではありません(ただの文章)。ここでは、または#haskellやdeveloppez.comでさえも。
とにかくgoogleとtlsに関するいくつかの参考情報を歓迎します。 私はmsmtpクライアントコードを見ましたが、率直に言って私は必要なレベルを持っていません。
私は全く同じ問題があります。あなたは把握することができましたか? – Salil
本当にあなたの質問には関係ありませんが、私は、永遠にベースライブラリに定義されていることを指摘しておきます。 [Hackage](http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Monad.html#v:forever)を参照してください。 –