h1

Python Emails mit Anhang versenden

November 11, 2008

Ich war doch überrascht, wie viel Mehraufwand es ist Mails mit Anhang zu versenden, im Gegensatz zu reinen Textmails. Deswegen und weil ich beim Login beim Mailserver auf ein paar Probleme gestoßen bin, poste ich hier mal den Code zum Mail mit Anhang verschicken in Python. Ich hoffe mal der größte Teil erklärt sich von selbst.

#!/usr/bin/python

#Sends all files per Mail
#Example usage: python sendMail.py file1.txt, file2.txt ...

import sys, smtplib, os
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import formatdate
from email import Encoders

class SendMail(object):
  mailadress = 'user.name@gmail.com'
  smtpserver = 'smtp.googlemail.com'
  username = 'user.name'
  password = 'secret'

  def send(self, files):
    # Gather information, prepare mail
    to = self.mailadress
    From = self.mailadress
    #Subject contains preview of filenames
    if len(files) <= 3: subjAdd = ','.join(files)
    if len(files) > 3: subjAdd = ','.join(files[:3]) + '...'
    subject = 'Dateiupload: ' + subjAdd
    msg = self.prepareMail(From, to, subject, files)

    #Connect to server and send mail
    server = smtplib.SMTP(self.smtpserver)
    server.ehlo() #Has something to do with sending information
    server.starttls() # Use encrypted SSL mode
    server.ehlo() # To make starttls work
    server.login(self.username, self.password)
    failed = server.sendmail(From, to, msg.as_string())
    server.quit()

  def prepareMail(self, From, to, subject, attachments):
    msg = MIMEMultipart()
    msg['From'] = From
    msg['To'] = to
    msg['Date'] = formatdate(localtime=True)
    msg['Subject'] = subject

    # The Body message is empty
    msg.attach( MIMEText("") )

    for file in attachments:
      #We could check for mimetypes here, but I'm too lazy
      part = MIMEBase('application', "octet-stream")
      part.set_payload( open(file,"rb").read() )
      Encoders.encode_base64(part)
      part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(file))
      msg.attach(part)
      #Delete created Tar
    return msg

if __name__ == '__main__':
  mail = SendMail()
  # Send all files included in command line arguments
  mail.send(sys.argv[1:])

Folgenden Code müsste man eventuell kommentieren:

server = smtplib.SMTP(self.smtpserver)
    server.ehlo() #Has something to do with sending information
    server.starttls() # Use encrypted SSL mode
    server.ehlo() # To make starttls work
    server.login(self.username, self.password)

Das besondere ist hier, dass man um den SSL gesicherten Modus (den einige Mailserver wie Googlemail zum Beispiel verlangen) zu kommen, vorher mit ehlo() eine besondere Art der Verbindung aufbauen muss und danach die Funktion nochmal aufrufen muss, um den Wechsel in den SSL Modus zu bestätigen (fragt mich nicht was da technisch genau dahintersteckt).

Morgen will ich euch ein kleines Skript präsentieren, welches sich diese Funktion ziemlich praktisch zu Nutzen macht und mir bei der täglichen Arbeit am PC desöfteren behilflich ist.

2 Kommentare

  1. Eventuell willst du dir mal die demnächst erscheinende Version von TurboMail 3 ansehen. Da ist genau dieses Problem mehr oder weniger gelöst.


  2. Hallo, dein Skript Python Emails mit Anhang versenden habe ich
    getestet es funktioniert bei mir. Bis auf den Anhang wo und wie gehört der in das Skript eingebaut ?
    cu Kurt



Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: