How to encode international characters in recipient names (NOT addresses) with smtplib.sendmail() in Python 3?

后端 未结 2 378
春和景丽
春和景丽 2021-01-28 10:58

I\'m using a standard smtplib.sendmail() call in my Python 3 program to send emails, as follows:

smtp_session.sendmail(\'The Sender \',          


        
相关标签:
2条回答
  • 2021-01-28 11:43

    The argument to smtplib.sendmail() should not have human-readable labels, just the address terminus.

    smtp_session.sendmail('sender@domain.com', ['recipient@domain.com'],
        'Simple test body here')
    

    The email.headerregistry module in Python 3.6+ has a facility for extracting just the email terminus, by way of parsing structured headers into objects with attributes.

    from email.headerregistry import AddressHeader
    
    hdr = dict()
    AddressHeader.parse('To: The ÅÄÖ Recipient <recipient@domain.com>', hdr)
    for grp in hdr['groups']:
        for addr in grp.addresses:
            print('{0}@{1}'.format(addr.username, addr.domain))
    

    (I really hope there is a less convoluted way to access this functionality but at the very least this produces the expected result.)

    In the actual message, Python takes care of properly RFC2047-encoding any headers with Unicode content (if you use the correct methods from the email library to construct a prop0er MIME message); but this is pure presentation (RFC5322) not transport (RFC5321). So in the message itself you might see

    From: The Sender <sender@domain.com>
    To: The =?utf-8?Q?=C3=85=C3=84=C3=96_Recipient?= <recipient@domain.com>
    

    though keep in mind that there is no requirement for the message content to actually reveal the transport sender or recipient headers. (Maybe tangentially see Header "To:" for a Bulk Email Sender)

    0 讨论(0)
  • 2021-01-28 11:53

    Characters in SMTP headers are required to be printable ASCII, in the numeric range 33-126 inclusive. If you need to represent characters outside that range in an SMTP header then you must use the encoding method defined by RFC 2231 (which is an evolution of an earlier method defined by RFC 2047).

    Historically in Python you would have used the Header class from the email.header module to build suitably-encoded headers. That's still available in Python 3, but in Python 3 the newer recommendation is to use the EmailMessage class from the email.message module to construct the entire message, and let it take care of encoding any headers that need special treatment.

    0 讨论(0)
提交回复
热议问题