Enviando um email do Python usando o servidor SMTP local do Python

4

Eu tenho um servidor rodando o Raspbian Jessie do qual eu quero enviar e-mails usando o Python. Eu vi dois módulos que podem funcionar incluindo smtpd e smtplib .

Eu vi muitos exemplos, alguns incluindo smtp.gmail.com e localhost . Quero enviar um email com um nome de domínio específico, por exemplo: [email protected] Eu sou novo no SMTP e tudo o que tenho recebido é um monte de erros. Como eu criaria o código do servidor SMTP para realmente enviar o email?

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
    
por Josua Robson 06.02.2018 / 07:58

1 resposta

2

Disclaimer

Espero que pelo menos algumas das informações abaixo sejam redundantes para você. Por favor, tenha paciência comigo. =)

smtplib vs. smptd

O Python vem com dois módulos para lidar com e-mail - smtplib e smtpd . A diferença entre os dois é que smtplib é usado para enviar e-mails, enquanto smptd é usado para receber e-mails. Nesse caso, para enviar e-mails, você só precisará usar smtplib .

E-mail com o Python 3.6 smtplib

I want to send an email via my domain name (for example [email protected]).

Como você não forneceu seu script de origem, eu listei um script de correio em Python 3.6 para referência abaixo:

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

Observe que, embora eu use "servidor" como o nome do objeto smtplib , você está livre para continuar usando "s" (ou qualquer outro) em seu próprio script. Da mesma forma, use o email.util e email.mime não são estritamente necessários, mas são úteis para a construção da mensagem final.

I am new to SMTP and all I've been getting are lots of errors.

Não posso dizer com que seus outros erros podem ser causados, mas a saída listada indica que uma conexão com sigsmileyface.ddns.net não pôde ser estabelecida na porta 25. As principais linhas são:

  • s = smtplib.SMTP('sigsmileyface.ddns.net') , cujo padrão é a porta 25.

  • A linha final ConnectionRefusedError: [...] the target machine actively refused it , que pode indicar um problema de configuração do firewall ou do servidor de e-mail.

Solução de problemas

Verifique o servidor de correio e a porta

Estabeleça que o servidor ao qual você está se conectando possui um servidor de correio ativo e em qual porta ele está sendo executado (geralmente a porta 25 para mensagens recebidas).

No seu caso, se você tiver o controle de sigsmileyface.ddns.net e estiver tentando enviar e-mails para ele, verifique se o servidor de e-mail está configurado corretamente para receber e-mails na porta 25 Eu acredito que sendmail é o servidor de e-mail padrão no Pi. Você também deve confirmar que a porta não está bloqueada por um firewall e que qualquer encaminhamento de porta necessário está configurado corretamente em seu roteador.

Em uma nota similar, embora não deva realmente fazer diferença para conectar-se diretamente ao seu servidor de e-mail, você pode querer configurar os registros MX se estiver enviando e-mails para / recebendo e-mails em sigsmileyface .ddns.net .

Verifique sua conexão

Você deve confirmar que seu script possui os valores de conexão corretos, independentemente de você especificá-los no objeto smptlib ou via .connect() . Observe que o nome do host que você especificar sempre será uma conexão direta com o servidor para o qual você deseja enviar e-mails ou um servidor de e-mail intermediário (local ou não) que você espera transmitir mensagens em seu nome.

Embora pareça improvável no seu caso, você também deve estar ciente de qualquer nome de usuário ou senhas necessários para se conectar ao servidor de recebimento. Isso é mais comum quando se usa outro servidor para retransmitir mensagens, mas vale a pena lembrar.

Verifique se você precisa usar um relé

Certifique-se de não precisar usar um relé de algum tipo. Em suma, alguns ISPs fazem certas coisas para evitar spam que pode exigir o uso de servidores de correio especiais para transferir inicialmente ou receber mensagens na porta 25.

Por exemplo, o ISP local do meu serviço inicial filtra a porta 25. Ele força o envio de mensagens de correio normal destinadas a essa porta a ser enviada por meio de um retransmissor de email SSL do ISP. Simultaneamente, bloqueia mensagens recebidas nesta porta para usuários domésticos.

Isso significa que, para enviar e receber e-mails na porta 25, tenho que passar o e-mail de saída normal (o que seu script está tentando) para smtp.isp.com para encaminhá-lo ao destinatário na porta 25 ao usar um segundo serviço (de terceiros) para rotear emails de entrada da porta 25 para a porta XXX (onde meu servidor de e-mail realmente escuta).

Observe que isso não impede que o email seja enviado ou recebido em outras portas abertas (o que pode ser bom para testes ou usos pessoais), mas como a maioria dos servidores de correio usa a porta 25 para consistência, usar um relay pode ser uma necessidade. a longo prazo.

Caso não esteja claro o suficiente, você pode fazer testes em portas diferentes de 25, assumindo que você colocou os valores corretos em seu script e tem controle sobre o servidor de recebimento de mensagens.

por 08.02.2018 / 10:59