Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python(smtplib)发送邮件时指定发件人_Python_Email - Fatal编程技术网

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

使用Python(smtplib)发送邮件时指定发件人,python,email,Python,Email,我有一段非常简单的代码(仅用于测试): 这是可行的,但问题是电子邮件客户端不显示发件人。 我希望能够将发件人名称添加到电子邮件中。建议?smtplib不会自动包含From:标题,因此您必须自己添加一个: message = 'From: me@example.com\nSubject: [PGS]: Results\n\nBlaBlaBla' (事实上,smtplib不会自动包含任何标题,只会发送您作为原始消息发送的文本)您可以利用该类,并使用它生成mime标题,包括from:、to:和sub

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

这是可行的,但问题是电子邮件客户端不显示发件人。
我希望能够将发件人名称添加到电子邮件中。建议?

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

message = 'From: me@example.com\nSubject: [PGS]: Results\n\nBlaBlaBla'
(事实上,
smtplib
不会自动包含任何标题,只会发送您作为原始消息发送的文本)

您可以利用该类,并使用它生成mime标题,包括
from:
to:
subject
。通过SMTP以字符串()形式发送
结果

>>> 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'
>>> 
在本例中指定的“发件人”是传递到SMTP服务器的信封发件人

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

通常,如果我使用smtplib,我会分别编译头文件:

headers = "From: %s\nTo: %s\n\n" % (email_from, email_to)
根据惯例,From标头的格式通常为
“Name”

您应该在所有通信中包括“消息Id”头和“回复”头。特别是由于垃圾邮件过滤器可能会发现缺少这些信息,因此邮件很可能是垃圾邮件

如果您的邮件正文位于变量正文中,只需使用以下内容编译整个邮件:

message = headers + body
注意标题末尾的双换行符。还值得注意的是,SMTP服务器应仅使用换行符(即LF-linfeed)分隔标头。但是,我看到一两台Windows SMTP服务器使用了\r\n(即CRLF)。如果你在Windows上,YMMV。

这个答案对我有用

示例代码:

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

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

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

通过.sendmail(收件人、发件人、邮件)传递此邮件将起作用。

我认为您试图显示某个特定的名称,而不是您的电子邮件ID。您只需更改中的msg['From']部分

fromName=“要在收件人收件箱中显示的名称”
fromEmail=”abc@xyz.com“#发件人的电子邮件Id
消息['From']=“{}”。格式(fromName,fromeail)

在这之后,通常在上面描述。

也许解释smtplib不自动包含任何标题会更有帮助。我认为
“From
。标准格式为
From:Real Name
,名称周围不带双引号。为了安全起见,有些软件总是加引号(或者,在Outlook中,可能是因为不称职),但只有当名称包含在SMTP地址头中具有特殊含义的字符时,才需要加引号,如
@
对我有效。简单明了首选此方法的主要原因是,您确实无法通过将简单字符串粘贴在一起来组装有效的非平凡电子邮件消息,如MIME多部分消息。库知道如何处理一些容易让初学者困惑的细节,比如如何正确编码非ASCII数据。请注意,自Python 3.6以来,首选的接口是
EmailMessage
类,该类具有类似但更通用的逻辑API。
message = """From: whatever-name\nSubject: subject\n\n
body of the message!
""".encode()
fromName = "Name Which you want to show in reciever Inbox"
fromEmail = "abc@xyz.com"  # Sender's email Id
message['From'] = "{} <{}>".format(fromName,fromEmail)