Senden einer E-Mail aus Python über den lokalen Python-SMTP-Server

Senden einer E-Mail aus Python über den lokalen Python-SMTP-Server

Ich habe einen Server mit Raspbian Jessie, von dem ich E-Mails mit Python versenden möchte. Ich habe zwei Module gesehen, die funktionieren könnten, darunter smtpdund smtplib.

Ich habe viele Beispiele gesehen, einige davon enthalten smtp.gmail.comund localhost. Ich möchte eine E-Mail mit einem bestimmten Domänennamen senden, zum Beispiel: [email protected] Ich bin neu bei SMTP und habe nur viele Fehler erhalten. Wie würde ich den SMTP-Servercode erstellen, um die E-Mail tatsächlich zu senden?

Traceback (most recent call last):
  File "C:\Users\Josua\Desktop\smtp_test.py", line 42, in <module>
    s = smtplib.SMTP('sigsmileyface.ddns.net')
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\smtplib.py", line 251, in __init__
    (code, msg) = self.connect(host, port)
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\smtplib.py", line 336, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\smtplib.py", line 307, in _get_socket
    self.source_address)
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\socket.py", line 724, in create_connection
    raise err
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\socket.py", line 713, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it

Antwort1

Haftungsausschluss

Ich gehe davon aus, dass zumindest einige der folgenden Informationen für Sie überflüssig sein werden. Bitte haben Sie Geduld. =)

smtplib vs. smptd

Python verfügt über zwei Module für den Umgang mit E-Mails:smtplibUndsmtpd. Der Unterschied zwischen den beiden besteht darin, dass smtplibzum Senden von E-Mails verwendet wird, während smptdzum Empfangen von E-Mails verwendet wird. In diesem Fall müssen Sie zum Senden von E-Mails nur verwenden smtplib.

E-Mail mit Python 3.6 smtplib

Ich möchte eine E-Mail über meinen Domänennamen versenden (zum Beispiel[email geschützt]).

Da Sie Ihr Quellskript nicht bereitgestellt haben, habe ich unten ein funktionierendes Python 3.6-Mail-Skript als Referenz aufgeführt:

# Python mail script with smtplib, email.utils and email.mime.text.

# --- imports ---

import smtplib
import email.utils
from email.mime.text import MIMEText

# --- create our message ---

# Create our message. 
msg = MIMEText('The body of your message.')
msg['To'] = email.utils.formataddr(('Recipient Name', '[email protected]'))
msg['From'] = email.utils.formataddr(('Your Name', '[email protected]'))
msg['Subject'] = 'Your Subject'

# --- send the email ---

# SMTP() is used with normal, unencrypted (non-SSL) email.
# To send email via an SSL connection, use SMTP_SSL().
server = smtplib.SMTP()

# Specifying an empty server.connect() statement defaults to ('localhost', 25).
# Therefore, we specify which mail server we wish to connect to.
server.connect ('mail.example.com', 25)

# Optional login for the receiving mail_server.
# server.login ('[email protected]', 'Password')

# Dump communication with the receiving server straight to to the console.
# server.set_debuglevel(True)  

# '[email protected]' is our envelope address and specifies the return
# path for bounced emails.
try:
    server.sendmail('[email protected]', ['[email protected]'], msg.as_string())
finally:
    server.quit()

Beachten Sie, dass ich zwar "Server" als Objektnamen verwende smtplib, Sie aber weiterhin "s" (oder was auch immer) in Ihrem eigenen Skript verwenden können. Ebenso ist die Verwendung desemail.utilUndE-Mail.MIMEModule sind nicht unbedingt erforderlich, aber sie sind beim Erstellen der endgültigen Nachricht hilfreich.

Ich bin neu bei SMTP und habe nur viele Fehlermeldungen bekommen.

Ich kann nicht sagen, was Ihre anderen Fehler verursacht haben könnten, aber die Ausgabe, die Sie aufgelistet haben, weist auf eine Verbindung hin zusigsmileyface.ddns.netkonnte auf Port 25 nicht hergestellt werden. Die wichtigsten Zeilen sind:

  • s = smtplib.SMTP('sigsmileyface.ddns.net'), der standardmäßig auf Port 25 eingestellt ist.

  • Die letzte Zeile ConnectionRefusedError: [...] the target machine actively refused itkönnte auf ein Konfigurationsproblem mit der Firewall oder dem Mailserver hinweisen.

