当我运行脚本时发送电子邮件不起作用,但是逐行,它有效,为什么?

时间:2014-03-08 16:46:16

标签: python python-2.7 gmail smtplib

我有这个简单的脚本,用于向服务器发送带有状态的电子邮件。它运行,它没有给我任何错误,但我没有收到任何电子邮件,谷歌的已发送文件夹中没有电子邮件。但是如果我逐行复制并粘贴到shell中的python中,它会发送电子邮件并且可以正常工作。任何地方都没有错误。我甚至可以从Google获得接受状态。

更新:我可能已经从样本中删除了很多代码,而i变量被意外删除了。我又添加了它。当我将每行粘贴到python cmd行时,脚本可以正常工作。当我刚运行脚本时,它报告没有错误,但不发送电子邮件。

import smtplib
i = 0
try:
    text = "This is remarkable"
    fromaddr = "<gmail address>"
    toaddr = "<email address>"
    msg = """\
            From: <gmail address>
            To: <email address>
            Subject: Message number %i

            %s
    """ % (i, text)

    server = smtplib.SMTP("smtp.gmail.com:587")
    server.set_debuglevel(1)
    server.ehlo()
    server.starttls()
    server.login("<email>", "<password>")

    ret = server.sendmail(fromaddr, toaddr, msg)
    print "returned : ", ret
    print "message sent"
    i += 1
except:
    print "Now some crazy **** happened"

3 个答案:

答案 0 :(得分:2)

i未定义。如果你没有包裹NameError并且没有包裹try,那么你会看到except。你至少应该在try块中尽可能少。您还可以捕获特定错误as e。这将打印错误,以便您可以了解问题所在。

所以代码应该是:

import smtplib

i = 1
text = "This is remarkable"
fromaddr = "<gmail address>"
toaddr = "<email address>"
msg = """\
        From: <gmail address>
        To: <email address>
        Subject: Message number %i

        %s""" % (i, text)

try: 
    server = smtplib.SMTP("smtp.gmail.com:587")
    server.set_debuglevel(1)
    server.ehlo()
    server.starttls()
    server.login("<email>", "<password>")
    ret = server.sendmail(fromaddr, toaddr, msg)
except Exception as e:
    print 'some error occured'
    print e
else:
    print "returned : ", ret
    print "message sent"
    i += 1

答案 1 :(得分:1)

您的计数器变量i未定义。 try-except不是循环。你应该对try块中的内容更加保守。只包装您认为可能引发需要捕获的异常的语句。当然,你的msg字符串应该在异常处理程序之外构建,因为它不会失败,如果它确实你的代码是错误的。可以包含对邮件服务器的调用:

server = smtplib.SMTP(host="smtp.gmail.com", port="587")
server.set_debuglevel(1)
try:
    server.ehlo()
    server.starttls()
    server.login("<email>", "<password>")
    server.sendmail(fromaddr, toaddr, msg)
    print "message sent"

except smtplib.SMTPException as e:
    print "Something went wrong: %s" %str(e)

finally:
    server.close()

通过这种方式,您减少了try-except块中的代码量。

在捕捉异常时,请注意不要超过预期。我们可以定义我们期望的异常类型,然后采取适当的措施。在这里,我们只需打印它。即使抛出了未知异常,也会执行finally:块,这是我们无法捕获的异常。通常我们在这里关闭服务器连接或文件处理程序,因为try块中抛出的异常可能会使服务器连接保持打开状态。这里需要在try块之外创建服务器实例,否则我们会尝试访问一个在超出范围时会超出范围的变量。

smtplib.SMTP方法都抛出smtplib.SMTPException的不同变体,因此您应该查看方法的定义,然后才能捕获正确的异常类型。它们都继承自smtplib.SMTPException,所以如果我们懒惰,我们就可以捕获那种类型。

答案 2 :(得分:0)

我怀疑Google拥有非常敏感的SPAM过滤系统,因为当您逐行运行代码时,您可以获得警报,而不会出现任何问题。 可能通过在某些地方使用time.sleep引入延迟可能会让垃圾邮件过滤器感觉电子邮件的处置比自动化更人性化。

除此之外,我还建议任何其他提供商使用备用SMTP服务器,我相信你已经检查了垃圾邮件文件夹......