Python 2.7发送邮件报错排查及解决方案咨询
问题1:Python 2.7 发送邮件时出现 SSLError: [SSL: UNKNOWN_PROTOCOL] unknown protocol
错误栈
Traceback (most recent call last): File "C:\Users\1651176\Desktop\male2.py", line 14, in <module> server = smtplib.SMTP_SSL(smtp_server, port, context) File "C:\ProgramData\App-V\86864BC8-DA90-464E-91D6-C9116EF05820\825D7C9B-7BA2-4F26-BDCC-55606B8D3CEC\Root\VFS\AppVPackageDrive\Python27\lib\smtplib.py", line 802, in __init__ SMTP.__init__(self, host, port, local_hostname, timeout) File "C:\ProgramData\App-V\86864BC8-DA90-464E-91D6-C9116EF05820\825D7C9B-7BA2-4F26-BDCC-55606B8D3CEC\Root\VFS\AppVPackageDrive\Python27\lib\smtplib.py", line 256, in __init__ (code, msg) = self.connect(host, port) File "C:\ProgramData\App-V\86864BC8-DA90-464E-91D6-C9116EF05820\825D7C9B-7BA2-4F26-BDCC-55606B8D3CEC\Root\VFS\AppVPackageDrive\Python27\lib\smtplib.py", line 317, in connect self.sock = self._get_socket(host, port, self.timeout) File "C:\ProgramData\App-V\86864BC8-DA90-464E-91D6-C9116EF05820\825D7C9B-7BA2-4F26-BDCC-55606B8D3CEC\Root\VFS\AppVPackageDrive\Python27\lib\smtplib.py", line 808, in _get_socket new_socket = ssl.wrap_socket(new_socket, self.keyfile, self.certfile) File "C:\ProgramData\App-V\86864BC8-DA90-464E-91D6-C9116EF05820\825D7C9B-7BA2-4F26-BDCC-55606B8D3CEC\Root\VFS\AppVPackageDrive\Python27\lib\ssl.py", line 949, in wrap_socket ciphers=ciphers) File "C:\ProgramData\App-V\86864BC8-DA90-464E-91D6-C9116EF05820\825D7C9B-7BA2-4F26-BDCC-55606B8D3CEC\Root\VFS\AppVPackageDrive\Python27\lib\ssl.py", line 617, in __init__ self.do_handshake() File "C:\ProgramData\App-V\86864BC8-DA90-464E-91D6-C9116EF05820\825D7C9B-7BA2-4F26-BDCC-55606B8D3CEC\Root\VFS\AppVPackageDrive\Python27\lib\ssl.py", line 846, in do_handshake self._sslobj.do_handshake() SSLError: [SSL: UNKNOWN_PROTOCOL] unknown protocol (_ssl.c:726)
对应代码
import smtplib import ssl port = 587 smtp_server = "smtp.gmail.com" sender_email = "send@gmail.com" # Enter your address receiver_email = "recieve@gmail.com" # Enter receiver address password = 'pwrd' message = """\ Subject: Hi there This message is sent from Python.""" context = ssl.create_default_context() server = smtplib.SMTP_SSL(smtp_server, port, context) server.login(sender_email, password) server.sendmail(sender_email, receiver_email, message) server.quit()
解决方法
端口587是STARTTLS端口,需先建立普通SMTP连接,再升级为加密连接,不能直接用SMTP_SSL连接(SMTP_SSL对应465隐式SSL端口)。修改代码如下:
import smtplib import ssl port = 587 smtp_server = "smtp.gmail.com" sender_email = "send@gmail.com" receiver_email = "recieve@gmail.com" password = '你的应用专用密码' message = """\ Subject: Hi there This message is sent from Python.""" context = ssl.create_default_context() # 先建立普通SMTP连接 server = smtplib.SMTP(smtp_server, port) server.ehlo() # 升级为加密连接 server.starttls(context=context) server.ehlo() # 再次发送ehlo确认 server.login(sender_email, password) server.sendmail(sender_email, receiver_email, message) server.quit()
问题2:Python 2.7 发送邮件时出现 SMTPAuthenticationError: (534, '5.7.9 Application-specific password required')
错误栈
Traceback (most recent call last): File "C:\Users\1651176\Desktop\male3o.py", line 13, in <module> server.login(username, password) File "C:\ProgramData\App-V\86864BC8-DA90-464E-91D6-C9116EF05820\825D7C9B-7BA2-4F26-BDCC-55606B8D3CEC\Root\VFS\AppVPackageDrive\Python27\lib\smtplib.py", line 623, in login raise SMTPAuthenticationError(code, resp) SMTPAuthenticationError: (534, '5.7.9 Application-specific password required. Learn more at\n5.7.9 https://support.google.com/mail/?p=InvalidSecondFactor t71-20020a37aa4a000000b00741d87eb5d1sm2863856qke.105 - gsmtp')
对应代码
import smtplib fromaddr = 'from@gmail.com' toaddrs = 'to@gmail.com' msg = 'This message was sent from python.' username = 'Username' password = 'pwrd' server = smtplib.SMTP('smtp.gmail.com', 587) server.ehlo() server.starttls() server.login(username, password) server.sendmail(fromaddr, toaddrs, msg) server.quit()
错误原因及解决方法
- 用户名错误:代码中
username = 'Username'需替换为你的完整谷歌邮箱地址(如from@gmail.com),而非自定义用户名。 - 密码错误:确保使用的是开启两步验证后生成的16位应用专用密码,而非账号原密码。
- 修改后代码:
import smtplib fromaddr = 'from@gmail.com' toaddrs = 'to@gmail.com' msg = 'This message was sent from python.' username = 'from@gmail.com' # 替换为完整邮箱地址 password = '你的16位应用专用密码' # 替换为生成的应用专用密码 server = smtplib.SMTP('smtp.gmail.com', 587) server.ehlo() server.starttls() server.login(username, password) server.sendmail(fromaddr, toaddrs, msg) server.quit()
内容的提问来源于stack exchange,提问作者Markas M
相关产品推荐
相关产品推荐

