def test_encoding():
    """Encode body correctly with other encodings
    than utf-8
    """
    email = EmailMessage('Subject', 'Firstname Sürname is a great guy.',
        '*****@*****.**', '*****@*****.**')
    email.encoding = 'iso-8859-1'
    message = email.message()

    assert message.as_string().startswith('Content-Type: text/plain; charset="iso-8859-1"\nMIME-Version: 1.0\nContent-Transfer-Encoding: quoted-printable\nSubject: Subject\nFrom: [email protected]\nTo: [email protected]')
    assert message.get_payload() == 'Firstname S=FCrname is a great guy.'

    # Make sure MIME attachments also works correctly with other encodings than utf-8
    text_content = 'Firstname Sürname is a great guy.'
    html_content = '<p>Firstname Sürname is a <strong>great</strong> guy.</p>'
    
    email = EmailMessage('Subject', text_content, '*****@*****.**', 
        '*****@*****.**', html_content=html_content)
    email.encoding = 'iso-8859-1'
    message = email.message()

    assert message.get_payload(0).as_string() == \
        'Content-Type: text/plain; charset="iso-8859-1"\nMIME-Version: 1.0\nContent-Transfer-Encoding: quoted-printable\n\nFirstname S=FCrname is a great guy.'
    assert message.get_payload(1).as_string() == \
        'Content-Type: text/html; charset="iso-8859-1"\nMIME-Version: 1.0\nContent-Transfer-Encoding: quoted-printable\n\n<p>Firstname S=FCrname is a <strong>great</strong> guy.</p>'
def test_multiple_message_call():
    """Make sure that headers are not changed when calling 
    `EmailMessage.message()` again.
    """
    email = EmailMessage('Subject', 'Content', '*****@*****.**',
        '*****@*****.**', headers={'From': '*****@*****.**'})
    
    message = email.message()
    assert message['From'] == '*****@*****.**'
    message = email.message()
    assert message['From'] == '*****@*****.**'
def test_unicode_address_header():
    """When a to/from/cc header contains unicode,
    make sure the email addresses are parsed correctly (especially with
    regards to commas).
    """
    email = EmailMessage('Subject', 'Content', '*****@*****.**',
        ['"Firstname Sürname" <*****@*****.**>', '*****@*****.**'])
    message = email.message()
    assert message['To'] == '=?utf-8?q?Firstname_S=C3=BCrname?= <*****@*****.**>, [email protected]'

    email = EmailMessage('Subject', 'Content', '*****@*****.**', 
        ['*****@*****.**', '"Sürname, Firstname" <*****@*****.**>'])
    message = email.message()
    assert message['To'] == '[email protected], =?utf-8?q?S=C3=BCrname=2C_Firstname?= <*****@*****.**>'
def test_cc():
    email = EmailMessage('Subject', 'Content', '*****@*****.**',
        '*****@*****.**', cc='*****@*****.**')
    message = email.message()

    assert message['Cc'] == '*****@*****.**'
    assert email.get_recipients() == ['*****@*****.**', '*****@*****.**']
def test_space_continuation():
    """Test for space continuation character in long (ascii) subject headers.
    """
    email = EmailMessage('Long subject lines that get wrapped should use a space continuation character to get expected behaviour in Outlook and Thunderbird',
        'Content', '*****@*****.**', '*****@*****.**')
    message = email.message()

    assert message['Subject'] == 'Long subject lines that get wrapped should use a space continuation\n character to get expected behaviour in Outlook and Thunderbird'
def test_from_header():
    """Make sure we can manually set the From header.
    """
    email = EmailMessage('Subject', 'Content', '*****@*****.**',
        '*****@*****.**', headers={'From': '*****@*****.**'})
    message = email.message()

    assert message['From'] == '*****@*****.**'
def test_multiple_cc_and_to():
    email = EmailMessage('Subject', 'Content', '*****@*****.**',
        to=['*****@*****.**', '*****@*****.**'],
        cc=['*****@*****.**', '*****@*****.**'])
    message = email.message()

    assert message['Cc'] == '[email protected], [email protected]'
    assert email.get_recipients() == ['*****@*****.**', '*****@*****.**',
        '*****@*****.**', '*****@*****.**']