Fehlerbehebung

Überprüfen Sie den Mailserver und den Port

Stellen Sie sicher, dass der Server, mit dem Sie eine Verbindung herstellen, über einen aktiven Mailserver verfügt und auf welchem ​​Port dieser läuft (normalerweise Port 25 für eingehende E-Mails).

In Ihrem Fall, wenn Sie die Kontrolle haben übersigsmileyface.ddns.netund versuchen, E-Mails dorthin zu senden, sollten Sie überprüfen, ob Ihr Mailserver richtig eingerichtet ist, um E-Mails auf Port 25 zu empfangen. Ich glaube, das sendmailist der Standard-Mailserver auf Pi. Sie sollten auch bestätigen, dass der Port nicht durch eine Firewall blockiert ist und dass alle erforderlichen Portweiterleitungen in Ihrem Router richtig eingerichtet sind.

In ähnlicher Weise sollte es zwar keinen Unterschied machen, ob Sie sich direkt mit Ihrem Mailserver verbinden, aber Sie sollten MX-Einträge einrichten, wenn Sie Mails an folgende Adresse senden/empfangen möchten:sigsmileyface.ddns.net.

Überprüfen Sie Ihre Verbindung

Sie sollten doppelt prüfen, ob Ihr Skript die richtigen Verbindungswerte hat, egal ob Sie diese im smptlibObjekt oder über angeben .connect(). Beachten Sie, dass der von Ihnen angegebene Hostname immer entweder eine direkte Verbindung zu dem Server ist, an den Sie E-Mails senden möchten, oder zu einem zwischengeschalteten Mailserver (lokal oder anderweitig), von dem Sie erwarten, dass er Nachrichten in Ihrem Namen weiterleitet.

Auch wenn es in Ihrem Fall unwahrscheinlich erscheint, sollten Sie sich auch über Benutzernamen und Passwörter im Klaren sein, die für die Verbindung mit dem empfangenden Server erforderlich sind. Dies kommt am häufigsten vor, wenn Sie einen anderen Server zum Weiterleiten von E-Mails verwenden, aber es lohnt sich, sich daran zu erinnern.

Überprüfen Sie, ob Sie ein Relais verwenden müssen

Stellen Sie sicher, dass Sie kein Relay irgendeiner Art verwenden müssen. Kurz gesagt: Einige ISPs ergreifen bestimmte Maßnahmen, um Spam zu verhindern, was möglicherweise die Verwendung spezieller Mailserver erforderlich macht, um Nachrichten zunächst über Port 25 zu übertragen oder zu empfangen.

Beispielsweise filtert der lokale ISP für meinen Heimdienst Port 25. Er erzwingt, dass normale ausgehende E-Mails, die für diesen Port bestimmt sind, über ein ISP-SSL-Mail-Relay gesendet werden. Gleichzeitig blockiert er eingehende Nachrichten auf diesem Port für Heimanwender.

Das bedeutet, dass ich zum Senden und Empfangen von E-Mails auf Port 25 normale ausgehende E-Mails (was Ihr Skript versucht) ansmtp.isp.comum sie an den Empfänger auf Port 25 weiterzuleiten, während ein zweiter (Drittanbieter-)Dienst verwendet wird, um eingehende E-Mails von Port 25 an Port XXX weiterzuleiten (wo mein Mailserver tatsächlich lauscht).

Beachten Sie, dass dadurch nicht wirklich das Senden oder Empfangen von E-Mails über andere offene Ports verhindert wird (was zu Testzwecken oder für den persönlichen Gebrauch kein Problem sein kann), da die meisten Mailserver jedoch aus Konsistenzgründen Port 25 verwenden, kann die Verwendung eines Relays auf lange Sicht unumgänglich sein.


Falls es nicht klar genug war: Sie können Tests auch auf anderen Ports als Port 25 durchführen, vorausgesetzt, Sie geben die richtigen Werte in Ihr Skript ein und haben Kontrolle über den empfangenden Mailserver.


verwandte Informationen