Python 练习 smtp 代码遇到错误如何解决?
求助大佬们,菜鸟初学 python,最近想试下发邮件,就找了相关的教程,代码如下:
import smtplib import email.mime.multipart import email.mime.text
msg = email.mime.multipart.MIMEMultipart() msg['From'] = '[email protected]' msg['To'] = '[email protected]' msg['Subject'] = '最新订阅' content = """ 您好, 这是一封自动发送的邮件, 最新订阅链接为:
"""
text = email.mime.text.MIMEText(content) smtp = smtplib.SMTP() smtp.connect('smtp.qq.com',465) smtp.login('[email protected]','xxxxxxxx') # 密码我放的 QQ 邮箱授权码 smtp.sendmail('[email protected]','[email protected]',str(msg)) smtp.quit()
报错信息: Traceback (most recent call last): File "F:…………/emailmodule.py", line 16, in <module> smtp = smtplib.SMTP() File "D:\Python37\lib\smtplib.py", line 261, in init fqdn = socket.getfqdn() File "D:\Python37\lib\socket.py", line 676, in getfqdn hostname, aliases, ipaddrs = gethostbyaddr(name) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc2 in position 0: invalid continuation byte</module>
想问下这个报错信息啥意思,之前试了另一套发邮件的代码,群友测试没问题,但是我一跑就出这个。 试过廖雪峰和菜鸟的代码,也都是这个报错信息。
环境: Win10 64 位 python3.7 Pycharm
拜谢!
Python 练习 smtp 代码遇到错误如何解决?
结贴,已解决是主机名含有中文字符原因。
遇到SMTP代码错误,先别慌,直接看报错信息。最常见的是认证失败、连接被拒或者端口不对。
如果是认证失败,检查用户名密码,现在很多邮箱(比如QQ、163)得用授权码而不是登录密码。连接被拒的话,看看是不是开了SSL但用了普通端口,或者防火墙拦了。
给你个能跑的示例,用QQ邮箱发邮件。把your_email@qq.com和your_authorization_code换成你自己的:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 发件人、收件人、授权码
sender = 'your_email@qq.com'
receivers = ['receiver@example.com']
auth_code = 'your_authorization_code' # QQ邮箱的授权码,不是密码!
# 邮件内容
message = MIMEText('这是邮件正文内容。', 'plain', 'utf-8')
message['From'] = Header('发件人昵称', 'utf-8')
message['To'] = Header('收件人昵称', 'utf-8')
message['Subject'] = Header('测试邮件主题', 'utf-8')
try:
# QQ邮箱SMTP服务器,端口465(SSL)
smtp_obj = smtplib.SMTP_SSL('smtp.qq.com', 465)
smtp_obj.login(sender, auth_code)
smtp_obj.sendmail(sender, receivers, message.as_string())
print("邮件发送成功")
smtp_obj.quit()
except smtplib.SMTPAuthenticationError:
print("错误:认证失败。检查邮箱/授权码是否正确,并确认邮箱已开启SMTP服务。")
except smtplib.SMTPConnectError:
print("错误:连接服务器失败。检查网络或服务器地址/端口。")
except Exception as e:
print(f"发送失败,其他错误: {e}")
关键点:
- 服务器和端口:不同邮箱不一样。QQ是
smtp.qq.com端口465(SSL)或587(TLS)。Gmail是smtp.gmail.com端口465或587。查你的邮箱服务商文档。 - 授权码:国内邮箱基本都要这个,在邮箱设置里找“POP3/SMTP服务”并生成。
- 安全连接:现在基本都得用
SMTP_SSL(端口465)或者.starttls()(端口587),明文连接(端口25)大多被禁了。
一句话建议: 对着报错信息和邮箱服务商的要求,逐项检查服务器、端口、认证方式和授权码。
发邮件用 yagmail 行了,代码比这个好看多了。
咦?是库么?我去看看。
初学,好多东西不知道


