您没有使用 Python 3.3 或更高版本。在你的Python版本中,smtplib.SMTP()
不是上下文管理器,不能在with
陈述。
直接导致traceback是因为没有__exit__ method https://docs.python.org/2/library/stdtypes.html#contextmanager.__exit__,对上下文管理器的要求。
来自smptlib.SMTP()文档 https://docs.python.org/3/library/smtplib.html#smtplib.SMTP:
3.3版本更改: 支持with
添加了声明。
您可以将对象包装在上下文管理器中@contextlib.contextmanager https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager:
from contextlib import contextmanager
from smtplib import SMTPResponseException, SMTPServerDisconnected
@contextmanager
def quitting_smtp_cm(smtp):
try:
yield smtp
finally:
try:
code, message = smtp.docmd("QUIT")
if code != 221:
raise SMTPResponseException(code, message)
except SMTPServerDisconnected:
pass
finally:
smtp.close()
这使用与 Python 3.3 中添加的相同的退出行为。像这样使用它:
with quitting_smtp_cm(smtplib.SMTP('smtp.gmail.com', 587)) as s:
s.ehlo()
s.starttls()
s.ehlo()
s.login('address','passw')
s.sendmail(sender, recipients, composed)
请注意,它会为您关闭连接。