Skip to main content

"Client SMTP, POP3 et SpamAssassin pour le cadriciel Scrippy"

Project description

Build Status License Language

Scrippy, my scrangourou friend

scrippy_mail

SMTP, POP3 and IMAP clients for the Scrippy framework.

Prerequisites

Python Modules

Required Modules list

  • None

Installation

With pip

pip install scrippy-mail

Manual

git clone https://codeberg.org/scrippy/scrippy-mail.git
cd scrippy-mail
python -m pip install -r requirements.txt
make install

scrippy_mail

The scrippy_mail module offers the following clients objects for sending and retrieving emails:

  • scrippy_mail.smtp.client for sending email using SMTP protocol
  • scrippy_mail.imap.client for email retrieval using IMAP protocol
  • scrippy_mail.pop.client for email retrieval using POP3 protocol

Each client are able to connect to remote server using secure connection with SSL or STARTTLS.

The scrippy_mail.mail module offers a simplified interface for sending emails via the Mailer object.

Each client use the same following parameter set:

  • host: The name of the mail server to use (default: localhost)
  • port: The port number to contact the mail server (default: 25)
  • username: The username to authenticate on the mail server
  • password: The password to authenticate on the mail server
  • ssl: A boolean indicating whether to use SSL (default: False)
  • starttls: A boolean indicating whether to use STARTTLS (default: False)
  • ssl_verify: A boolean indicating whether to verify remote server SSL certificate (default: True)
  • timeout: An integer indicating the maximum delay in seconds to succeed in a connection (default: 60)
  • exit_on_error: A boolean. If set to False, any error encountered will be logged as a warning. When set to True, exit the workflow if any error is encountered (Default: True)

NOTE:

  • ssl and starttls are mutualy exclusive. Using both at the same time raises an error.
  • In doubt use ssl for maximum secure connection.

Sending Mail

NOTE:

  • Recipients, Cc or BCc addresses must be provided as lists.
  • Each email address must be an email address that complies with RFC 5322.
  • Attachments must be a list of file path
from scrippy_mail import ScrippyMailError, logger
from scrippy_mail.smtp import client as SmtpClient

mail_username = "luiggi.vercotti@flying.circus"
mail_password = "D3ADP4ARR0T"
mail_host = "smtp.flying.circus"
mail_port = "465"
mail_ssl = True
mail_from = "luigi.vercotti@flying.circus"
mail_to = "harry.fink@flying.circus"
mail_subject = "Error report"
mail_body = """Dear Harry Fink,

You receive this email because you are one of the functional administrators of the Dead Parrot application.

The script execution ended with the following error:
- It's not pinin’! It's passed on! This parrot is no more!

--
Kind regards,
Luiggi Vercotti
"""

with SmtpClient(host=mail_host,
                port=mail_port,
                username=mail_user,
                password=mail_password,
                ssl=mail_ssl) as smtp_client:
  recipients = [mail_to]
  try:
    smtp_client.send(subject=mail_subject, body=mail_body, sender=mail_from,
                     recipients=recipients, cc=None, bcc=None, attachments=None,
                     exit_on_error=True)
    logger.info(f"Mail successfully sent to {mail_to}")
  except ScrippyMailError as err:
    logger.error(err)
    raise err

IMAP operations

The IMAP client allows all operations expected from an IMAP client such as but not limited to:

  • Get unread messages
  • Mark message as read/unread
  • Delete messages
  • Save a message in a local filesystem
from scrippy_mail import ScrippyMailError, logger
from scrippy_mail.imap import client as ImapClient

mail_user = "luiggi.vercotti@flying.circus"
mail_password = "D3ADP4ARR0T"
mail_host = "imap.flying.circus"
mail_port = "993"
mail_tls = True
mail_box = "INBOX"
mail_file = "/tmp/message.txt"

with ImapClient(host=mail_host,
                port=mail_port,
                username=mail_user,
                password=mail_password,
                starttls=mail_tls) as imap_client:
  try:
    for number in imap_client.get_unread_messages_numbers(mailbox=mail_box):
      message = imap_client.get_message(number=number, mailbox=mail_box)
      # log message:
      logger.info(message)
      # Mark message as read
      imap_client.mark_message_as_read(number=number, mailbox=mail_box)
      # Mark message as unread
      imap_client.mark_message_as_unread(number=number, mailbox=mail_box)
      # Save message (attachments will be saved in a directory netx to the message)
      imap_client.save_message(number=number, filename=mail_file, mailbox=mail_box)
      # Delete message
      imap_client.delete_message(number=number, mailbox=mail_box)
  except ScrippyMailError as err:
    logger.error(err)
    raise err

POP3 operations

The POP3 client allows all operations expected from an POP3 client such as but not limited to:

  • Get messages
  • Delete messages
  • Save a message in a local filesystem

NOTE: The POP3 protocol does not manage message states as read or unread. This feature is only avalaible with IMAP.

from scrippy_mail import ScrippyMailError, logger
from scrippy_mail.pop import client as PopClient

mail_user = "luiggi.vercotti@flying.circus"
mail_password = "D3ADP4ARR0T"
mail_host = "imap.flying.circus"
mail_port = "995"
mail_ssl = True
mail_box = "INBOX"
mail_file = "/tmp/message.txt"

with PopClient(host=mail_host,
                port=mail_port,
                username=mail_user,
                password=mail_password,
                ssl=mail_ssl) as pop_client:
  try:
    # Get message count
    count = pop_client.get_message_count()
    logger.info(f"{count} messages are available in this mailbox.")
    # Get all available messages and work on each of them
    for number in pop_client.get_messages_numbers():
      message = pop_client.get_message(number=number)
      # log message:
      logger.info(message)
      # Save message (attachments will be saved in a directory netx to the message)
      pop_client.save_message(number=number, filename=mail_file)
      # Delete message
      pop_client.delete_message(number=number)
  except ScrippyMailError as err:
    logger.error(err)
    raise err

Convenient wrapper methods:

  • PopClient.get_all_messages(): Returns all mesasges in a list
  • PopClient.delete_all_messages(): Deletes all messages

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

scrippy_mail-2.0.1.tar.gz (14.1 kB view details)

Uploaded Source

Built Distribution

scrippy_mail-2.0.1-py3-none-any.whl (14.5 kB view details)

Uploaded Python 3

File details

Details for the file scrippy_mail-2.0.1.tar.gz.

File metadata

  • Download URL: scrippy_mail-2.0.1.tar.gz
  • Upload date:
  • Size: 14.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.9.13

File hashes

Hashes for scrippy_mail-2.0.1.tar.gz
Algorithm Hash digest
SHA256 27b38f4b63f1d4aff8666cdd065d1f3cd843d21d4eda16f5dbcb89180f7ef3b2
MD5 7e16500db70289402a8315034c5fdb80
BLAKE2b-256 9b7bcd96e44ca08d4c283a819ecc09bfefa5a7c09a5fba647127857a102c614a

See more details on using hashes here.

File details

Details for the file scrippy_mail-2.0.1-py3-none-any.whl.

File metadata

  • Download URL: scrippy_mail-2.0.1-py3-none-any.whl
  • Upload date:
  • Size: 14.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.9.13

File hashes

Hashes for scrippy_mail-2.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 8215ac7814055adb7907a44135bc6ae97c71b5023d741292d14fd8b1165402bb
MD5 29f19fe533453d28b66a3e3f05162775
BLAKE2b-256 a3a36fc6b176ea9f4be02e794128e659def734b402e96c0b129e6d18de482256

See more details on using hashes here.

Supported by

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