Clausola di esclusione della responsabilità
Mi aspetto che almeno alcune delle informazioni seguenti saranno ridondanti per te. Per favore, abbi pazienza. =)
smtplib vs. smptd
Python viene fornito con due moduli per gestire la posta elettronica: smtplib e smtpd . La differenza tra i due è che smtplib
viene utilizzata per inviare e-mail, mentre smptd
viene utilizzata per ricevere e-mail. In questo caso, per l'invio di e-mail, è necessario solo utilizzare smtplib
.
Email con Python 3.6 smtplib
Voglio inviare un'e-mail tramite il mio nome di dominio (ad esempio mio nome@miodominio.nome).
Dato che non hai fornito il tuo script di origine, ho elencato uno script di posta Python 3.6 funzionante come riferimento di seguito:
# 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', 'recipient@example.com'))
msg['From'] = email.utils.formataddr(('Your Name', 'yourname@yourdomain.com'))
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 ('login@example.com', 'Password')
# Dump communication with the receiving server straight to to the console.
# server.set_debuglevel(True)
# 'yourname@yourdomain.com' is our envelope address and specifies the return
# path for bounced emails.
try:
server.sendmail('yourname@yourdomain.com', ['recipient@example.com'], msg.as_string())
finally:
server.quit()
Nota che mentre uso "server" come smtplib
nome dell'oggetto, sei libero di continuare a usare "s" (o qualsiasi altra cosa) nel tuo script. Allo stesso modo, l'uso dei moduli email.util e email.mime non è strettamente necessario ma sono utili per costruire il messaggio finale.
Sono nuovo di SMTP e ho riscontrato molti errori.
Non posso dire quali altri tuoi errori potrebbero essere causati da ma l'output che hai elencato indica che non è stato possibile stabilire una connessione a sigsmileyface.ddns.net sulla porta 25. Le linee chiave sono:
s = smtplib.SMTP('sigsmileyface.ddns.net')
, che per impostazione predefinita porta 25.
La riga finale ConnectionRefusedError: [...] the target machine actively refused it
, che potrebbe indicare un problema di configurazione del firewall o del server di posta.
Risoluzione dei problemi
Controlla il server di posta e la porta
Stabilire che il server a cui ci si sta connettendo ha un server di posta attivo e su quale porta è in esecuzione (di solito la porta 25 per la posta in arrivo).
Nel tuo caso, se hai il controllo di sigsmileyface.ddns.net e stai tentando di inviare e-mail ad esso, dovresti controllare che il tuo server di posta sia impostato correttamente per ricevere posta sulla porta 25. Credo che sendmail
sia il server di posta standard su Pi. È inoltre necessario confermare che la porta non è bloccata da un firewall e che l'eventuale port forwarding è impostato correttamente nel router.
Allo stesso modo, anche se non dovrebbe davvero fare la differenza per la connessione diretta al tuo server di posta, potresti voler impostare i record MX se stai per inviare e / o ricevere e-mail a sigsmileyface.ddns.net .
Controlla la tua connessione
Dovresti ricontrollare che lo script abbia i valori di connessione corretti, sia che tu li specifichi smptlib
nell'oggetto che tramite .connect()
. Si noti che il nome host specificato sarà sempre una connessione diretta al server a cui si desidera inviare posta o a un server di posta intermedio (locale o di altro tipo) che si prevede di trasmettere messaggi per proprio conto.
Mentre sembra improbabile nel tuo caso, dovresti anche essere a conoscenza di qualsiasi nome utente o password necessari per connettersi al server ricevente. Questo è più comune quando si utilizza un altro server per inoltrare la posta, ma vale la pena ricordare.
Verificare se è necessario utilizzare un relè
Assicurarsi che non sia necessario utilizzare un relè di qualche tipo. In breve, alcuni ISP fanno alcune cose per prevenire lo spam che potrebbe richiedere l'uso di speciali server di posta per trasferire o ricevere inizialmente messaggi sulla porta 25.
Ad esempio, l'ISP locale per il mio servizio di casa filtra la porta 25. Forza la normale posta in uscita destinata a questa porta a essere inviata tramite un relay di posta SSL ISP. Allo stesso tempo, blocca i messaggi in arrivo su questa porta per gli utenti domestici.
Ciò significa che per inviare e ricevere e-mail sulla porta 25, devo passare la normale posta in uscita (cosa sta tentando il tuo script) a smtp.isp.com per inoltrarla al destinatario sulla porta 25 durante l'utilizzo di una seconda (di terze parti) servizio per instradare la posta in arrivo dalla porta 25 alla porta XXX (dove il mio server di posta effettivamente ascolta).
Nota che in realtà non impedisce che la posta venga inviata o ricevuta su altre porte aperte (il che può andare bene per test o usi personali) ma poiché la maggior parte dei server di posta utilizza la porta 25 per coerenza, l'uso di un relay può essere una necessità a lungo termine .
Nel caso in cui non fosse abbastanza chiaro, è possibile eseguire test su porte diverse da 25 supponendo di aver inserito i valori corretti nello script e di avere il controllo del server di posta ricevente.
sigsmileyface.ddns.net
? L'errore ti dice che non sta ascoltando la porta a cui hai tentato di accedere. Quindi è probabile che tu abbia un firewall che nega il collegamento o semplicemente non hai una configurazione del server di posta.