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

Posted

技术标签:

【中文标题】(Tcl) 通过 gmail 和 yahoo 邮件服务器发送电子邮件【英文标题】:(Tcl) Sending e-mails via gmail and yahoo mail servers 【发布时间】:2015-04-17 08:54:15 【问题描述】:

所以我试图利用 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)"

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

它让我可以选择更改“不太安全的应用程序”的安全设置,以允许我的程序使用邮件服务器。所以我做到了,然后我的代码工作得很好。我不明白为什么 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;..."

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

【问题讨论】:

【参考方案1】:

您是否考虑过这可能不是技术限制,而是政策限制?由于垃圾邮件发送者数十年的滥用,邮件现在非常被严重锁定。您可能需要设置一些额外的邮件标头才能发送基于某个 API 密钥的加密令牌,这将允许在不启用该选项的情况下直接访问。稍微研究一下,我就找到了this page,上面写着:

IMAP 和 SMTP 使用标准 Simple Authentication and Security Layer (SASL),通过本机 IMAP AUTHENTICATE 和 SMTP AUTH 命令对用户进行身份验证。 SASL XOAUTH2 机制使客户端能够提供 OAuth 2.0 凭据进行身份验证。 SASL XOAUTH2 protocol documentation详细描述了SASL XOAUTH2机制,实现了协议的libraries and samples都可以使用。

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

现在,虽然tcllib 中有一个 SASL 实现,并且 smtp 包默认使用它,但 tcllib 中没有 XOAUTH2 机制的实现(您可以通过 inspection of the code 看到)对于::SASL::register),让事情回到谷歌不太满意的旧机制上。修复该问题超出了此答案的范围(但通常这是建议“获取编码”或至少“提交功能请求”的地方)。


我还不能确切地确定雅虎邮件文档中的要求;我似乎更难搜索...

【讨论】:

一如既往,漂亮的答案!我发现对于 yahoo,您尝试用作 smtp 管道的帐户需要是 Yahoo Mail Plus 帐户才能启用此功能。但我敢肯定,根据你所说的,即使在那之后,还会有更多的安全问题需要解决。不管怎样,谢谢!谢天谢地,我已经为本地邮件服务器工作了代码。 :)

以上是关于(Tcl) 通过 gmail 和 yahoo 邮件服务器发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

PHP Mailer:从 gmail 向 yahoo 发送邮件,无法识别代码

Gmail、Yahoo Mail、Hotmail 和 AOL 等 Web 邮件客户端的撰写链接格式是啥?

html 验证不包括大多数标准电子邮件域:gmail,google,yahoo,outlook,hotmail,msn

无法使用 PHP 代码和 SMTP 服务器向 yahoo(任何地址)发送邮件

如何用java发邮件?[重复]

电子邮件未格式化为 gmail