Seite 1 von 1

Mail versenden mit Python

Verfasst: Samstag 2. Februar 2019, 18:53
von Phobit
Hallo,
ich habe diesen Code im Internet gefunden, mit dem man Mails per python versenden soll... Man muss angeblich nur noch seine Daten eintragen, das wären, gesendete Nachricht, Absender, Empfänger und die smtp domain...

Hier der Code:

Code: Alles auswählen

#!/usr/bin/python

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


import time
import sys
import smtplib
import os
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import formatdate
from email import encoders


class SendMail(object):

    def __init__(self):
        self.mailtoadress = 'empfänger@gmail.com'

        self.mailfromadress = 'absender@absender.com'
        self.username = 'usrname'
        self.password = 'passwd'

    Zeit = (time.strftime("%d.%m.%Y %H:%M:%S"))
    MessageText = 'Hallo,' + '\n'
    MessageText += 'dies ist der Logbericht' + '\n'
    MessageText += 'vom %s' % Zeit + '\n'

    def send(self, files):
        # Gather information, prepare mail
        to = self.mailtoadress
        From = self.mailfromadress
        # 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 = smtplib.SMTP("192.168.178.xx", 465)
        server.ehlo()  # Has something to do with sending information
        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
        msg.attach(MIMEText(SendMail.MessageText))

        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:])
Wenn ich jetzt im Linux Terminal python3 sendMail.py TestDatei.txt eingebe, passiert einfach nichts, der Prozess läuft unendlich lange, wenn ich mit strg+c abreche, heißt es Keyboard Interrupt, Mail wird natürlich nicht gesendet...Woran könnte das liegen?

Mit Port 25 oder 587 geht es nicht, es muss 465 sein...

die 192.168.178.xx ist mein privater Mailserver...

Re: Mail versenden mit Python

Verfasst: Samstag 2. Februar 2019, 19:04
von nezzcarth
Wenn du smtps oder STARTTLS verwendet möchtest (darauf deutet Port 465 hin), musst du das Skript entsprechend anpassen. Das Skript ist nur für reguläres, unverschlüsseltes SMTP gedacht.

Re: Mail versenden mit Python

Verfasst: Samstag 2. Februar 2019, 19:47
von Sirius3
@Phobit: nicht alles was man findet, ist wert aufgehoben zu werden. Oder hast Du da noch viel dran geändert?

Deine Klasse ist keine Klasse, sondern nur eine Ansammlung von Funktionen mit hart kodierten Mailadressen und Text. Die Schreibweise der Variablen und Funktionen hält sich nicht an die Konvention. Warum werden \n immer mit + an die Strings angestückelt? Wenn man einen if-Block hat und dann gleich danach einen mit der exakt umgekehrten Bedingung, benutzt man else.
Manche Kommentare sind falsch und das `return` sicherlich falsch eingerückt. Dateien, die man öffnet, sollte man auch wieder schließen.

Re: Mail versenden mit Python

Verfasst: Samstag 2. Februar 2019, 19:54
von __deets__
Ich muss ja sagen - das ist schon außergewöhnlich schlechter Code. Man hat ja viel gesehen, aber sowas...

Re: Mail versenden mit Python

Verfasst: Donnerstag 28. Februar 2019, 21:02
von Phobit
Wie gesagt, hab das ganze Code "Template" im auf Youtube in nem Tutorial gefunden, wo auch gezeigt wurde, wie man richtig danach googlet... Also von solchen Codes das beste zu erwarten... Läuft auf jeden Fall mittlerweile einwandfrei ohne weitere Fehler...

Re: Mail versenden mit Python

Verfasst: Donnerstag 28. Februar 2019, 21:35
von chq
Sirius3 hat geschrieben: Samstag 2. Februar 2019, 19:47Warum werden \n immer mit + an die Strings angestückelt?
Wie denn sonst? Ist das nicht richtig und/oder gut?

Gruß Chris

Re: Mail versenden mit Python

Verfasst: Donnerstag 28. Februar 2019, 22:10
von __blackjack__
@chq: Das ist einfach nur reichlich unsinnig die nicht einfach direkt in die Zeichenkette zu schreiben. Mit allen anderen Zeichen wird das da ja auch nicht gemacht, nur mit den Zeilenenden, als wenn das irgendwie besonders wäre.

Re: Mail versenden mit Python

Verfasst: Freitag 1. März 2019, 12:15
von chq
Für jmd. der kontinuierlich lediglich die eigentlich zu sendenden Befehle, unabhängig von dem oder den Abschlusszeichen, senden möchte kann das der Übersichtlichkeit halber durchaus Sinn machen und die Fehlerquote reduzieren.

Manche Geräte verlangen ja z.B. CR und LF im Abgang.

Gruß Chris

Re: Mail versenden mit Python

Verfasst: Freitag 1. März 2019, 12:40
von __blackjack__
@chq: 'abc\n' und 'abc' + '\n' ist absolut das gleiche, welchen Sinn sollte das machen das mit ``+`` zu schreiben? Wenn man da ein variables Zeilenendezeichen verwenden würde, also 'abc' + line_end, dann würde das Sinn machen, aber doch nicht bei einem konstanten literalen Wert. Und hier geht es um E-Mail-Text und nicht um irgendwelche Geräte/Protokolle die sich ändern würden.