def test_multiple_recipients():
    email = EmailMessage('Subject', 'Content', '*****@*****.**',
        ['*****@*****.**', '*****@*****.**'])
    message = email.message()

    assert message['Subject'].encode() == 'Subject'
    assert message.get_payload() == 'Content'
    assert message['From'] == '*****@*****.**'
    assert message['To'] == '[email protected], [email protected]'
def test_ascii():
    email = EmailMessage('Subject', 'Content', '*****@*****.**',
        '*****@*****.**')
    message = email.message()

    assert message['Subject'].encode() == 'Subject'
    assert message.get_payload() == 'Content'
    assert message['From'] == '*****@*****.**'
    assert message['To'] == '*****@*****.**'
def test_recipients_as_tuple():
    email = EmailMessage('Subject', 'Content', '*****@*****.**', 
        to=('*****@*****.**', '*****@*****.**'),
        cc=('*****@*****.**', '*****@*****.**'),
        bcc=('*****@*****.**',))
    message = email.message()

    assert message['Cc'] == '[email protected], [email protected]'
    assert email.get_recipients() == ['*****@*****.**', '*****@*****.**',
        '*****@*****.**', '*****@*****.**', '*****@*****.**']
def test_unicode_headers():
    headers={
        'Sender': '"Firstname Sürname" <*****@*****.**>',
        'Comments': 'My Sürname is non-ASCII',
    }
    email = EmailMessage(u"Gżegżółka", "Content", "*****@*****.**",
        "*****@*****.**", headers=headers)
    message = email.message()

    assert message['Subject'] == '=?utf-8?b?R8W8ZWfFvMOzxYJrYQ==?='
    assert message['Sender'] == '=?utf-8?q?Firstname_S=C3=BCrname?= <*****@*****.**>'
    assert message['Comments'] == '=?utf-8?q?My_S=C3=BCrname_is_non-ASCII?='
def test_html():
    subject = 'hello'
    from_email = '*****@*****.**'
    to = '*****@*****.**'
    text_content = 'This is an important message.'
    html_content = '<p>This is an <strong>important</strong> message.</p>'

    email = EmailMessage(subject, text_content, from_email, to,
        html_content=html_content)
    message = email.message()

    assert message.is_multipart()
    assert message.get_content_type() == 'multipart/alternative'
    assert message.get_default_type() == 'text/plain'
    assert message.get_payload(0).get_content_type() == 'text/plain'
    assert message.get_payload(1).get_content_type() == 'text/html'
def test_attachments():
    subject = 'hello'
    from_email = '*****@*****.**'
    to = '*****@*****.**'
    text_content = 'This is an important message.'
    html_content = '<p>This is an <strong>important</strong> message.</p>'

    email = EmailMessage(subject, text_content, from_email, to,
        html_content=html_content)
    email.attach('an attachment.pdf', '%PDF-1.4.%...',
        mimetype='application/pdf')
    message = email.message()

    assert message.is_multipart()
    assert message.get_content_type() == 'multipart/mixed'
    assert message.get_default_type() == 'text/plain'
    assert message.get_payload(0).get_content_type() == 'multipart/alternative'
    assert message.get_payload(1).get_content_type() == 'application/pdf'
def test_safe_mime_multipart():
    """Make sure headers can be set with a different encoding than utf-8 in
    SafeMIMEMultipart as well
    """
    subject = 'Message from Firstname Sürname'
    from_email = '*****@*****.**'
    to = '"Sürname, Firstname" <*****@*****.**>'
    text_content = 'This is an important message.'
    html_content = '<p>This is an <strong>important</strong> message.</p>'
    headers = {"Date": "Fri, 09 Nov 2001 01:08:47 -0000", "Message-ID": "foo"}

    email = EmailMessage(subject, text_content, from_email, to,
        html_content=html_content, headers=headers)
    email.encoding = 'iso-8859-1'
    message = email.message()

    assert message['To'] == '=?iso-8859-1?q?S=FCrname=2C_Firstname?= <*****@*****.**>'
    assert message['Subject'].encode() == u'=?iso-8859-1?q?Message_from_Firstname_S=FCrname?='
def test_header_injection():
    email = EmailMessage('Subject\nInjection Test', 'Content',
        '*****@*****.**', '*****@*****.**')
    
    with pytest.raises(ValueError):
        email.message()