【问题标题】:Haskell: SMTP over SSLHaskell:基于 SSL 的 SMTP
【发布时间】:2011-12-23 14:44:36
【问题描述】:

昨晚我想在 Haskell 中编写一个实用程序脚本,使用我的 gmail 帐户发送一些电子邮件。

但是,gmail requires a SSL/TLS connection to their SMTP server,我不知道如何使用 HaskellNet's sendMail 完成此操作。

我怎么能用 HaskellNet 做到这一点?或者我应该使用其他 SMTP 库吗?

【问题讨论】:

  • 您找到解决方案了吗?
  • Salil:不,我放弃了。 hammar 的解决方案可能会奏效。
  • 也有一些discussion on Haskell-beginners,但这不是一个完整的解决方案。

标签: email haskell ssl smtp


【解决方案1】:

通过快速浏览文档,我注意到connectStream,它允许您使用已经打开的流,以及所有功能都在BSStream s => s 而不是普通的Handle 上工作的事实。我猜您可以将它与tls 包一起使用,为TLSCtx a(或新类型)编写BSStream 实例,以允许您使用与HaskellNet 的sendMail 的TLS/SSL 连接。

我对这两个包都没有任何经验,但看起来有可能。

【讨论】:

  • 用 TLS 替换 tsl。 TLS 是“传输级安全性”。 SSL 是“安全套接层”
  • 我猜。如何使用Network.TLS 进行密码验证连接并没有引起我的注意,但我会多看一点。
【解决方案2】:

您是否考虑过configuring sendmail with GMail 并使用smtp-mailsendmail 交谈?

【讨论】:

    【解决方案3】:

    这是一篇相当老的帖子,但我只是想我会弹出一个答案,以防有人偶然发现它正在寻找 IMAP/SMTP 的 SSL/TLS 支持。我在 Hackage 上建立了一个库,它通过做 hammar suggested in his answer 的几乎所有事情来为 HaskellNet 的邮件功能添加 TLS 支持。

    你可以在这里找到图书馆:http://hackage.haskell.org/package/HaskellNet-SSL 以及示例代码here

    【讨论】:

      【解决方案4】:

      以下代码适用于Windows 10

      它使用黑客HaskellNet-SSL

      大部分代码由czyzykowski提供

      我需要将谷歌帐户配置为allow less secure apps,所以它并不完美,但可以。

      {-# LANGUAGE OverloadedStrings #-}
      module Email where
      
      import           Control.Monad
      import           Data.ByteString.Lazy        (toStrict)
      import           Data.Text                   (unpack)
      import           Network.HaskellNet.Auth
      import           Network.HaskellNet.SMTP
      import           Network.HaskellNet.SMTP.SSL
      import           Network.Mail.Mime
      
      toString :: Address -> String
      toString Address { addressEmail = email } = unpack email
      
      defaultMail :: Mail
      defaultMail = Mail {
                                  mailFrom = Address (Just "My Name" ) "me@example.com",
                                  mailTo =[Address (Just "Your Name") "someone@example.com"],
                                  mailCc = [],
                                  mailBcc = [],
                                  mailHeaders = [("Subject", "Haskell Rocks")],
                                  mailParts = []
                                                          }
      sendEmail msg = do
        rendered   <- renderMail' defaultMail {mailParts = [[plainPart msg]]}
        doSMTPSTARTTLSWithSettings  "smtp.gmail.com" defaultSettingsSMTPSSL{sslPort = 587} $ \connection -> do
            succeeded  <- authenticate LOGIN
                                       "mygoogleaccount@gmail.com"
                                       "mypassword"
                                       connection
            when succeeded $ do
                putStrLn "conntected. Now we'll send the email"
                sendMail (toString (mailFrom defaultMail))
                         (map toString (mailTo defaultMail))
                         (toStrict rendered) connection
      

      【讨论】:

        猜你喜欢
        • 2014-12-11
        • 2013-03-01
        • 2016-03-31
        • 2014-03-28
        • 2011-02-10
        • 2019-07-04
        • 2016-02-20
        • 1970-01-01
        • 2011-05-12
        相关资源
        最近更新 更多