【问题标题】:Specify a sender when sending mail with Python (smtplib)使用 Python (smtplib) 发送邮件时指定发件人
【发布时间】:2010-10-07 03:49:45
【问题描述】:

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

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

这可行,但问题是电子邮件客户端不显示发件人。 我希望能够在电子邮件中添加发件人姓名。有什么建议吗?

【问题讨论】:

    标签: python email


    【解决方案1】:

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

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

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

    【讨论】:

    • 或许解释一下 smtplib 不会自动包含 any 标头会更有帮助。
    【解决方案2】:

    您可以利用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 数据。
    • 请注意,从 Python 3.6 开始,首选接口是 EmailMessage 类,它具有类似但更通用且更符合逻辑的 API。
    【解决方案3】:

    See这个答案,它对我有用。

    示例代码:

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

    【讨论】:

      【解决方案4】:

      在这种情况下,您指定的“发件人”是传递到 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。

      【讨论】:

      • 我认为"From后面的headers字符串中缺少一个冒号。
      • 正常形式是From: Real Name <address@example.com>,名称周围没有双引号。为了安全起见,某些软件总是加上引号(或者,在 Outlook 的情况下,可能是出于无能),但仅当名称包含在 SMTP 地址标头中具有特殊含义的字符时才需要引号,例如 @<.
      【解决方案5】:

      我认为您正在尝试显示某些特定名称而不是您的电子邮件 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)
      

      在上面描述的link之后。

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-05
          • 2016-01-20
          • 2023-02-11
          • 2021-04-26
          • 1970-01-01
          • 2020-01-10
          • 1970-01-01
          • 2021-08-26
          相关资源
          最近更新 更多