17

我正在给自己写一个简单的 sendmail 函数,但我不断收到这个错误:

NameError:未定义名称“SMTPException”

我的代码有什么问题?有什么建议么?

import smtplib

sender = "user@gmail.com"
receiver = ["user@gmail.com"]
message = "Hello!"

try:
    session = smptlib.SMTP('smtp.gmail.com',587)
    session.ehlo()
    session.starttls()
    session.ehlo()
    session.login(sender,'password')
    session.sendmail(sender,receiver,message)
    session.quit()
except SMTPException:
    print('Error')
4

2 回答 2

32

在 Python 中,您需要通过为其模块添加前缀来完全限定名称:

except smtplib.SMTPException:

除非您专门导入非限定名称,否则这是正确的(但我不建议您为您的程序执行此操作,只是显示可能的情况):

from smtplib import SMTPException
于 2012-10-29T04:08:45.150 回答
1

我也多次出现这种拼写错误!绕过这个“问题”的一种方法是使用yagmail

撇开玩笑不谈,我最近创建了 yagmail 以更轻松地发送电子邮件。

例如:

import yagmail
yag = yagmail.SMTP('user@gmail.com', 'password')
yag.send(contents = "Hello!")

它在这里使用了几个缩写,例如当To未定义时,它将向在服务器上注册的同一电子邮件发送邮件。端口和主机也是默认的,这使得它非常简洁。

事实上,既然你似乎想立即关闭连接,你甚至可以使用这个单行:

yagmail.SMTP('user@gmail.com', 'password').send(contents = "Hello!")

为了安全起见,您可以将密码保存在keyring(请参阅文档)中,这样您就不必将个人密码保存在脚本中,这非常重要!它甚至可以为您节省更多宝贵的屏幕空间。

全力以赴的包(@gmail.com默认),你可以摆脱以下:

yagmail.SMTP('user').send('', 'Hello!')

祝你好运。

于 2015-04-18T18:43:45.817 回答