it-swarm-es.tech

Enviando correo desde Python usando SMTP

Estoy usando el siguiente método para enviar correo desde Python usando SMTP. ¿Es el método correcto para usar o hay errores que me faltan?

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()
103
Eli Bendersky

El script que uso es bastante similar; Lo publico aquí como un ejemplo de cómo usar los módulos de correo electrónico. * Para generar mensajes MIME; por lo que este script se puede modificar fácilmente para adjuntar imágenes, etc.

Confío en mi ISP para agregar el encabezado de fecha y hora.

Mi ISP requiere que use una conexión smtp segura para enviar correo, confío en el módulo smtplib (que se puede descargar en http://www1.cs.columbia.edu/~db2501/ssmtplib.py )

Al igual que en su script, el nombre de usuario y la contraseña, (dados los valores ficticios a continuación), utilizados para autenticar en el servidor SMTP, están en texto sin formato en la fuente. Esta es una debilidad de seguridad; pero la mejor alternativa depende de lo cuidadoso que necesite (¿quiere?) para protegerlos.

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

#! /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

El método que comúnmente uso ... no es muy diferente pero un poco

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

Eso es

78
madman2890

Además, si desea realizar la autenticación smtp con TLS en lugar de SSL, solo tiene que cambiar el puerto (usar 587) y hacer smtp.starttls (). Esto funcionó para mí:

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

Lo principal que veo es que no estás manejando ningún error: .login () y .sendmail () tienen excepciones documentadas que pueden lanzar, y parece que .connect () debe tener alguna forma de indicar que fue no se puede conectar, probablemente una excepción lanzada por el código de socket subyacente.

6
pjz

el siguiente código funciona bien para mí:

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

Que hay de esto

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

Asegúrate de no tener ningún cortafuegos bloqueando SMTP. La primera vez que intenté enviar un correo electrónico, fue bloqueado tanto por el Firewall de Windows como por McAfee; tardé una eternidad en encontrarlos.

5
Mark Ransom

Debe asegurarse de formatear la fecha en el formato correcto - RFC2822 .

3
Douglas Leeder

El código de ejemplo que hice para enviar correo usando 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

¿Ves todas esas respuestas largas? Por favor, permítame promocionarme haciéndolo todo en un par de líneas.

Importar y Conectar:

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

Entonces es solo una sola línea:

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

En realidad, se cerrará cuando esté fuera del alcance (o se puede cerrar manualmente). Además, le permitirá registrar su nombre de usuario en su llavero de manera que no tenga que escribir su contraseña en su script (¡realmente me molestó antes de escribir yagmail!)

Para el paquete/instalación, consejos y trucos, consulte git o pip , disponible para Python 2 y 3.

2
PascalVKooten

Aquí hay un ejemplo de trabajo 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

puedes hacer asi

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