Senden einer E-Mail von Python mit dem lokalen Python-SMTP-Server

Ich habe einen Server mit Raspbian Jessie, von dem aus ich E-Mails mit Python senden möchte. Ich habe zwei Module gesehen, die funktionieren könnten, einschließlich smtpd und smtplib.

Ich habe viele Beispiele gesehen, einige davon smtp.gmail.com und localhost. Ich möchte eine E-Mail mit einem bestimmten Domainnamen senden, zum Beispiel: [email protected] Ich bin neu in SMTP und alles, was ich bekommen habe, sind viele Fehler. 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
Author: I say Reinstate Monica, 2018-02-06

1 answers

Haftungsausschluss

Ich erwarte, dass zumindest einige der folgenden Informationen für Sie überflüssig sein werden. Bitte ertragen Sie mit mir. =)

Smtplib vs. smptd

Python enthält zwei Module für den Umgang mit E-Mails - smtplib und smtpd. Der Unterschied zwischen den beiden besteht darin, dass smtplib zum Senden von E-Mails verwendet wird, während smptd zum Empfangen von E-Mails verwendet wird. In diesem Fall sollten Sie zum Senden von E-Mails nur verwenden müssen smtplib.

E-Mail mit Python 3.6 smtplib

Ich möchte eine E-Mail über meinen Domainnamen senden (zum Beispiel [email protected]).

Da Sie Ihr Quellskript nicht bereitgestellt haben, habe ich unten ein funktionierendes Python 3.6-Mailskript 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 Sie, während ich "server" als smtplib Objektnamen verwende, weiterhin "s" (oder was auch immer) in Ihrem eigenen Skript verwenden können. Ebenso die Verwendung der - E-Mail.util und E-Mail.mime Module sind nicht unbedingt erforderlich, aber sie sind hilfreich beim Erstellen der endgültigen Nachricht.

Ich bin neu in SMTP und alles, was ich bekommen habe, sind viele Fehler.

Ich kann nicht sagen, durch was Ihre anderen Fehler verursacht werden könnten, aber die von Ihnen aufgeführte Ausgabe weist auf eine Verbindung zu hin sigsmileyface.ddns.net konnte auf Port 25 nicht eingerichtet werden. Die Schlüsselzeilen sind:

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

  • Die letzte Zeile ConnectionRefusedError: [...] the target machine actively refused it, die auf ein Firewall-oder Mailserver-Konfigurationsproblem hinweisen könnte.

Fehlersuche

Überprüfen Sie Den Mailserver Und Port

Stellen Sie sicher, dass der Server, mit dem Sie eine Verbindung herstellen, über einen aktiven Mailserver verfügt und an welchem Port er ausgeführt wird (normalerweise Port 25 für eingehende E-Mails).

In Ihrem Fall, wenn Sie die Kontrolle über sigsmileyface.ddns.net und versuchen zu senden e-Mails an sie, Sie sollten überprüfen, ob Ihr Mailserver richtig eingerichtet ist, um E-Mails auf Port 25 zu empfangen. Ich glaube, dass sendmail der Standard-Mailserver auf Pi ist. Sie sollten auch bestätigen, dass der Port nicht von einer Firewall blockiert wird und dass die erforderliche Portweiterleitung in Ihrem Router korrekt eingerichtet ist.

In einer ähnlichen Anmerkung sollten Sie zwar keinen Unterschied machen, wenn Sie direkt eine Verbindung zu Ihrem Mailserver herstellen möchten, aber möglicherweise MX-Datensätze einrichten, wenn Sie E-Mails senden möchten an / E-Mail empfangen unter sigsmileyface.ddns.net.

Überprüfen Sie Ihre Verbindung

Sie sollten überprüfen, ob Ihr Skript über die richtigen Verbindungswerte verfügt, unabhängig davon, ob Sie sie im Objekt smptlib oder über .connect() angeben. 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 auf andere Weise), von dem Sie erwarten, dass er Nachrichten in Ihrem Namen weiterleitet.

Während es scheint in Ihrem Fall sollten Sie jedoch auch den Benutzernamen oder die Kennwörter kennen, die für die Verbindung mit dem empfangenden Server erforderlich sind. Dies ist am häufigsten bei der Verwendung eines anderen Servers zum Weiterleiten von E-Mails der Fall, es lohnt sich jedoch, daran zu denken.

Überprüfen Sie, Ob Sie Ein Relais Verwenden Müssen

Stellen Sie sicher, dass Sie kein Relais verwenden müssen. Kurz gesagt, einige ISPs tun bestimmte Dinge, um Spam zu verhindern, die die Verwendung spezieller Mailserver erfordern können, um zunächst Nachrichten am Port zu übertragen oder zu empfangen 25.

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

Dies bedeutet, dass ich zum Senden und Empfangen von E-Mails an Port 25 normale ausgehende E-Mails (was Ihr Skript versucht) an smtp.isp.com um es 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 zuhört).

Beachten Sie, dass E-Mails nicht wirklich daran gehindert werden, auf anderen offenen Ports gesendet oder empfangen zu werden (was für Tests oder persönliche Zwecke in Ordnung sein kann), aber da die meisten E-Mail-Server Port 25 für Konsistenz verwenden, kann die Verwendung eines Relays auf lange Sicht eine Notwendigkeit sein.


Falls es nicht klar genug war, können Sie andere Ports als 25 testen, vorausgesetzt, Sie haben die richtigen Werte in Ihr Skript eingefügt und haben die Kontrolle über den empfangenden Mailserver.


 3
Author: Anaksunaman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-10-09 23:13:04