关于QQ邮箱的From格式
Python代码,使用QQ邮箱发送邮件,总提示From头错误,以下是腾讯官网说明:二、根据RFC2047, RFC822协议,邮件标头中的'From'形式为:
1. 邮箱地址形式:prefix@domain, 如 'abc@qq.com'。
2. 昵称+空格+<邮箱地址>形式:nickname <prefix@domain>,其中,nickname为ASCII字符集中字符组合或编码文本:
(1)如果昵称全为ASCII字符,如'ABC',邮箱地址为'abc@qq.com',则标头中的'From'为'ABC <abc@qq.com>'。注意'ABC'和'<abc@qq.com>'之间用空格隔开;
(2)如果昵称包含非ASCII字符,如中文,则请使用base64对昵称进行编码。nickname最终的形式为:"=?" charset "?" encoding "?" encoded-text "?="。其中,charset为字符集;encoding为编码方式,'B'代表base64;encoded-text为编码后的文本。例如,昵称为'QQ邮箱昵称示例',邮箱地址为'abc@qq.com',则对昵称进行base64编码,字符集使用UTF-8,则nickname为 '=?UTF-8?B?UVHpgq7nrrHmmLXnp7DnpLrkvos=?=',最终邮件标头中的'From'为'"=?utf-8?B?UVHpgq7nrrHmmLXnp7DnpLrkvos=?=" <abc@qq.com>'。注意编码文本和邮件地址间用空格隔开。
前面能看懂,后面(2)条:如果昵称包含非ASCII字符,如中文,则请使用base64对昵称进行编码。这一段总看不明白,请高人指点:如果我的昵称为“谢谢你”,请问 该怎么写?谢谢! 根据腾讯官网的说明,如果昵称包含非ASCII字符,如中文,则需要使用base64对昵称进行编码。编码后的形式为:"=?" charset "?" encoding "?" encoded-text "?="。
在这个例子中,昵称为"谢谢你",字符集使用UTF-8编码。所以,我们需要将昵称进行base64编码。
首先,将昵称进行UTF-8编码,得到字节序列:b'\xe8\xb0\xa2\xe8\xb0\xa2\xe4\xbd\xa0'。
然后,将字节序列进行base64编码,得到编码后的文本:'6YeR6YeR5Lq6'。
最终,邮件标头中的'From'应该写为:'"=?utf-8?B?6YeR6YeR5Lq6?=" <abc@qq.com>'。
这样,昵称"谢谢你"就被正确地编码并包含在邮件的'From'中了。 根据腾讯官网的说明,如果昵称包含非ASCII字符(如中文),则需要使用base64对昵称进行编码。下面是一个示例代码,演示如何使用QQ邮箱发送邮件并设置正确的From头部格式:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
import base64
# QQ邮箱配置
smtp_server = 'smtp.qq.com'
smtp_port = 465
sender = 'your_qq_email@qq.com'
password = 'your_qq_email_password'
# 收件人邮箱
receiver = 'recipient@example.com'
# 编码昵称
nickname = '谢谢你'
encoded_nickname = '=?UTF-8?B?' + base64.b64encode(nickname.encode('utf-8')).decode('utf-8') + '?='
# 构造邮件内容
message = MIMEText('这是一封测试邮件', 'plain', 'utf-8')
message['From'] = Header(encoded_nickname, 'utf-8')
message['To'] = Header(receiver, 'utf-8')
message['Subject'] = Header('测试邮件', 'utf-8')
# 发送邮件
try:
smtpObj = smtplib.SMTP_SSL(smtp_server, smtp_port)
smtpObj.login(sender, password)
smtpObj.sendmail(sender, receiver, message.as_string())
print("邮件发送成功")
except smtplib.SMTPException as e:
print("邮件发送失败:" + str(e))
在代码中,将昵称"谢谢你"进行了UTF-8编码,并使用base64进行编码。然后,在构造邮件内容时,使用编码后的昵称作为From头部的显示名称。通过这样的方式,就能正确设置包含非ASCII字符的From头部格式。
请将your_qq_email@qq.com和your_qq_email_password替换为您的QQ邮箱地址和密码,将recipient@example.com替换为您的收件人邮箱地址。
如果问题已经解决,请设置最佳答案 最好把你的代码脱敏后放出来 陶远航 发表于 2023-8-22 11:03
根据腾讯官网的说明,如果昵称包含非ASCII字符(如中文),则需要使用base64对昵称进行编码。下面是一个示 ...
这么说的话,如果想每次都自定义中文昵称的话就不现实了,对吧? hynet1024 发表于 2023-8-22 11:05
这么说的话,如果想每次都自定义中文昵称的话就不现实了,对吧?
是的,您说得对。如果您想每次都自定义中文昵称,那么每次都需要对昵称进行编码,并且在构造邮件内容时使用编码后的昵称作为From头部的显示名称。这样虽然能够满足您的需求,但确实会稍显繁琐。
如果您希望在每次发送邮件时都能方便地自定义中文昵称,您可以将编码昵称的步骤封装成一个函数,这样每次发送邮件时只需要调用该函数,传入昵称作为参数,就能自动完成编码并设置正确的From头部格式。这样能够简化您的操作,让代码更加清晰易读。
以下是一个示例函数,用于将中文昵称进行编码并设置From头部格式:
import base64
def encode_and_format_nickname(nickname):
encoded_nickname = '=?UTF-8?B?' + base64.b64encode(nickname.encode('utf-8')).decode('utf-8') + '?='
return encoded_nickname
# 使用示例
custom_nickname = "自定义昵称"
encoded_custom_nickname = encode_and_format_nickname(custom_nickname)
print(encoded_custom_nickname)
您可以将上述函数集成到您的邮件发送代码中,每次发送邮件时只需要调用encode_and_format_nickname函数,传入您希望使用的昵称即可。这样能够更方便地实现自定义中文昵称。 isdkz 发表于 2023-8-22 11:01
根据腾讯官网的说明,如果昵称包含非ASCII字符,如中文,则需要使用base64对昵称进行编码。编码后的形式为 ...
谢谢!理解了!
页:
[1]