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

时间:2009-02-12 11:52:41

标签: python email

我有一段非常简单的代码(仅用于测试):

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 个答案:

答案 0 :(得分:14)

See这个答案,它为我工作。

示例代码:

#send html email

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()

答案 1 :(得分:12)

您可以使用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'
>>> 

答案 2 :(得分:11)

在这种情况下,您指定的“发件人”是传递到SMTP服务器的信封发件人。

您的MUA(邮件用户代理 - 即outlook / Thunderbird等)显示的是“发件人:”标题。

通常情况下,如果我使用的是smtplib,我会分别编译标题:

headers = "From: %s\nTo: %s\n\n" % (email_from, email_to)

From标头的格式通常是"Name" <user@domain>

您应该在所有通信中都包含“Message-Id”标头和“Reply-To”标头。特别是因为垃圾邮件过滤器可能会发现邮件是垃圾邮件的可能性很小。

如果你的邮件正文在变量正文中,只需用以下内容编译整个邮件:

message = headers + body

请注意标题末尾的双重换行符。值得注意的是,SMTP服务器应该仅使用换行符分隔标题(即LF - linfeed)。但是,我见过一台或两台使用\ r \ n(即CRLF)的Windows SMTP服务器。如果您使用的是Windows,YMMV。

答案 3 :(得分:9)

smtplib不会自动包含From:标题,因此您必须自己添加一个标题:

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

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

答案 4 :(得分:2)

我认为您正在尝试显示某些特定名称而不是您的emailID。您只需要更改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)

在上述link中通常如此。

答案 5 :(得分:0)

当只使用smtplib来添加显示您的电子邮件地址的名称时,只需使用:

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

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