Python Emails mit Anhang versenden
November 11, 2008Ich 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.
Veröffentlicht in Python | Verschlagwortet mit Anhang, Attachment, Attachments, Dateien, ehlo, Email, Mail, MIMEMultipart, Python, schreiben, senden, smtplib, starttls, verschicken |
Eventuell willst du dir mal die demnächst erscheinende Version von TurboMail 3 ansehen. Da ist genau dieses Problem mehr oder weniger gelöst.
von Felix Schwarz Februar 24, 2009 at 9:31 pmHallo, dein Skript Python Emails mit Anhang versenden habe ich
von Kurt April 12, 2015 at 4:08 pmgetestet es funktioniert bei mir. Bis auf den Anhang wo und wie gehört der in das Skript eingebaut ?
cu Kurt
[…] Original Source Code : Python Emails mit Anhang versenden […]
von python : send Mail + attach File(s) | Coding and More Oktober 16, 2018 at 6:44 am