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

(Tcl) Sending e-mails via gmail and yahoo mail servers

所以我正在尝试利用 Tcl 的 smtp、mime 和 tls 包来允许我的程序通过外部邮件服务器(例如 gmail 服务器)发送电子邮件 (smtp.gmail.com)和雅虎服务器 (smtp.mail.yahoo.com)。我遇到了一个问题:

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

handshake failed: resource temporarily unavailable
   while executing 
"::tls::handshake $state(sd)"

我正在使用此处找到的 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;

Google 自动向我的 gmail 帐户发送了一封电子邮件,上面写着:

We recently blocked a sign-in attempt to your Google Account <my email here>

它让我可以选择更改 "less secure apps" 的安全设置,以允许我的程序使用邮件服务器。所以我做到了,然后我的代码工作得很好。我不明白的是为什么 gmail 会阻止我发送电子邮件的尝试;为什么它认为我的尝试 "less secure" 从而迫使我在从它发送电子邮件之前降低电子邮件帐户的安全设置。也许我的理解有误,但我相信我正在使用 tls? tls 不是比 ssl 更安全吗?如果我无法连接到 gmail,为什么它有 tls 端口?

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

当我尝试访问雅虎邮件服务器(信息检索自: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;..."

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

您是否考虑过这可能不是技术限制而是政策限制的可能性?由于垃圾邮件发送者数十年的滥用,这些天邮件 非常 被严重锁定。您可能必须设置一些额外的邮件 header 才能发送基于某些 API 密钥的加密令牌,这将允许在不启用该选项的情况下直接访问。只需一点研究,我就会找到 this page,它说:

IMAP and SMTP use the standard Simple Authentication and Security Layer (SASL), via the native IMAP AUTHENTICATE and SMTP AUTH commands, to authenticate users. The SASL XOAUTH2 mechanism enables clients to provide OAuth 2.0 credentials for authentication. The SASL XOAUTH2 protocol documentation describes the SASL XOAUTH2 mechanism in great detail, and libraries and samples which have implemented the protocol are available.

Incoming connections to the IMAP server at imap.gmail.com:993 require SSL. The outgoing SMTP server, smtp.gmail.com, requires TLS. Use port 465, or port 587 if your client begins with plain text before issuing the STARTTLS command.

现在,尽管 tcllib, and the smtp package uses it by default, there isn't an implementation of the XOAUTH2 mechanism in tcllib (which you can see by inspection of the code 中有一个 SASL 实现 — 寻找 ::SASL::register),使事情回到 Google 不太满意的旧机制。解决这个问题超出了这个答案的范围(但一般来说,这是建议“获取编码”,或者至少“提交功能请求”的地方)。


我还不能确定 Yahoo Mail 文档中的确切要求;我似乎更难搜索…