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.