Skip to main content

Email reply body generator for HTML and text

Project description

replyowl: Email reply body generator for HTML and text in Python

PyPI PyPI - Python Version Build codecov GitHub stars

replyowl

replyowl creates email bodies with quoted messages. Provide the original message and your reply message, and replyowl will combine them into a new message. The returned content can be used as the text and/or HTML body content of a new email. HTML-to-text conversion is performed with html2text.

Installation

replyowl is available on PyPI:

pip install replyowl

Usage

from replyowl import ReplyOwl

owl = ReplyOwl()
text, html = owl.compose_reply(
    content="<i>New</i> reply <b>content</b>",
    quote_attribution="You wrote:",
    quote_text="Original message text",
    quote_html="<b>Original</b> message text",
)

print(text)
# _New_ reply **content**
#
# ----
#
# You wrote:
#
# > Original message text

print(html)  # (output formatted for readability)
# <!DOCTYPE html>
# <html>
#   <head>
#     <title></title>
#   </head>
#   <body>
#     <i>New</i> reply <b>content</b>
#     <div>You wrote:<br />
#     </div>
#     <blockquote style="margin-left: 0.8ex; padding-left: 2ex;
#                        border-left: 2px solid #aaa; border-radius: 8px;" type="cite">
#       <b>Original</b> message text
#     </blockquote>
#   </body>
# </html>

Links in HTML are preserved when creating plain text email bodies:

from replyowl import ReplyOwl

owl = ReplyOwl()
text, html = owl.compose_reply(
    content=(
        'Check <a href="https://example.com/">this</a> out<br />'
        'Or this: <a href="https://example.net/">https://example.net/</a>'
    ),
    quote_attribution="You wrote:",
    quote_text="Send me a URL",
    quote_html="Send me a <i>URL</i>",
)

print(text)
# Check this (https://example.com/) out
# Or this: https://example.net/
#
# ----
#
# You wrote:
#
# > Send me a URL

If the quoted HTML content contains a <body> tag, that is preserved:

from replyowl import ReplyOwl

owl = ReplyOwl()
text, html = owl.compose_reply(
    content="Hello there",
    quote_attribution="You wrote:",
    quote_text="Hi",
    quote_html='<html><body class="sender_body"><b>Hi</b></body></html>',
)

print(html)  # (output formatted for readability)
# <html>
#   <body class="sender_body">
#     Hello there
#     <div>
#     You wrote:<br/>
#     </div>
#     <blockquote style="margin-left: 0.8ex; padding-left: 2ex;
#                        border-left: 2px solid #aaa; border-radius: 8px;" type="cite">
#       <b>Hi</b>
#     </blockquote>
#   </body>
# </html>

A custom value can be provided for the <blockquote>'s style tag:

from replyowl import ReplyOwl

owl = ReplyOwl(blockquote_style="font-weight: bold;")
text, html = owl.compose_reply(
    text, html = owl.compose_reply(
        content="Your quote is in bold",
        quote_attribution="You wrote:",
        quote_text="I'm going to be in bold when you reply",
        quote_html="I'm going to be in bold when you reply",
    )
)

print(html)  # (output formatted for readability)
# <html>
#   <body class="sender_body">
#     Your quote is in bold
#     <div>
#     You wrote:<br/>
#     </div>
#     <blockquote style="font-weight: bold;" type="cite"
#       I'm going to be in bold when you reply
#     </blockquote>
#   </body>
# </html>

Development

Poetry installation

Via pipx:

pip install pipx
pipx install poetry
pipx inject poetry poetry-pre-commit-plugin

Via pip:

pip install poetry
poetry self add poetry-pre-commit-plugin

Development tasks

  • Setup: poetry install
  • Run static checks: poetry run poe lint or poetry run pre-commit run --all-files
  • Run static checks and tests: poetry run poe test

Created from smkent/cookie-python using cookiecutter

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

replyowl-0.1.19.tar.gz (16.3 kB view details)

Uploaded Source

Built Distribution

replyowl-0.1.19-py3-none-any.whl (16.8 kB view details)

Uploaded Python 3

File details

Details for the file replyowl-0.1.19.tar.gz.

File metadata

  • Download URL: replyowl-0.1.19.tar.gz
  • Upload date:
  • Size: 16.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.0.1 CPython/3.12.8

File hashes

Hashes for replyowl-0.1.19.tar.gz
Algorithm Hash digest
SHA256 e109452e3cb5277dcd607f4873a070976000725275a814ab642270cef427a97b
MD5 e9f54a5c2fac40f5b6061a71ce1ca03f
BLAKE2b-256 e81d7383d306412d6b72373342b707affea592b49c1e424e2d548c118db63bc6

See more details on using hashes here.

Provenance

The following attestation bundles were made for replyowl-0.1.19.tar.gz:

Publisher: cd.yml on smkent/replyowl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file replyowl-0.1.19-py3-none-any.whl.

File metadata

  • Download URL: replyowl-0.1.19-py3-none-any.whl
  • Upload date:
  • Size: 16.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.0.1 CPython/3.12.8

File hashes

Hashes for replyowl-0.1.19-py3-none-any.whl
Algorithm Hash digest
SHA256 ae78951ff5f95003474f1d6f658d86956109ba6845c8bdb45940e62aba233f74
MD5 f87aa0056220ca86b8bffdb449de3927
BLAKE2b-256 c0442b107178415d38620e0835a82683710f8bbe970e55e845e164cf4db421d7

See more details on using hashes here.

Provenance

The following attestation bundles were made for replyowl-0.1.19-py3-none-any.whl:

Publisher: cd.yml on smkent/replyowl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page