Python 3 - Enviando e-mail usando SMTP
O protocolo SMTP (Simple Mail Transfer Protocol) é um protocolo que controla o envio de e-mail e o roteamento de e-mail entre servidores de e-mail.
Python fornece smtplib módulo, que define um objeto de sessão de cliente SMTP que pode ser usado para enviar e-mails a qualquer máquina da Internet com um daemon de escuta SMTP ou ESMTP.
Esta é uma sintaxe simples para criar um objeto SMTP, que pode ser usado posteriormente para enviar um e-mail -
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
Aqui está o detalhe dos parâmetros -
host- Este é o host que executa seu servidor SMTP. Você pode especificar o endereço IP do host ou um nome de domínio como tutorialspoint.com. Este é um argumento opcional.
port- Se você estiver fornecendo um argumento de host , será necessário especificar uma porta, onde o servidor SMTP está escutando. Normalmente, essa porta seria 25.
local_hostname- Se o seu servidor SMTP estiver sendo executado em sua máquina local, você pode especificar apenas a opção localhost .
Um objeto SMTP tem um método de instância chamado sendmail, que normalmente é usado para fazer o trabalho de enviar uma mensagem. Leva três parâmetros -
O remetente - uma string com o endereço do remetente.
Os destinatários - uma lista de strings, uma para cada destinatário.
A mensagem - uma mensagem como uma string formatada conforme especificado nas várias RFCs.
Exemplo
Esta é uma maneira simples de enviar um e-mail usando o script Python. Experimente uma vez -
#!/usr/bin/python3
import smtplib
sender = '[email protected]'
receivers = ['[email protected]']
message = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: SMTP e-mail test
This is a test e-mail message.
"""
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message)
print "Successfully sent email"
except SMTPException:
print "Error: unable to send email"
Aqui, você colocou um e-mail básico na mensagem, usando aspas triplas, cuidando para formatar os cabeçalhos corretamente. Um e-mail requer umFrom, To, e um Subject cabeçalho, separado do corpo do e-mail por uma linha em branco.
Para enviar o e-mail, use smtpObj para se conectar ao servidor SMTP na máquina local. Em seguida, use o método sendmail junto com a mensagem, o endereço de remetente e o endereço de destino como parâmetros (embora os endereços de e de destino estejam dentro do próprio e-mail, eles nem sempre são usados para encaminhar o e-mail).
Se você não estiver executando um servidor SMTP em sua máquina local, poderá usar o cliente smtplib para se comunicar com um servidor SMTP remoto. A menos que você esteja usando um serviço de webmail (como gmail ou Yahoo! Mail), seu provedor de e-mail deve ter fornecido a você os detalhes do servidor de correio de saída que você pode fornecer, da seguinte maneira -
mail = smtplib.SMTP('smtp.gmail.com', 587)
Envio de um e-mail em HTML usando Python
Quando você envia uma mensagem de texto usando Python, todo o conteúdo é tratado como texto simples. Mesmo se você incluir tags HTML em uma mensagem de texto, ela será exibida como texto simples e as tags HTML não serão formatadas de acordo com a sintaxe HTML. No entanto, o Python oferece uma opção para enviar uma mensagem HTML como uma mensagem HTML real.
Ao enviar uma mensagem de e-mail, você pode especificar uma versão Mime, tipo de conteúdo e o conjunto de caracteres para enviar um e-mail em HTML.
Exemplo
A seguir está um exemplo para enviar o conteúdo HTML como um e-mail. Experimente uma vez -
#!/usr/bin/python3
import smtplib
message = """From: From Person <[email protected]>
To: To Person <[email protected]>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test
This is an e-mail message to be sent in HTML format
<b>This is HTML message.</b>
<h1>This is headline.</h1>
"""
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message)
print "Successfully sent email"
except SMTPException:
print "Error: unable to send email"
Envio de anexos por e-mail
Para enviar um e-mail com conteúdo misto, é necessário definir o Content-type cabeçalho para multipart/mixed. Então, o texto e as seções de anexo podem ser especificados dentroboundaries.
Um limite é iniciado com dois hifens seguidos por um número exclusivo, que não pode aparecer na parte da mensagem do e-mail. Um limite final denotando a seção final do e-mail também deve terminar com dois hifens.
Os arquivos anexados devem ser codificados com o pack("m") função para ter codificação de base 64 antes da transmissão.
Exemplo
A seguir está um exemplo, que envia um arquivo /tmp/test.txtcomo um anexo. Experimente uma vez -
#!/usr/bin/python3
import smtplib
import base64
filename = "/tmp/test.txt"
# Read a file and encode it into base64 format
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent) # base64
sender = '[email protected]'
reciever = '[email protected]'
marker = "AUNIQUEMARKER"
body ="""
This is a test email to send an attachement.
"""
# Define the main headers.
part1 = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)
# Define the message action
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit
%s
--%s
""" % (body,marker)
# Define the attachment section
part3 = """Content-Type: multipart/mixed; name=\"%s\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename=%s
%s
--%s--
""" %(filename, filename, encodedcontent, marker)
message = part1 + part2 + part3
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, reciever, message)
print "Successfully sent email"
except Exception:
print ("Error: unable to send email")