我试图使用python发送电子邮件(Gmail),但我得到以下错误。
Traceback (most recent call last):
File "emailSend.py", line 14, in <module>
server.login(username,password)
File "/usr/lib/python2.5/smtplib.py", line 554, in login
raise SMTPException("SMTP AUTH extension not supported by server.")
smtplib.SMTPException: SMTP AUTH extension not supported by server.
Python脚本如下所示。
import smtplib
fromaddr = 'user_me@gmail.com'
toaddrs = 'user_you@gmail.com'
msg = 'Why,Oh why!'
username = 'user_me@gmail.com'
password = 'pwd'
server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.login(username,password)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
2022年12月更新:
您需要使用应用程序密码,以允许您的应用程序访问您的谷歌帐户。
使用应用程序密码登录:
应用程序密码是一个16位数的密码,给一个不太安全的应用程序或
设备权限以访问您的谷歌帐户。应用程序密码
仅用于已开启两步验证的帐户。
此外,谷歌自2022年5月30日起不允许您的应用程序使用用户名(电子邮件地址)和密码访问您的谷歌帐户。所以现在,你需要用户名(电子邮件地址)和应用程序密码来访问你的谷歌帐户。
不太安全的应用和你的谷歌账户:
为了保证您的账户安全,从2022年5月30日起,谷歌号
long支持使用第三方应用程序或设备来询问您
仅使用您的用户名和登录您的谷歌帐户
密码。
如何生成应用程序密码:
首先,从9个点中点击Account:
然后,点击安全中的应用程序密码。*不要忘记在生成应用程序密码之前打开两步验证,否则您无法生成应用程序密码:
然后,点击其他(自定义名称):
然后,输入你的应用程序名称,然后点击GENERATE:
最后,你可以生成应用程序密码xylnudjdiwpojwzm:
所以,你的代码与上面的应用程序密码如下所示:
import smtplib
fromaddr = 'user_me@gmail.com'
toaddrs = 'user_you@gmail.com'
msg = 'Why,Oh why!'
username = 'user_me@gmail.com'
password = 'xylnudjdiwpojwzm' # Here
server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.login(username,password)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
另外,在Django中,带有上述应用程序密码的settings.py如下所示:
# "settings.py"
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'myaccount@gmail.com'
EMAIL_HOST_PASSWORD = 'xylnudjdiwpojwzm' # Here
意识到用Python发送电子邮件有多痛苦,所以我为它做了一个广泛的库。它也有Gmail预配置(所以你不需要记住Gmail的主机和端口):
from redmail import gmail
gmail.user_name = "you@gmail.com"
gmail.password = "<YOUR APPLICATION PASSWORD>"
# Send an email
gmail.send(
subject="An example email",
receivers=["recipient@example.com"],
text="Hi, this is text body.",
html="<h1>Hi, this is HTML body.</h1>"
)
当然你需要配置你的Gmail账号(别担心,很简单):
设置两步验证(如果尚未设置)
创建应用程序密码
将应用程序密码设置为gmail对象,完成!
红色邮件实际上是相当广泛的(包括附件,嵌入图像,发送与抄送和密件,模板与Jinja等),应该是所有你需要从电子邮件发件人。它也经过了良好的测试和文档记录。我希望它对你有用。
如何安装:
pip install redmail
文档:https://red-mail.readthedocs.io/en/latest/
源代码:https://github.com/Miksus/red-mail
注意,Gmail不允许更改发送方。发件人地址永远是你。
我遇到过类似的问题,并无意中发现了这个问题。我得到一个SMTP身份验证错误,但我的用户名/ pass是正确的。下面是解决问题的方法。我读到:
https://support.google.com/accounts/answer/6010255
简而言之,谷歌不允许您通过smtplib登录,因为它已经标记了这种登录为“不太安全”,所以你要做的是去这个链接,而你登录到你的谷歌帐户,并允许访问:
https://www.google.com/settings/security/lesssecureapps
一旦设置好了(见下面的截图),它就可以工作了。
登录现在工作:
smtpserver = smtplib.SMTP("smtp.gmail.com", 587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo()
smtpserver.login('me@gmail.com', 'me_pass')
更改后的回复:
(235, '2.7.0 Accepted')
响应之前:
smtplib.SMTPAuthenticationError: (535, '5.7.8 Username and Password not accepted. Learn more at\n5.7.8 http://support.google.com/mail/bin/answer.py?answer=14257 g66sm2224117qgf.37 - gsmtp')
还是不行?如果您仍然得到SMTPAuthenticationError,但现在代码是534,这是因为位置未知。点击这个链接:
https://accounts.google.com/DisplayUnlockCaptcha
点击继续,这应该给你10分钟的时间来注册你的新应用。所以现在继续进行另一次登录尝试,它应该可以工作。
更新:这似乎不能马上工作,你可能会卡在smptlib中得到这个错误:
235 == 'Authentication successful'
503 == 'Error: already authenticated'
该消息说使用浏览器登录:
SMTPAuthenticationError: (534, '5.7.9 Please log in with your web browser and then try again. Learn more at\n5.7.9 https://support.google.com/mail/bin/answer.py?answer=78754 qo11sm4014232igb.17 - gsmtp')
启用“lesssecureapps”后,去喝杯咖啡,回来后再次尝试“DisplayUnlockCaptcha”链接。从用户体验来看,更改可能需要一个小时才能生效。然后再次尝试登录过程。
你需要在直接运行到STARTTLS之前说EHLO:
server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo()
server.starttls()
此外,您应该真正创建From:、To:和Subject:消息头,用空行与消息体分隔,并使用CRLF作为EOL标记。
E.g.
msg = "\r\n".join([
"From: user_me@gmail.com",
"To: user_you@gmail.com",
"Subject: Just a message",
"",
"Why, oh why"
])
注意:
为了做到这一点,你需要在gmail帐户配置中启用“允许不太安全的应用程序”选项。否则,当gmail检测到一个非谷歌应用程序试图登录你的帐户时,你会得到一个“关键安全警报”。
这是
创建Gmail APP密码!
创建之后,创建一个名为sendgmail.py的文件
然后添加以下代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# =============================================================================
# Created By : Jeromie Kirchoff
# Created Date: Mon Aug 02 17:46:00 PDT 2018
# =============================================================================
# Imports
# =============================================================================
import smtplib
# =============================================================================
# SET EMAIL LOGIN REQUIREMENTS
# =============================================================================
gmail_user = 'THEFROM@gmail.com'
gmail_app_password = 'YOUR-GOOGLE-APPLICATION-PASSWORD!!!!'
# =============================================================================
# SET THE INFO ABOUT THE SAID EMAIL
# =============================================================================
sent_from = gmail_user
sent_to = ['THE-TO@gmail.com', 'THE-TO@gmail.com']
sent_subject = "Hey Friends!"
sent_body = ("Hey, what's up? friend!\n\n"
"I hope you have been well!\n"
"\n"
"Cheers,\n"
"Jay\n")
email_text = """\
From: %s
To: %s
Subject: %s
%s
""" % (sent_from, ", ".join(sent_to), sent_subject, sent_body)
# =============================================================================
# SEND EMAIL OR DIE TRYING!!!
# Details: http://www.samlogic.net/articles/smtp-commands-reference.htm
# =============================================================================
try:
server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
server.ehlo()
server.login(gmail_user, gmail_app_password)
server.sendmail(sent_from, sent_to, email_text)
server.close()
print('Email sent!')
except Exception as exception:
print("Error: %s!\n\n" % exception)
所以,如果你成功了,你会看到这样的图像:
我通过给自己和自己发送电子邮件进行测试。
注意:我在我的帐户上启用了两步验证。应用程序密码与此工作!(对于gmail SMTP设置,您必须访问https://support.google.com/accounts/answer/185833?hl=en并遵循以下步骤)
此设置对于启用了两步验证的帐户不可用。这样的帐户需要特定于应用程序的密码来访问不太安全的应用程序。
澄清
导航到https://myaccount.google.com/apppasswords,并创建一个APP密码如上所述。