Invio di un'e-mail da Python utilizzando il server SMTP Python locale


4

Ho un server che esegue Raspbian Jessie da cui voglio inviare e-mail utilizzando Python. Ho visto due moduli che potrebbero funzionare tra cui smtpde smtplib.

Ho visto molti esempi, alcuni inclusi smtp.gmail.come localhost. Voglio inviare un'e-mail con un nome di dominio specifico, ad esempio: myname@mydomain.name sono nuovo di SMTP e tutto ciò che ho ricevuto sono molti errori. Come costruirò il codice del server SMTP per inviare effettivamente l'e-mail?

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

3
Prima di tutto devi avere un mailserver in atto e le sue credenziali. Nel passaggio successivo fornirai tali informazioni alle funzioni corrispondenti. Hai effettivamente un server di posta in esecuzione 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.
Seth,

Risposte:


3

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 smtplibviene utilizzata per inviare e-mail, mentre smptdviene 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 smtplibnome 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 sendmailsia 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 smptlibnell'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.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.