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

时间:2015-02-16 18:50:15

标签: ssl smtp tcl mime

所以我试图利用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?并不是比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 Mail Plus帐户才能让您进行smtp邮件发送。

1 个答案:

答案 0 :(得分:4)

您是否考虑过这可能不是技术限制而非政策限制?由于垃圾邮件发送者滥用数十年,邮件被非常严重锁定。您可能需要设置一些额外的邮件标头,以便根据某些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 Mail文档中的要求;我似乎更难搜索......