Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
--boundary
Content-Type: text/plain; charset=utf-8
Hello Laȝamon
--boundary
Content-Type: text/html; charset=utf-8
<p>Hello Laȝamon</p>
"""))
template_message = TemplateMessage(template_path)
sender, recipients, message = template_message.render({})
# Verify sender and recipients
assert sender == "from@test.com"
assert recipients == ["to@test.com"]
# Should be multipart: plaintext and HTML
assert message.is_multipart()
parts = message.get_payload()
assert len(parts) == 2
plaintext_part, html_part = parts
# Verify plaintext part
assert plaintext_part.get_charset() == "utf-8"
assert plaintext_part.get_content_charset() == "utf-8"
assert plaintext_part.get_content_type() == "text/plain"
def test_simple(tmp_path):
"""Render a simple template."""
template_path = tmp_path / "template.txt"
template_path.write_text(textwrap.dedent(u"""\
TO: to@test.com
SUBJECT: Testing mailmerge
FROM: from@test.com
Hello {{name}}!
"""))
template_message = TemplateMessage(template_path)
sender, recipients, message = template_message.render({
"name": "world",
})
assert sender == "from@test.com"
assert recipients == ["to@test.com"]
plaintext = message.get_payload()
assert "Hello world!" in plaintext
def test_utf8_database(tmp_path):
"""Verify UTF8 support when template is rendered with UTF-8 value."""
# Simple template
template_path = tmp_path / "template.txt"
template_path.write_text(textwrap.dedent(u"""\
TO: to@test.com
FROM: from@test.com
Hi {{name}}
"""))
# Render template with context containing unicode characters
template_message = TemplateMessage(template_path)
sender, recipients, message = template_message.render({
"name": u"Laȝamon",
})
# Verify sender and recipients
assert sender == "from@test.com"
assert recipients == ["to@test.com"]
# Verify message encoding. The template was ASCII, but when the template
# is rendered with UTF-8 data, the result is UTF-8 encoding.
assert message.get_content_maintype() == "text"
assert message.get_content_subtype() == "plain"
assert message.get_content_charset() == "utf-8"
# Verify content
plaintext = message.get_payload(decode=True).decode("utf-8")
"""Verify encoding is preserved when rendering a Markdown template.
See Issue #59 for a detailed explanation
https://github.com/awdeorio/mailmerge/issues/59
"""
template_path = tmp_path / "template.txt"
template_path.write_text(textwrap.dedent(u"""\
TO: {{email}}
SUBJECT: Testing mailmerge
FROM: test@example.com
CONTENT-TYPE: text/markdown
Hi, {{name}},
æøå
"""))
template_message = TemplateMessage(template_path)
_, _, message = template_message.render({
"email": "myself@mydomain.com",
"name": "Myself",
})
# Message should contain an unrendered Markdown plaintext part and a
# rendered Markdown HTML part
plaintext_part, html_part = message.get_payload()
# Verify encodings
assert str(plaintext_part.get_charset()) == "utf-8"
assert str(html_part.get_charset()) == "utf-8"
assert plaintext_part["Content-Transfer-Encoding"] == "base64"
assert html_part["Content-Transfer-Encoding"] == "base64"
# Verify content, which is base64 encoded
def test_attachment_empty(tmp_path):
"""Errr on empty attachment field."""
template_path = tmp_path / "template.txt"
template_path.write_text(textwrap.dedent(u"""\
TO: to@test.com
SUBJECT: Testing mailmerge
FROM: from@test.com
ATTACHMENT:
Hello world
"""))
template_message = TemplateMessage(template_path)
with pytest.raises(MailmergeError):
template_message.render({})
--boundary
Content-Type: text/plain; charset=us-ascii
{{message}}
--boundary
Content-Type: text/html; charset=us-ascii
<p>{{message}}</p>
"""))
template_message = TemplateMessage(template_path)
sender, recipients, message = template_message.render({
"message": "Hello world"
})
# Verify sender and recipients
assert sender == "from@test.com"
assert recipients == ["to@test.com"]
# Should be multipart: plaintext and HTML
assert message.is_multipart()
parts = message.get_payload()
assert len(parts) == 2
plaintext_part, html_part = parts
# Verify plaintext part
assert plaintext_part.get_charset() == "us-ascii"
def test_attachment_tilde_path(tmpdir):
"""Attachment with home directory tilde notation file path."""
template_path = Path(tmpdir/"template.txt")
template_path.write_text(textwrap.dedent(u"""\
TO: to@test.com
FROM: from@test.com
ATTACHMENT: ~/attachment.txt
Hello world
"""))
# Render will throw an error because we didn't create a file in the
# user's home directory. We'll just check the filename.
template_message = TemplateMessage(template_path)
with pytest.raises(MailmergeError) as err:
template_message.render({})
correct_path = Path.home() / "attachment.txt"
assert str(correct_path) in str(err)
def test_multiple_substitutions(tmp_path):
"""Render a template with multiple context variables."""
template_path = tmp_path / "template.txt"
template_path.write_text(textwrap.dedent(u"""\
TO: {{email}}
FROM: from@test.com
Hi, {{name}},
Your number is {{number}}.
"""))
template_message = TemplateMessage(template_path)
sender, recipients, message = template_message.render({
"email": "myself@mydomain.com",
"name": "Myself",
"number": 17,
})
assert sender == "from@test.com"
assert recipients == ["myself@mydomain.com"]
plaintext = message.get_payload()
assert "Hi, Myself," in plaintext
assert "Your number is 17" in plaintext
attachment_path = Path(attachments_dir/"attachment.txt")
attachment_path.write_text(u"Hello world\n")
# Simple template
template_path = Path(tmpdir/"template.txt")
template_path.write_text(textwrap.dedent(u"""\
TO: to@test.com
FROM: from@test.com
ATTACHMENT: {filename}
Hello world
""".format(filename=attachment_path)))
# Render in tmpdir
with tmpdir.as_cwd():
template_message = TemplateMessage(template_path)
_, _, message = template_message.render({})
# Verify attachment
attachments = extract_attachments(message)
filename, content = attachments[0]
assert filename == "attachment.txt"
assert content == b"Hello world\n"
def test_html(tmp_path):
"""Verify HTML template results in a simple rendered message."""
template_path = tmp_path / "template.txt"
template_path.write_text(textwrap.dedent(u"""\
TO: to@test.com
SUBJECT: Testing mailmerge
FROM: from@test.com
Content-Type: text/html
<p>{{message}}</p>
"""))
template_message = TemplateMessage(template_path)
sender, recipients, message = template_message.render({
"message": "Hello world"
})
# Verify sender and recipients
assert sender == "from@test.com"
assert recipients == ["to@test.com"]
# A simple HTML message is not multipart
assert not message.is_multipart()
# Verify encoding
assert message.get_charset() == "us-ascii"
assert message.get_content_charset() == "us-ascii"
assert message.get_content_type() == "text/html"