Enviando um email do Python usando o servidor SMTP Python local

Enviando um email do Python usando o servidor SMTP Python local

Tenho um servidor rodando Raspbian Jessie do qual desejo enviar e-mails usando Python. Eu vi dois módulos que podem funcionar, incluindo smtpde smtplib.

Já vi muitos exemplos, alguns incluindo smtp.gmail.come localhost. Quero enviar um e-mail com um nome de domínio específico, por exemplo: [email protected] Sou novo no SMTP e tudo que recebo são muitos erros. Como eu construiria 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

Responder1

Isenção de responsabilidade

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

smtplib vs.

Python vem com dois módulos para lidar com email —smtplibesmtpd. A diferença entre os dois é que smtplibserve para enviar emails, enquanto smptdé usado para receber emails. Neste caso, para enviar e-mails, você só precisará usar smtplib.

E-mail com Python 3.6 smtplib

Quero enviar um e-mail através do meu nome de domínio (por exemplo[e-mail protegido]).

Como você não forneceu seu script de origem, listei um script de e-mail Python 3.6 funcional 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 smtplibnome do objeto, você pode continuar usando "s" (ou qualquer outro) em seu próprio script. Da mesma forma, o uso doemail.utilee-mail.mimemódulos não são estritamente necessários, mas são úteis na construção da mensagem final.

Sou novo no SMTP e tudo que tenho recebido são muitos erros.

Não posso dizer o que seus outros erros podem ter sido causados, mas a saída que você listou indica uma conexão comsigsmileyface.ddns.netnão pôde ser estabelecido na porta 25. As linhas principais 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 se o servidor ao qual você está se conectando possui um servidor de e-mail ativo e em qual porta ele está sendo executado (geralmente a porta 25 para e-mails recebidos).

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

Da mesma forma, embora não deva realmente fazer diferença na conexão direta ao seu servidor de e-mail, você pode querer configurar registros MX se for enviar/receber e-mails emsigsmileyface.ddns.net.

Verifique sua conexão

Você deve verificar novamente se o seu script possui os valores de conexão corretos, independentemente de você especificá-los no smptlibobjeto ou via .connect(). Observe que o nome do host que você especificar será sempre uma conexão direta com o servidor para o qual você deseja enviar mensagens ou um servidor de correio intermediário (local ou outro) para o qual você espera passar 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 senha necessária para se conectar ao servidor receptor. Isso é mais comum ao usar outro servidor para retransmitir mensagens, mas vale a pena lembrar.

Verifique se você precisa usar um relé

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

Por exemplo, o ISP local do meu serviço doméstico filtra a porta 25. Ele força o envio de mensagens normais destinadas a esta porta a serem enviadas por meio de um retransmissor de correio SSL do ISP. Simultaneamente, bloqueia mensagens recebidas nesta porta para usuários domésticos.

Isso significa que para enviar e receber emails na porta 25, preciso passar emails de saída normais (o que seu script está tentando) parasmtp.isp.compara encaminhá-lo para o destinatário na porta 25 enquanto usa um segundo serviço (de terceiros) para rotear mensagens recebidas da porta 25 para a porta XXX (onde meu servidor de e-mail realmente escuta).

Observe que isso não impede que mensagens sejam enviadas ou recebidas em outras portas abertas (o que pode ser adequado para testes ou usos pessoais), mas como a maioria dos servidores de e-mail usa a porta 25 para consistência, usar um retransmissor pode ser uma necessidade no longo prazo. .


Caso não tenha ficado claro o suficiente, você pode fazer testes em portas diferentes de 25, assumindo que colocou os valores corretos em seu script e tem controle do servidor de recebimento de e-mail.


informação relacionada