以python奇怪的行为发送电子邮件

时间:2013-04-24 22:08:32

标签: python smtp gmail sendmail

我正在编写一段代码,定期发送来自4个不同帐户的电子邮件,其中2个是gmail帐户,另外2个是雅虎帐户。当我开始编写代码时,我能够使用以下代码从两个gmail帐户发送所有电子邮件:

    def sendGmail(self, fromaddr, toaddr, username, password, 
        email_body, email_subject
    ):          
    # Build the email
    msg = MIMEText(email_body)
    msg['Subject'] = email_subject
    msg['From'] = fromaddr
    msg['To'] = toaddr

    try:
        # The actual mail send
        server = smtplib.SMTP('smtp.gmail.com:587')
        server.starttls()  
        server.login(username,password)  
        server.sendmail(fromaddr, toaddr, msg.as_string())  
        server.quit()
        print "email sent: %s" % fromaddr
    except Exception as e:
        print "Something went wrong when sending the email %s" % fromaddr
        print e

正如我所说,这段代码完美无缺,现在我添加了sendYahoomail(),这是一种不同的方法,我总是得到(530,'拒绝访问')作为使用sendGmail()的例外。我很确定它与我的Yahoo方法无关,我可以正确地使用gmail凭据从浏览器登录。

可能出现什么问题,或者只是Gmail不希望我通过代码发送?

2 个答案:

答案 0 :(得分:2)

我使用我的Gmail帐户尝试了上面的代码(实际上它是一个Google Apps帐户,但这应该是相同的)并且它对我来说很好。我甚至尝试了一个不正确的“发件人”标题,并在SMTP级别使用了错误的源地址 - 两次Gmail都允许我发送电子邮件,但似乎在出口处安静地修复了标题。不过,您可能需要仔细检查您的地址是否与您的用户名相符。如果您目前只使用@。之前的部分,请尝试使用完整的电子邮件地址作为用户名。

我也尝试了错误的密码并收到错误535,这与您所看到的不同。由于我启用了2因素身份验证,因此我还尝试使用真正的密码而不是特定于应用程序的密码,但仍然出现535错误(但需要提供“需要应用程序专用密码”的消息)。

您的ISP是否可能设置了拦截与Gmail的SMTP连接的内容?似乎不太可能,虽然我的ISP曾阻止端口587上的Gmail访问,尽管端口465仍然有效。也许您可以尝试在端口465上使用smtplib.SMTP_SSL以防万一,看看是否能给您带来更多乐趣。

您也可以尝试发送到不同提供商的地址,以防Gmail因此原因拒绝发送(例如,如果其他提供商已加入垃圾邮件黑名单)。此外,如果您的电子邮件可能看起来像垃圾邮件,请尝试使用与真实电子邮件相近的邮件主题和正文进行编码,看看是否有帮助。

答案 1 :(得分:1)

您可能会发现这有用:https://support.google.com/mail/answer/14257

基本上,Google已检测到尝试从其认为不熟悉的服务器登录,并已将其阻止。上面的链接允许您尝试取消阻止它。

有时它对我有用,有时不对。