(Tcl) 通过 gmail 和 yahoo 邮件服务器发送电子邮件

Vee*_*Vee 2 ssl mime smtp tcl

因此,我尝试利用 Tcl 的 smtp、mime 和 tls 包,以便我的程序能够通过外部邮件服务器(例如 gmail 服务器(smtp.gmail.com)和 yahoo 服务器(smtp))发送电子邮件.mail.yahoo.com)。我遇到一个问题:

通过 Gmail 服务器发送电子邮件出现以下错误:

handshake failed: resource temporarily unavailable
   while executing 
"::tls::handshake $state(sd)"
Run Code Online (Sandbox Code Playgroud)

我正在使用此处找到的 smtp 信息: http: //email.about.com/od/accessinggmail/f/Gmail_SMTP_Settings.htm

我的代码如下所示:

tls::init -tls1 1;
set token [mime::initialize -canonical text/plain -string $body];

mime::setheader $token Subject "Test Email";
smtp::sendmessage $token -recipients "<my email address here>" -servers "smtp.gmail.com" -ports 587 -username "<my other email address here>" -password "<my password here>" -usetls true -debug 1;
mime::finalize $token;
Run Code Online (Sandbox Code Playgroud)

Google 自动向我的 Gmail 帐户发送了一封电子邮件,内容如下:

We recently blocked a sign-in attempt to your Google Account <my email here>
Run Code Online (Sandbox Code Playgroud)

它让我可以选择更改“不太安全的应用程序”的安全设置,以允许我的程序利用邮件服务器。所以我这样做了,然后我的代码运行得很好。我不明白的是为什么 gmail 阻止我发送电子邮件的尝试;为什么它认为我的尝试“不太安全”,从而迫使我在从电子邮件帐户发送电子邮件之前降低其安全设置。也许我的理解有问题,但我相信我正在使用 tls?tls 不是比 ssl 更安全吗?如果我无论如何都无法连接到 gmail,为什么它有 tls 端口?

编辑:我还尝试更改tls::init -tls1 1;tls::init -ssl3 1;并使用端口 465 而不是 587,仍然无济于事。

当我尝试访问 yahoo 邮件服务器(信息检索自: http: //www.serversmtp.com/en/smtp-yahoo)时,出现以下错误:

premature end-of-file from server
  while executing
"smtp::sendmessage $token -recipients "<my email here>" -servers "smtp.mail.yahoo.com" -ports 465 -username "my other email here" -password "<my password>" -usetls true -debug 1;..."
Run Code Online (Sandbox Code Playgroud)

更新 我了解到,对于 yahoo,您要使用的帐户必须是 Yahoo Mail Plus 帐户才能让您进行 smtp 邮件发送。

Don*_*ows 5

您是否考虑过这可能不是技术限制,而是政策限制?由于几十年来垃圾邮件发送者的滥用,邮件如今已被严格封锁。您可能必须设置一些额外的邮件标头才能发送基于某些 API 密钥的加密令牌,这将允许在不启用该选项的情况下直接访问。只需一点研究,我就会看到这个页面,上面写着:

\n
\n

IMAP 和 SMTP 使用标准简单身份验证和安全层 (SASL),通过本机 IMAPAUTHENTICATE和 SMTPAUTH命令来对用户进行身份验证。SASL XOAUTH2 机制使客户端能够提供 OAuth 2.0 凭据进行身份验证。SASL XOAUTH2 协议文档非常详细地描述了 SASL XOAUTH2 机制,并且提供了实现该协议的库和示例。

\n

到 IMAP 服务器的传入连接需要imap.gmail.com:993SSL。传出 SMTP 服务器smtp.gmail.com需要 TLS。使用 port 465587如果您的客户端在发出 STARTTLS 命令之前以纯文本开头,则使用 port 。

\n
\n

现在,尽管tcllib中有一个 SASL 实现,并且该smtp包默认使用它,但 tcllib 中没有 XOAUTH2 机制的实现(您可以通过检查代码\xe2\x80\x94 查找来看到这一点) ::SASL::register),让事情回到谷歌不太满意的旧机制上。修复这个问题超出了这个答案的范围(但一般来说,建议\xe2\x80\x9cget编码\xe2\x80\x9d,或者至少\xe2\x80\x9cfile一个功能请求\xe2\ x80\x9d)。

\n
\n

我还没有能够准确地确定雅虎邮件文档中的要求;我似乎很难搜索\xe2\x80\xa6

\n