因此,我尝试利用 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 邮件发送。
您是否考虑过这可能不是技术限制,而是政策限制?由于几十年来垃圾邮件发送者的滥用,邮件如今已被严格封锁。您可能必须设置一些额外的邮件标头才能发送基于某些 API 密钥的加密令牌,这将允许在不启用该选项的情况下直接访问。只需一点研究,我就会看到这个页面,上面写着:
\n\n\nIMAP 和 SMTP 使用标准简单身份验证和安全层 (SASL),通过本机 IMAP
\nAUTHENTICATE和 SMTPAUTH命令来对用户进行身份验证。SASL XOAUTH2 机制使客户端能够提供 OAuth 2.0 凭据进行身份验证。SASL XOAUTH2 协议文档非常详细地描述了 SASL XOAUTH2 机制,并且提供了实现该协议的库和示例。到 IMAP 服务器的传入连接需要
\nimap.gmail.com:993SSL。传出 SMTP 服务器smtp.gmail.com需要 TLS。使用 port465,587如果您的客户端在发出 STARTTLS 命令之前以纯文本开头,则使用 port 。
现在,尽管tcllib中有一个 SASL 实现,并且该smtp包默认使用它,但 tcllib 中没有 XOAUTH2 机制的实现(您可以通过检查代码\xe2\x80\x94 查找来看到这一点) ::SASL::register),让事情回到谷歌不太满意的旧机制上。修复这个问题超出了这个答案的范围(但一般来说,建议\xe2\x80\x9cget编码\xe2\x80\x9d,或者至少\xe2\x80\x9cfile一个功能请求\xe2\ x80\x9d)。
我还没有能够准确地确定雅虎邮件文档中的要求;我似乎很难搜索\xe2\x80\xa6
\n| 归档时间: |
|
| 查看次数: |
1771 次 |
| 最近记录: |