it-swarm-pt.tech

Enviando email de Python usando SMTP

Eu estou usando o método a seguir para enviar email de Python usando o SMTP. É o método certo para usar ou há pegadinhas que estão faltando?

from smtplib import SMTP
import datetime

debuglevel = 0

smtp = SMTP()
smtp.set_debuglevel(debuglevel)
smtp.connect('YOUR.MAIL.SERVER', 26)
smtp.login('[email protected]', 'PASSWORD')

from_addr = "John Doe <[email protected]>"
to_addr = "[email protected]"

subj = "hello"
date = datetime.datetime.now().strftime( "%d/%m/%Y %H:%M" )

message_text = "Hello\nThis is a mail from your server\n\nBye\n"

msg = "From: %s\nTo: %s\nSubject: %s\nDate: %s\n\n%s" 
        % ( from_addr, to_addr, subj, date, message_text )

smtp.sendmail(from_addr, to_addr, msg)
smtp.quit()
105
Eli Bendersky

O script que eu uso é bem parecido; Eu coloco aqui como um exemplo de como usar o email. * Módulos para gerar mensagens MIME; então esse script pode ser facilmente modificado para anexar imagens, etc.

Eu confio no meu ISP para adicionar o cabeçalho de data e hora.

Meu ISP requer que eu use uma conexão smtp segura para enviar e-mail, eu confio no módulo smtplib (para download em http://www1.cs.columbia.edu/~db2501/ssmtplib.py )

Como no seu script, o nome de usuário e a senha, (dados valores falsos abaixo), usados ​​para autenticar no servidor SMTP, estão em texto simples na origem. Esta é uma fraqueza de segurança; mas a melhor alternativa depende de quão cuidadoso você precisa (quer?) de protegê-los.

=======================================

#! /usr/local/bin/python


SMTPserver = 'smtp.att.yahoo.com'
sender =     '[email protected]_email_domain.net'
destination = ['[email protected]_email_domain.com']

USERNAME = "USER_NAME_FOR_INTERNET_SERVICE_PROVIDER"
PASSWORD = "PASSWORD_INTERNET_SERVICE_PROVIDER"

# typical values for text_subtype are plain, html, xml
text_subtype = 'plain'


content="""\
Test message
"""

subject="Sent from Python"

import sys
import os
import re

from smtplib import SMTP_SSL as SMTP       # this invokes the secure SMTP protocol (port 465, uses SSL)
# from smtplib import SMTP                  # use this for standard SMTP protocol   (port 25, no encryption)

# old version
# from email.MIMEText import MIMEText
from email.mime.text import MIMEText

try:
    msg = MIMEText(content, text_subtype)
    msg['Subject']=       subject
    msg['From']   = sender # some SMTP servers will do this automatically, not all

    conn = SMTP(SMTPserver)
    conn.set_debuglevel(False)
    conn.login(USERNAME, PASSWORD)
    try:
        conn.sendmail(sender, destination, msg.as_string())
    finally:
        conn.quit()

except:
    sys.exit( "mail failed; %s" % "CUSTOM_ERROR" ) # give an error message
105
Vincent Marchetti

O método que eu geralmente uso ... não é muito diferente, mas um pouco

import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText

msg = MIMEMultipart()
msg['From'] = '[email protected]'
msg['To'] = '[email protected]'
msg['Subject'] = 'simple email in python'
message = 'here is the email'
msg.attach(MIMEText(message))

mailserver = smtplib.SMTP('smtp.gmail.com',587)
# identify ourselves to smtp gmail client
mailserver.ehlo()
# secure our email with tls encryption
mailserver.starttls()
# re-identify ourselves as an encrypted connection
mailserver.ehlo()
mailserver.login('[email protected]', 'mypassword')

mailserver.sendmail('[email protected]','[email protected]',msg.as_string())

mailserver.quit()

É isso aí

79
madman2890

Além disso, se você quiser fazer a autenticação SMTP com TLS em vez de SSL, basta alterar a porta (usar 587) e fazer smtp.starttls (). Isso funcionou para mim:

...
smtp.connect('YOUR.MAIL.SERVER', 587)
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
smtp.login('[email protected]', 'PASSWORD')
...
21
mandric

A principal pegadinha que vejo é que você não está lidando com nenhum erro: .login () e .sendmail () têm exceções documentadas que podem lançar, e parece que o .connect () deve ter alguma maneira de indicar que foi um erro. incapaz de se conectar - provavelmente uma exceção lançada pelo código de soquete subjacente.

6
pjz

o seguinte código está funcionando bem para mim:

import smtplib

to = '[email protected]'
gmail_user = '[email protected]'
gmail_pwd = 'yourpassword'
smtpserver = smtplib.SMTP("smtp.gmail.com",587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo() # extra characters to permit edit
smtpserver.login(gmail_user, gmail_pwd)
header = 'To:' + to + '\n' + 'From: ' + gmail_user + '\n' + 'Subject:testing \n'
print header
msg = header + '\n this is test msg from mkyong.com \n\n'
smtpserver.sendmail(gmail_user, to, msg)
print 'done!'
smtpserver.quit()

Ref: http://www.mkyong.com/python/how-do-send-email-in-python-via-smtplib/

5
Abdul Majeed

O que sobre isso?

import smtplib

SERVER = "localhost"

FROM = "[email protected]"
TO = ["[email protected]"] # must be a list

SUBJECT = "Hello!"

TEXT = "This message was sent with Python's smtplib."

# Prepare actual message

message = """\
From: %s
To: %s
Subject: %s

%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)

# Send the mail

server = smtplib.SMTP(SERVER)
server.sendmail(FROM, TO, message)
server.quit()
5
Satish

Verifique se você não possui nenhum firewall bloqueando o SMTP. A primeira vez que tentei enviar um email, ele foi bloqueado pelo Firewall do Windows e pela McAfee - demorou muito para encontrar os dois.

5
Mark Ransom

Você deve certificar-se de formatar a data no formato correto - RFC2822 .

3
Douglas Leeder

O código de exemplo que eu fiz para enviar e-mail usando o SMTP.

import smtplib, ssl

smtp_server = "smtp.gmail.com"
port = 587  # For starttls
sender_email = "[email protected]"
receiver_email = "[email protected]"
password = "<your password here>"
message = """ Subject: Hi there

This message is sent from Python."""


# Create a secure SSL context
context = ssl.create_default_context()

# Try to log in to server and send email
server = smtplib.SMTP(smtp_server,port)

try:
    server.ehlo() # Can be omitted
    server.starttls(context=context) # Secure the connection
    server.ehlo() # Can be omitted
    server.login(sender_email, password)
    server.sendmail(sender_email, receiver_email, message)
except Exception as e:
    # Print any error messages to stdout
    print(e)
finally:
    server.quit()
2
Hariharan AR

Veja todas aquelas respostas longas? Por favor, permita-me auto promover, fazendo tudo em um par de linhas.

Importar e conectar:

import yagmail
yag = yagmail.SMTP('[email protected]', Host = 'YOUR.MAIL.SERVER', port = 26)

Então é apenas um verso:

yag.send('[email protected]', 'hello', 'Hello\nThis is a mail from your server\n\nBye\n')

Na verdade, ele será fechado quando sair do escopo (ou pode ser fechado manualmente). Além disso, permitirá que você registre seu nome de usuário em seu chaveiro, de modo que você não precise escrever sua senha em seu script (isso realmente me incomodou antes de escrever yagmail!)

Para o pacote/instalação, dicas e truques, por favor, olhe para git ou pip , disponível para ambos Python 2 e 3.

2
PascalVKooten

Aqui está um exemplo de trabalho para Python 3.x

#!/usr/bin/env python3

from email.message import EmailMessage
from getpass import getpass
from smtplib import SMTP_SSL
from sys import exit

smtp_server = 'smtp.gmail.com'
username = '[email protected]'
password = getpass('Enter Gmail password: ')

sender = '[email protected]'
destination = '[email protected]'
subject = 'Sent from Python 3.x'
content = 'Hello! This was sent to you via Python 3.x!'

# Create a text/plain message
msg = EmailMessage()
msg.set_content(content)

msg['Subject'] = subject
msg['From'] = sender
msg['To'] = destination

try:
    s = SMTP_SSL(smtp_server)
    s.login(username, password)
    try:
        s.send_message(msg)
    finally:
        s.quit()

except Exception as E:
    exit('Mail failed: {}'.format(str(E)))
0
Mark

você pode fazer assim

import smtplib
from email.mime.text import MIMEText
from email.header import Header


server = smtplib.SMTP('mail.servername.com', 25)
server.ehlo()
server.starttls()

server.login('username', 'password')
from = '[email protected]'
to = '[email protected]'
body = 'That A Message For My Girl Friend For tell Him If We will go to eat Something This Nigth'
subject = 'Invite to A Diner'
msg = MIMEText(body,'plain','utf-8')
msg['Subject'] = Header(subject, 'utf-8')
msg['From'] = Header(from, 'utf-8')
msg['To'] = Header(to, 'utf-8')
message = msg.as_string()
server.sendmail(from, to, message)
0
Skiller Dz