Specify a sender when sending mail with Python (smtplib)

前端 未结 6 1196
不思量自难忘°
不思量自难忘° 2020-12-02 00:19

I have a very simple piece of code (just for testing):

import smtplib
import time

server = \'smtp.myprovider.com\'
recipients = [\'johndoe@somedomain.com\']         


        
相关标签:
6条回答
  • 2020-12-02 00:26

    You can utilize the email.message.Message class, and use it to generate mime headers, including from:, to: and subject. Send the as_string() result via 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'
    >>> 
    
    0 讨论(0)
  • 2020-12-02 00:28

    The "sender" you're specifying in this case is the envelope sender that is passed onto the SMTP server.

    What your MUA (Mail User Agent - i.e. outlook/Thunderbird etc.) shows you is the "From:" header.

    Normally, if I'm using smtplib, I'd compile the headers separately:

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

    The format of the From header is by convention normally "Name" <user@domain>

    You should be including a "Message-Id" header and a "Reply-To" header as well in all communications. Especially since spam filters may pick up on the lack of these as a great probability that the mail is spam.

    If you've got your mail body in the variable body, just compile the overall message with:

    message = headers + body
    

    Note the double newline at the end of the headers. It's also worth noting that SMTP servers should separate headers with newlines only (i.e. LF - linfeed). However, I have seen a Windows SMTP server or two that uses \r\n (i.e. CRLF). If you're on Windows, YMMV.

    0 讨论(0)
  • 2020-12-02 00:29

    smtplib doesn't automatically include a From: header, so you have to put one in yourself:

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

    (In fact, smtplib doesn't include any headers automatically, but just sends the text that you give it as a raw message)

    0 讨论(0)
  • 2020-12-02 00:38

    I think you are trying to show some specific name instead of your emailID. You need to change only msg['From'] part in this code

    fromName = "Name Which you want to show in reciever Inbox"
    fromEmail = "abc@xyz.com"  # Sender's email Id
    message['From'] = "{} <{}>".format(fromName,fromEmail)
    

    After this usual in above described link.

    0 讨论(0)
  • 2020-12-02 00:41

    When just using smtplib to add a from name instaead of displaying your email address just use:

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

    Passing this message through .sendmail(TO, FROM, message) will work.

    0 讨论(0)
  • 2020-12-02 00:46

    See this answer, it's working for me.

    example code:

    #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()
    
    0 讨论(0)
提交回复
热议问题