Mail versenden mit Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

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...
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

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.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich muss ja sagen - das ist schon außergewöhnlich schlechter Code. Man hat ja viel gesehen, aber sowas...
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

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...
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
chq
User
Beiträge: 13
Registriert: Mittwoch 27. Februar 2019, 19:44

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
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
chq
User
Beiträge: 13
Registriert: Mittwoch 27. Februar 2019, 19:44

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
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten