Envío de un correo electrónico desde Python utilizando el servidor SMTP local de Python

Envío de un correo electrónico desde Python utilizando el servidor SMTP local de Python

Tengo un servidor que ejecuta Raspbian Jessie desde el cual quiero enviar correos electrónicos usando Python. He visto dos módulos que podrían funcionar, incluidos smtpdy smtplib.

He visto muchos ejemplos, algunos incluyen smtp.gmail.comy localhost. Quiero enviar un correo electrónico con un nombre de dominio específico, por ejemplo: [email protected] Soy nuevo en SMTP y lo único que recibo son muchos errores. ¿Cómo crearía el código del servidor SMTP para enviar el correo electrónico?

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

Respuesta1

Descargo de responsabilidad

Espero que al menos parte de la información siguiente le resulte redundante. Por favor, tenga paciencia conmigo. =)

smtplib frente a smptd

Python viene con dos módulos para manejar el correo electrónico:smtplibysmtpd. La diferencia entre los dos es que smtplibse usa para enviar correos electrónicos, mientras que smptdse usa para recibir correos electrónicos. En este caso, para enviar correos electrónicos, sólo debería necesitar utilizar smtplib.

Correo electrónico con Python 3.6 smtplib

Quiero enviar un correo electrónico a través de mi nombre de dominio (por ejemplo[correo electrónico protegido]).

Como no ha proporcionado su secuencia de comandos fuente, a continuación he enumerado una secuencia de comandos de correo Python 3.6 que funciona como referencia a continuación:

# 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()

Tenga en cuenta que si bien uso "servidor" como smtplibnombre de objeto, usted puede continuar usando "s" (o lo que sea) en su propio script. Asimismo, el uso de lacorreo electrónico.utilycorreo electrónico.mimeLos módulos no son estrictamente necesarios pero son útiles para construir el mensaje final.

Soy nuevo en SMTP y lo único que recibo son muchos errores.

No puedo decir a qué se deben sus otros errores, pero el resultado que enumeró indica una conexión asigsmileyface.ddns.netno se pudo establecer en el puerto 25. Las líneas clave son:

  • s = smtplib.SMTP('sigsmileyface.ddns.net'), que por defecto es el puerto 25.

  • La última línea ConnectionRefusedError: [...] the target machine actively refused it, que podría indicar un problema de configuración del firewall o del servidor de correo.

Solución de problemas

Verifique el servidor de correo y el puerto

Establezca que el servidor al que se está conectando tiene un servidor de correo activo y en qué puerto se está ejecutando (generalmente el puerto 25 para el correo entrante).

En su caso, si tiene el control desigsmileyface.ddns.nete intenta enviarle correos electrónicos, debe verificar que su servidor de correo esté configurado correctamente para recibir correo en el puerto 25. Creo que ese sendmailes el servidor de correo estándar en Pi. También debe confirmar que el puerto no esté bloqueado por un firewall y que cualquier reenvío de puerto necesario esté configurado correctamente en su enrutador.

En una nota similar, aunque realmente no debería hacer una diferencia conectarse directamente a su servidor de correo, es posible que desee configurar registros MX si va a enviar o recibir correo electrónico ensigsmileyface.ddns.net.

Verifique su conexión

Debes volver a verificar que tu script tenga los valores de conexión correctos, ya sea que los especifiques en el smptlibobjeto o mediante .connect(). Tenga en cuenta que el nombre de host que especifique siempre será una conexión directa al servidor al que desea enviar correo o un servidor de correo intermediario (local o no) al que espera pasar mensajes en su nombre.

Si bien parece poco probable en su caso, también debe tener en cuenta cualquier nombre de usuario o contraseña necesarios para conectarse al servidor receptor. Esto es más común cuando se utiliza otro servidor para retransmitir correo, pero vale la pena recordarlo.

Compruebe si necesita utilizar un relé

Asegúrese de no necesitar utilizar ningún tipo de relé. En resumen, algunos ISP hacen ciertas cosas para prevenir el spam que puede requerir el uso de servidores de correo especiales para transferir o recibir mensajes inicialmente en el puerto 25.

Por ejemplo, el ISP local de mi servicio local filtra el puerto 25. Obliga a que el correo saliente normal destinado a este puerto se envíe a través de una retransmisión de correo SSL del ISP. Al mismo tiempo, bloquea los mensajes entrantes en este puerto para usuarios domésticos.

Esto significa que para enviar y recibir correo electrónico en el puerto 25, tengo que pasar el correo saliente normal (lo que intenta su script) asmtp.isp.compara reenviarlo al destinatario en el puerto 25 mientras se utiliza un segundo servicio (de terceros) para enrutar el correo entrante desde el puerto 25 al puerto XXX (donde mi servidor de correo realmente escucha).

Tenga en cuenta que eso en realidad no impide que se envíe o reciba correo en otros puertos abiertos (lo que puede estar bien para pruebas o usos personales), pero dado que la mayoría de los servidores de correo usan el puerto 25 para mantener la coherencia, usar un relé puede ser una necesidad a largo plazo. .


En caso de que no haya quedado lo suficientemente claro, puede realizar pruebas en puertos distintos del 25, suponiendo que haya ingresado los valores correctos en su secuencia de comandos y tenga control del servidor de correo receptor.


información relacionada