Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError

最新在学习Python的基础入门系列课程,今天学习到使用python 的内置库smtplib发送邮件内容。
使用Python发送邮件步骤简单:

  1. 创建SMTP连接
  2. 使用邮箱和密码登录SMTP服务器
  3. 创建邮件内容对象EmailMessage, 并使用set_content方法设置邮件内容
  4. 调用sendmail方法发送邮件

具体代码如下:

import smtplib
from email.message import EmailMessage

# 定义SMTP邮件服务器地址
smtp_server = 'smtp.qq.com'
# 邮件发送人邮箱
from_addr = '******@qq.com'  # 自己的邮想
# 邮件发送人邮箱密码
password = '******'  # 邮箱密码
# 邮件接收人
to_addr = '******@163.com'  # 测试接收邮件地址邮箱

# 创建SMTP连接
conn = smtplib.SMTP_SSL(smtp_server, 465)
# 设计调试级别
conn.set_debuglevel(1)
# 登录邮箱
conn.login(from_addr, password)
# 创建邮件内容对象
msg = EmailMessage()
# 设置邮件内容
msg.set_content('您好,这是一封来自Python的测试邮件', 'plain', 'utf-8')
# 发送邮件
conn.sendmail(from_addr, [to_addr], msg.as_string())
# 退出连接
conn.quit()

运行上述代码后,会报如下错误:

smtplib.SMTPAuthenticationError: (535, b'Error: \xc7\xeb\xca\xb9\xd3\xc3\xca\xda\xc8\xa8\xc2\xeb\xb5\xc7\xc2\xbc\xa1\xa3\xcf\xea\xc7\xe9\xc7\xeb\xbf\xb4: http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256')

点击网址部分:http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256,会跳转到腾讯邮箱的如下页面
在这里插入图片描述

就是我们在使用第三方客户端登录QQ邮箱时,为了保证账户安全,需要使用说授权码,在帮助中心中,点击生成授权码就可以得到腾讯邮箱给出的授权码了。
然后,使用得到的授权码,替换下面登录login方法中的password代码,即使用用户邮箱和授权码登录

conn.login(from_addr, "授权码")

修改完成后,重新运行就不会出现以上错误,并且成功的发送邮件到了指定邮箱,可以登录收件邮箱已查看是否收到,也有可能在垃圾箱里。

至此,Python使用smtplib发送邮件成功了。

欢迎大家关注我的公众号:君伟说。

def send_verification_code(): """发送验证码到指定邮箱""" email = email_input.text() # 验证邮箱格式 if not email: QMessageBox.warning(forgot_wid, "警告", "请输入邮箱地址") return if "@" not in email or "." not in email: QMessageBox.warning(forgot_wid, "警告", "请输入有效的邮箱地址") return # 生成随机验证码 verification_code = str(random.randint(1000, 9999)) print(f"生成的验证码: {verification_code}") # 发送验证码到邮箱 if send_email_verification(email, verification_code): QMessageBox.information(forgot_wid, "提示", "验证码已发送至您的邮箱") else: QMessageBox.warning(forgot_wid, "错误", "验证码发送失败,请检查邮箱地址") def send_email_verification(email, code): """发送验证码邮件的核心函数""" print(f"正在发送验证码:{code} 至: {email}") try: # 邮件配置 smtp_server = "smtp.qq.com" smtp_port = 587 sender_email = "2303937223@qq.com" sender_password = "vghuaicevyyaebgcd" # 创建邮件对象 message = MIMEMultipart() # 使用formataddr处理发件人和收件人信息,避免编码问题 message["From"] = formataddr(("验证码系统", sender_email)) message["To"] = formataddr(("用户", email)) message["Subject"] = Header("密码重置验证码", "utf-8") # 构造邮件正文 body = str(f"您的验证码是: {code},有效期为5分钟。请勿将验证码告知他人。") # 创建MIMEText对象,明确指定编码 mime_text = MIMEText(body.encode('utf-8'), "plain", "utf-8") message.attach(mime_text) # 发送邮件 server = smtplib.SMTP(smtp_server, smtp_port) server.starttls() try: server.login(sender_email, sender_password) except smtplib.SMTPAuthenticationError as e: print(f"邮箱登录失败,请检查邮箱账号和授权码: {e}") return False # 使用send_message方法发送邮件,避免编码问题 server.send_message(message) server.quit() print(f"验证码已成功发送: {email}") return True except smtplib.SMTPException as e: print(f"SMTP错误: {e}") return False except UnicodeEncodeError as e: print(f"编码错误: {e}") return False except Exception as e: print(f"发送邮件时出错: {e}") return False一直报错:编码错误: 'ascii' codec can't encode characters in position 5-6: ordinal not in range(128)
最新发布
11-03
Python发送邮件时出现 `'ascii' codec can't encode characters in position 5-6: ordinal not in range(128)` 错误,通常是因为在邮件内容中包含了非ASCII字符,而Python默认使用ASCII编码,无法处理这些字符。以下是几种解决办法: ### 1. 指定编码 在构造邮件内容时,明确指定使用UTF - 8编码。示例代码如下: ```python import smtplib from email.mime.text import MIMEText from email.utils import formataddr # 发件人邮箱账号和授权码 sender_email = "your_email@example.com" sender_password = "your_email_password" # 收件人邮箱 receiver_email = "recipient_email@example.com" # 邮件内容 subject = "邮件主题" body = "这是包含非ASCII字符的邮件正文" # 创建一个纯文本的邮件对象,并指定编码为UTF-8 msg = MIMEText(body, 'plain', 'utf-8') msg['From'] = formataddr(("发件人姓名", sender_email)) msg['To'] = formataddr(("收件人姓名", receiver_email)) msg['Subject'] = subject # 连接到SMTP服务器 server = smtplib.SMTP_SSL("smtp.example.com", 465) server.login(sender_email, sender_password) # 发送邮件 server.sendmail(sender_email, [receiver_email], msg.as_string()) # 关闭连接 server.quit() ``` ### 2. 设置系统默认编码(不推荐) 虽然可以通过以下方式设置系统默认编码,但这种方法不推荐,因为它可能会影响到其他部分的代码。 ```python import sys reload(sys) sys.setdefaultencoding('utf-8') ``` 需要注意的是,在Python 3中 `sys.setdefaultencoding` 已被移除,因此这种方法仅适用于Python 2。 ### 3. 检查邮件头信息 确保邮件头(如发件人姓名、收件人姓名等)中不包含非ASCII字符,如果包含,需要进行编码处理。例如: ```python from email.header import Header msg['From'] = formataddr((str(Header("发件人姓名", 'utf-8')), sender_email)) msg['To'] = formataddr((str(Header("收件人姓名", 'utf-8')), receiver_email)) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值