【问题标题】:Sending email through G Suite using Perl使用 Perl 通过 G Suite 发送电子邮件
【发布时间】:2021-02-25 22:32:34
【问题描述】:

在通过我们的 G Suite 帐户/地址发送电子邮件近十年后,该脚本昨晚在托管公司服务器升级后停止工作。 (不幸的是,托管公司目前已将其归档在“不是我们的问题”下,因此这方面确实没有任何帮助。我希望至少排除任何我们做错的事情,并能够通过一些有用的取证返回给他们。)

这是相关的 Perl 摘录:

    $smtp = Net::SMTP->new('smtp.gmail.com', Port => 465, Timeout => 30, Hello => 'mail.mydomain.com', SSL => 1, Debug => 1);
    # $login and $pass are valid address@mydomain.com and password
    # used for logging into the Gmail interface at mail.mydomain.com
    print "auth($login, $pass)\n";
    $smtp->auth($login, $pass) or die "Unable to authenticate";
    $smtp->mail($login);
    $smtp->recipient($email);
    $smtp->data($message) or die "data() failed sending to: $email\n";
    $smtp->quit;

这是输出:

    Net::SMTP::_SSL>>> Net::SMTP::_SSL
    Net::SMTP::_SSL>>>   IO::Socket::SSL(2.060)
    Net::SMTP::_SSL>>>     IO::Socket::IP(0.39)
    Net::SMTP::_SSL>>>       IO::Socket(1.39)
    Net::SMTP::_SSL>>>         IO::Handle(1.39)
    Net::SMTP::_SSL>>>           Exporter(5.73)
    Net::SMTP::_SSL>>>   Net::SMTP(3.11)
    Net::SMTP::_SSL>>>     Net::Cmd(3.11)
    Net::SMTP::_SSL=GLOB(0x7fc8de8ab9d8)<<< 220 smtp.gmail.com ESMTP [###] - gsmtp
    Net::SMTP::_SSL=GLOB(0x7fc8de8ab9d8)>>> EHLO mail.mydomain.com
    Net::SMTP::_SSL=GLOB(0x7fc8de8ab9d8)<<< 250-smtp.gmail.com at your service, [###.###.###.###]
    Net::SMTP::_SSL=GLOB(0x7fc8de8ab9d8)<<< 250-SIZE 35882577
    Net::SMTP::_SSL=GLOB(0x7fc8de8ab9d8)<<< 250-8BITMIME
    Net::SMTP::_SSL=GLOB(0x7fc8de8ab9d8)<<< 250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
    Net::SMTP::_SSL=GLOB(0x7fc8de8ab9d8)<<< 250-ENHANCEDSTATUSCODES
    Net::SMTP::_SSL=GLOB(0x7fc8de8ab9d8)<<< 250-PIPELINING
    Net::SMTP::_SSL=GLOB(0x7fc8de8ab9d8)<<< 250-CHUNKING
    Net::SMTP::_SSL=GLOB(0x7fc8de8ab9d8)<<< 250 SMTPUTF8
    auth(address@mydomain.com, [password])
    Unable to authenticate at mymodule.pm line 459.

其他几点说明:

  1. 为域和用户地址@mydomain.com 启用了不太安全的应用程序访问(与以前一样)。
  2. 这些是有效凭据。它们目前可用于登录 mail.mydomain.com(Web/Gmail 界面),并且与之前用于此方法的相同。
  3. 通过 Gmail 发送邮件的方法在网络上很常见,包括 SO 和其他地方,包括 https://support.google.com/a/answer/176600使用 Gmail SMTP 服务器,位于 Other setup options
  4. 同样,直到服务器升级为止。但由于我在错误输出中没有看到任何内容,因此我不确定从哪里开始寻找破损。

通常发生这种情况时,我会遗漏一些明显的东西,所以我是否遗漏了一些明显的东西?

【问题讨论】:

  • 我在您的错误输出中看到“无法验证”。你没看到吗?您确定您的凭据有效吗?
  • @TLP 是的,这是我关于 auth() 失败的消息。如前所述,凭据与我目前可用于通过 Web 界面登录的凭据相同,并且与过去约 10 年的凭据相同。出于某种原因,身份验证(突然)失败,但我没有太多要解释的原因。

标签: perl smtp gmail


【解决方案1】:

鉴于调试输出未显示任何身份验证尝试,可能是所需的Authen::SASL 模块未安装或未正确安装。来自documentation of Net::SMTP

身份验证(用户名,密码)
身份验证 (SASL)
尝试 SASL 身份验证。 需要 Authen::SASL 模块。 第一个表单构造一个新的 Authen::SASL 对象使用给定的用户名和密码;第二 表单使用给定的 Authen::SASL 对象。

要确定问题,不仅要使用自定义错误 die(),还要记录 $smtp-&gt;message。基于this code,它可能会记录错误“Need MIME::Base64 and Authen::SASL todo auth”

【讨论】:

  • 谢谢。这实际上是我今天向他们寻求支持但尚未收到回复的事情。
  • @KT_:你为什么不检查一下自己?只需在命令行中使用 perl -MAuthen::SASL -e '' 或在脚本中使用 use Authen::SASL。此外,请记录答案中建议的更多错误详细信息。
  • 我认为你是对的。我之前找过但是没找到。我不确定是否有某种方法可以在系统上安装它(因为我想我认为如果它丢失了我会得到一个明确的错误)——你瞧,它就在你在$smtp-&gt;message 中建议的地方。再次感谢。我只是想确认一件事,然后我会接受你的回答。
猜你喜欢
  • 2017-09-23
  • 2018-06-26
  • 2018-03-15
  • 2019-03-02
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
相关资源
最近更新 更多