如何在python电子邮件脚本中的发件人地址之前添加发件人姓名

Posted

技术标签:

【中文标题】如何在python电子邮件脚本中的发件人地址之前添加发件人姓名【英文标题】:How to add sender name before sender address in python email script 【发布时间】:2018-02-16 21:05:21 【问题描述】:

这是我的代码

# 导入 smtplib 提供邮件功能 导入 smtplib # 导入邮件模块 从 email.mime.multipart 导入 MIMEMultipart 从 email.mime.text 导入 MIMEText # 定义要使用的电子邮件地址 addr_to = 'user@outlook.com' addr_from = 'user@aol.com' # 定义 SMTP 电子邮件服务器详细信息 smtp_server = 'smtp.aol.com' smtp_user = 'user@aol.com' smtp_pass = '通过' # 构建电子邮件 msg = MIMEMultipart('替代') msg['To'] = addr_to msg['From'] = addr_from msg['Subject'] = '测试测试测试!' # 创建消息正文(纯文本和 html 版本)。 text = "这是一条测试消息。\n文本和 html。" html = """\ """ # 记录两个部分的 MIME 类型 - text/plain 和 text/html。 第 1 部分 = MIMEText(文本,“纯文本”) 第 2 部分 = MIMEText(html, 'html') # 将部件附加到消息容器中。 # 根据 RFC 2046,多部分消息的最后一部分,在这种情况下 # HTML 消息,是最好的和首选的。 msg.attach(第 1 部分) msg.attach(第 2 部分) # 通过 SMTP 服务器发送消息 s = smtplib.SMTP(smtp_server) s.login(smtp_user,smtp_pass) s.sendmail(addr_from, addr_to, msg.as_string()) s.quit()

我只希望收到的电子邮件在发件人电子邮件地址之前显示发件人姓名,如下所示:sender_name

【问题讨论】:

关于 RFC2046 的评论非常不正确。接收者选择他们喜欢看的身体部位。如果有的话,如果用户没有指定偏好,第一部分可能会优先。 【参考方案1】:

在 2020 年和 Python 3 中,您可以这样做:

from email.utils import formataddr
from email.message import EmailMessage
import smtplib

msg = EmailMessage()
msg['From'] = formataddr(('Example Sender Name', 'john@example.com'))
msg['To'] = formataddr(('Example Recipient Name', 'jack@example.org'))
msg.set_content('Lorem Ipsum')

with smtplib.SMTP('localhost') as s:
    s.send_message(msg)

【讨论】:

【参考方案2】:

我采用了内置示例并使用以下方法制作了它:

mail_body = "the email body"
mailing_list = ["user1@company.com"]
msg = MIMEText(mail_body)

me = 'John Cena <mail@company.com>'
you = mailing_list
msg['Subject'] = subject
msg['From'] = me
msg['To'] = mailing_list

# Send the message via our own SMTP server, but don't include the
# envelope header.
s = smtplib.SMTP('localhost')
s.sendmail(me, [you], msg.as_string())
s.quit()

【讨论】:

【参考方案3】:

我发现,如果我使用 gmail 发送电子邮件并将 From 标头设置为 sender name &lt;email@gmail.com&gt;,则电子邮件到达时会带有 From 之类的:

发件人发件人姓名 email@gmail.com email@gmail.com。

所以我猜至少使用 gmail 你应该像下面这样设置From 标头:

msg['From'] = "sender name"

【讨论】:

【参考方案4】:

这是一个老问题 - 但是,我遇到了同样的问题并提出了以下问题:

msg['From'] = formataddr((str(Header('Someone Somewhere', 'utf-8')), 'xxxxx@gmail.com'))

您需要导入from email.header import Headerfrom email.utils import formataddr

这将使收件箱中仅显示发件人姓名,而没有&lt;xxxxx@gmail.com&gt;

虽然电子邮件正文将包含完整模式:

将发件人姓名和电子邮件放在一个字符串中 (Sender Name &lt;sender@server.com&gt;) 会使一些电子邮件客户端在收件人的收件箱中相应地显示它(与第一张图片不同,仅显示姓名)。

【讨论】:

很好的解决方案!【参考方案5】:

您可以使用下面提到的代码,您只需要更改发送者和接收者的用户名和密码,它就会为您工作。

import smtplib

sender = 'xyz@gmail.com'
receivers = ['abc@gmail.com']

message = """From: sender_name <xyz@gmail.com>
To: reciever_name <abc@gmail.com>
Subject: sample test mail

This is a test e-mail message.
"""

try:
   smtpObj = smtplib.SMTP('smtp_server',port)
   smtpObj.sendmail(sender, receivers, message) 
   smtpObj.login(user,password)        
   print ("Successfully sent email")
except:
   print ("Error: unable to send email")

更多详情请访问https://www.datadivein.com/2018/03/how-to-auto-send-mail-using-python.html

【讨论】:

用硬编码的手工构建的消息代替完美的 MIME 消息并不是朝着正确方向迈出的一步。【参考方案6】:

这取决于“友好名称”是基本 ASCII 还是需要特殊字符。

基本示例:

msg['From'] = str(Header('Magnus Eisengrim <meisen99@gmail.com>'))

如果你需要使用非 US-ASCII 字符,那就比较复杂了,不过附上的文章应该会有所帮助,说的很透彻:http://blog.magiksys.net/generate-and-send-mail-with-python-tutorial

【讨论】:

那会改变接收者的名字!! 更新了答案,但同样的逻辑适用于“From”标题以及“To”标题。

以上是关于如何在python电子邮件脚本中的发件人地址之前添加发件人姓名的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 mailx 命令的发件人电子邮件地址?

使用 python 发送邮件 - 如何设置与“发件人”地址不同的返回路径

如何使用存储在 Excel 中的地址向多个收件人发送电子邮件?

如何使用python从熊猫数据框中将电子邮件发送到具有不同主题的不同收件人地址

SMTP lib 从哪个 IP 地址发送电子邮件?

PHP 邮件不在“收件人”标题中显示“收件人”