鱼C论坛

 找回密码
 立即注册
查看: 2301|回复: 6

[已解决]关于QQ邮箱的From格式

[复制链接]
发表于 2023-8-22 11:01:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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对昵称进行编码。这一段总看不明白,请高人指点:如果我的昵称为“谢谢你”,请问 [From]该怎么写?谢谢!
最佳答案
2023-8-22 11:07:39
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函数,传入您希望使用的昵称即可。这样能够更方便地实现自定义中文昵称。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-22 11:01:26 | 显示全部楼层
根据腾讯官网的说明,如果昵称包含非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'中了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-22 11:03:13 | 显示全部楼层
根据腾讯官网的说明,如果昵称包含非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.comyour_qq_email_password替换为您的QQ邮箱地址和密码,将recipient@example.com替换为您的收件人邮箱地址。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-22 11:04:01 | 显示全部楼层
最好把你的代码脱敏后放出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-22 11:05:21 | 显示全部楼层
陶远航 发表于 2023-8-22 11:03
根据腾讯官网的说明,如果昵称包含非ASCII字符(如中文),则需要使用base64对昵称进行编码。下面是一个示 ...

这么说的话,如果想每次都自定义中文昵称的话就不现实了,对吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-22 11:07:39 | 显示全部楼层    本楼为最佳答案   
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函数,传入您希望使用的昵称即可。这样能够更方便地实现自定义中文昵称。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-8-22 11:10:14 | 显示全部楼层
isdkz 发表于 2023-8-22 11:01
根据腾讯官网的说明,如果昵称包含非ASCII字符,如中文,则需要使用base64对昵称进行编码。编码后的形式为 ...

谢谢!理解了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-11 09:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表