使用Python(smtplib)发送邮件时,请指定发件人

15

我有一段非常简单的代码(只是为了测试):

import smtplib
import time

server = 'smtp.myprovider.com'
recipients = ['johndoe@somedomain.com']
sender = 'me@mydomain.com'
message = 'Subject: [PGS]: Results\n\nBlaBlaBla'

session = smtplib.SMTP(server)

session.sendmail(sender,recipients,message);

这个方法是有效的,但问题在于电子邮件客户端不会显示发件人。 我希望能够添加发件人名称到电子邮件中。有什么建议吗?

6个回答

21

smtplib并不会自动包含一个From:头信息,因此你需要自己添加:

message = 'From: me@example.com\nSubject: [PGS]: Results\n\nBlaBlaBla'

(实际上,smtplib 并不会自动包含任何标头,而只是将您提供的文本作为原始邮件发送)


或许更加有帮助的是解释一下smtplib不会自动包含任何头部。 - tzot

19
你可以利用email.message.Message类来生成MIME头部,包括from:, to:subject。通过SMTP发送as_string()方法的结果。
>>> from email import message
>>> m1=message.Message()
>>> m1.add_header('from','me@no.where')
>>> m1.add_header('to','myself@some.where')
>>> m1.add_header('subject','test')
>>> m1.set_payload('test\n')
>>> m1.as_string()
'from: me@no.where\nto: myself@some.where\nsubject: test\n\ntest\n'
>>> 

首选这个的主要原因是,通过简单地粘贴字符串无法组装一个有效的非平凡电子邮件,比如MIME多部分消息。该库知道如何处理许多会使初学者困惑的细节,例如如何正确编码非ASCII数据。 - tripleee
请注意,自Python 3.6以来,首选接口是EmailMessage类,它具有类似但更灵活和逻辑的API。 - tripleee

19

看看这个答案,对我来说很有效。

示例代码:


#send html email
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
from email.utils import formataddr

msg = MIMEMultipart('alternative')
msg['From'] = formataddr((str(Header('MyWebsite', 'utf-8')), 'from@mywebsite.com'))
msg['To'] = 'to@email.com'

html = "email contents"

# Record the MIME types of text/html.
msg.attach(MIMEText(html, 'html'))

# Send the message via local SMTP server.
s = smtplib.SMTP('localhost')

# sendmail function takes 3 arguments: sender's address, recipient's address
# and message to send - here it is sent as one string.
s.sendmail('from@mywebsite.com', 'to@email.com', msg.as_string())
s.quit()

12
在这种情况下你指定的“sender”是传递到SMTP服务器的信封发送者。
您的MUA(邮件用户代理,例如Outlook / Thunderbird等)向您显示的是“From:”头。
通常,如果我在使用smtplib,则会单独编译标题:
headers = "From: %s\nTo: %s\n\n" % (email_from, email_to)

From头的格式通常按照惯例为"姓名" <user@domain>

在所有通信中,您应该同时包括“Message-Id”头和“Reply-To”头。特别是因为垃圾邮件过滤器可能会认为缺少这些头信息是垃圾邮件的高概率。

如果您已经将电子邮件正文保存在变量“body”中,只需使用以下方式编译整个消息:

message = headers + body

注意头部末尾的双换行符。需要注意的是,SMTP服务器应该仅使用换行符(即LF - linefeed)分隔头部。但是,我见过一两个使用\r\n(即CRLF)的Windows SMTP服务器。如果您正在使用Windows,则可能会有所不同。


我认为在headers字符串中的“From”后面缺少一个冒号。 - Dennis
正常格式为 发件人:真实姓名<address@example.com>,名字周围不要加双引号。有些软件总是会用引号来确保安全(或者在Outlook的情况下,可能是因为无能)但只有在名称中包含SMTP地址头中具有特殊意义的字符,如@<时才需要使用它们。 - tripleee

4
我认为你想显示特定名称而不是你的电子邮件ID。你只需更改this code中的msg['From']部分即可。
fromName = "Name Which you want to show in reciever Inbox"
fromEmail = "abc@xyz.com"  # Sender's email Id
message['From'] = "{} <{}>".format(fromName,fromEmail)

在上述常规中,之后链接


0

当仅使用smtplib添加发件人名称而不是显示您的电子邮件地址时,只需使用:

message = """From: whatever-name\nSubject: subject\n\n
body of the message!
""".encode()

通过 .sendmail(TO, FROM, message) 传递此消息将起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接