nail.py: Workalike für Heirloom mailx

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Ich benötige häufig eine simple Möglichkeit, aus einem Shell-Skript heraus eine E-Mail zu verschicken. Bisher habe ich dafür Heirloom mailx, früher 'nail' genannt, verwendet. Das simplemail-Modul hat mich jetzt dazu motiviert, einen mailx-Workalike in Python zu implementieren. Ziel war es, sämtliche Verwendungen von mailx in den vorhandenen Shell-Skripten einfach ersetzten zu können.

Das Ergebnis ist 'nail.py':

Code: Alles auswählen

#!/usr/bin/env python
# CC0 1.0 Universal <http://creativecommons.org/publicdomain/zero/1.0/deed.de>

import sys
from ConfigObject import ConfigObject
from argparse import ArgumentParser
from os.path import expanduser
from simplemail import Email

def send_email(subject, body, attachements, sender_name, sender_email, recipients, smtp):
    email = Email()
    email.subject = subject
    email.message = body
    for attachement in attachements:
        email.attachments.add_filename(attachement)
    email.from_address = sender_email
    email.from_caption = sender_name
    for recipient in recipients:
        email.recipients.add(recipient)
    email.smtp_server = smtp.host
    email.smtp_user = smtp.user
    email.smtp_password = smtp.password
    email.send()

if __name__ == "__main__":
    parser = ArgumentParser()
    parser.add_argument('-f', '--config', metavar="config",
         default=expanduser("~/.nailrc"))
    parser.add_argument('-s', '--subject', metavar="subject",
         default="(no subject)")
    parser.add_argument('recipients', metavar='recipient', nargs='+')
    parser.add_argument('-a', '--attachement', metavar="attachement",
         action="append")
    args = parser.parse_args()

    config = ConfigObject()
    config.read(args.config)

    body = sys.stdin.read()

    send_email(args.subject, body, args.attachement, config.sender.name,
               config.sender.email, args.recipients, config.smtp)
Verwendet wird dieses Skript z. B. so:

Code: Alles auswählen

$ cat msgbody | nail.py -s "my subject" -a my-first-attachement.tgz -a my-second-attachement.tgz "Recipient 1 <recipient1@example.com>" "Recipient 2 <recipient1@example.com>"
Die Konfiguration findet in '~/.nailrc' statt. Es kann aber mittels '-f' auch eine andere Konfigurationsdatei angegeben werden.

Code: Alles auswählen

[smtp]
host = smtp.example.com
user = my-user
password = secret-password

[sender]
name = My User
email = my-user@example.com
Was fehlt? Fehlerbehandlung :wink: Mehr mailx-Features.

Verwendet werden:

* http://pypi.python.org/pypi/ConfigObject/
* http://pypi.python.org/pypi/argparse/
* http://www.python-forum.de/post-18144.html
https://www.xing.com/go/invite/18513630.6a91d4
Antworten