所以我有一个通过 Gmail API 发送电子邮件的功能:
def send_email(payload, messagesubject, sendtoaddresses, key_file_path: str, subject: str):
messagedraft = MIMEText(payload, "plain")
mailservice = build_mail_service(key_file_path, subject)
messagedraft["From"] = f"Display name <{subject}>"
messagedraft["Subject"] = messagesubject
for address in sendtoaddresses.split(","):
if "To" in messagedraft:
del messagedraft["To"]
messagedraft["To"] = address
message = {"raw": urlsafe_b64encode(messagedraft.as_bytes()).decode()}
mailservice.users().messages().send(userId="me", body=message).execute()
除了如果“发件人”字段中的“显示名称”有一个 utf-8 字符,它会被省略并且只有电子邮件地址显示在标题中这一事实之外,一切都运行良好。
我尝试了在互联网和 stackoverflow 上找到的各种编码设置,但没有任何解决办法。唯一有效的是当我将 utf-8 字符更改为 ascii
我试图理解为什么会出现这个问题以及如何解决此问题。
在检查 Tripleee 链接的文档时在 Gmail API 中发送 utf-8 显示名称时出现问题我被一个新想法所震惊,并用
MIMEText
类替换了 EmailMessage
类。
以下是对我有用的解决方案,以供将来参考。
def send_email(payload, messagesubject, sendtoaddresses, key_file_path: str, subject: str):
messagedraft = EmailMessage()
messagedraft.set_payload(payload)
mailservice = build_mail_service(key_file_path, subject)
messagedraft.add_header("From", f"Display name <{subject}>")
messagedraft.add_header("Subject", messagesubject)
messagedraft.add_header("To", "")
for address in sendtoaddresses.split(","):
messagedraft.replace_header("To", address)
message = {"raw": urlsafe_b64encode(messagedraft.as_bytes()).decode()}
mailservice.users().messages().send(userId="me", body=message).execute()