¿Cómo enviar un correo electrónico a través de Django?

153

En mi settings.py, tengo lo siguiente:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

# Host for sending e-mail.
EMAIL_HOST = 'localhost'

# Port for sending e-mail.
EMAIL_PORT = 1025

# Optional SMTP authentication information for EMAIL_HOST.
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
EMAIL_USE_TLS = False

Mi codigo de correo electronico:

from django.core.mail import EmailMessage
email = EmailMessage('Hello', 'World', to=['[email protected]'])
email.send()

Por supuesto, si configuro un servidor de depuración a través de python -m smtpd -n -c DebuggingServer localhost:1025, puedo ver el correo electrónico en mi terminal.

Sin embargo, ¿cómo envío realmente el correo electrónico no al servidor de depuración sino a [email protected]?

Después de leer tus respuestas, déjame aclarar algo:

  1. ¿No puedes usar localhost (simple ubuntu pc) para enviar correos electrónicos?

  2. Pensé que en django 1.3 send_mail()está algo obsoleto y EmailMessage.send()se usa en su lugar.

Derek
fuente
2
1. Puede usar localhost si tiene un servidor SMTP ejecutándose allí . 2. El mecanismo exacto no es importante. La parte importante es que tiene un servidor SMTP.
Ignacio Vazquez-Abrams
Entonces, si instalo Postfix, ¿puedo enviar / recibir correos electrónicos? ¿Cómo se configura postfix para hacer esto?
Derek
66
Esa pregunta está más allá del alcance de este sitio.
Ignacio Vazquez-Abrams
44
Sin embargo, el SEO nos lleva a esta página, Ignacio.
Phlip

Respuestas:

53

Envíe el correo electrónico a un servidor SMTP real. Si no desea configurar el suyo propio, puede encontrar empresas que ejecuten uno para usted, como Google.

Ignacio Vazquez-Abrams
fuente
3
Impresionante, yo solo un correo electrónico! El artículo anterior mencionado por miku fue perfecto. Tenga en cuenta la pequeña corrección de error tipográfico en los comentarios del artículo. (Y acabo de usar mi computadora / localhost normal. No había configurado nada más antes).
user984003
166

Yo uso Gmail como mi servidor SMTP para Django. Mucho más fácil que tratar con postfix o cualquier otro servidor. No estoy en el negocio de administrar servidores de correo electrónico.

En settings.py:

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD = 'password'

NOTA : En 2016, Gmail ya no lo permite de forma predeterminada. Puede utilizar un servicio externo como Sendgrid o puede seguir este tutorial de Google para reducir la seguridad, pero permita esta opción: https://support.google.com/accounts/answer/6010255

Jordán
fuente
8
¿Existe alguna alternativa para dejar su contraseña como texto sin formato?
ritratt
1
Podrías usar un servicio de correo electrónico como Mandrill que te permitirá usar una frase de contraseña, aunque no estoy seguro de que sea más útil para ti. También puede usar una clave de cifrado instalada en su servidor y hacer que la línea sea algo como EMAIL_HOST_PASSWORD = my_decrypt ('abi304hubaushl9rchy2y9fd29')
Jordania
27
ponlo en una variable de entorno. Luego, EMAIL_HOST_PASSWORD = os.environ ['MY_PASSWORD_THAT_YOU_CANT_KNOW']
Drew Shafer
1
Usé su código literalmente. Mi cuenta de Gmail ha sido bloqueada después de unos días. Mi servidor probablemente envió menos de 20 correos electrónicos por día. ¿Alguien ha tenido un problema similar con google?
eugene
8
SMTPAuthenticationError y recibo un correo electrónico "Intento de inicio de sesión impedido ... de una aplicación que no cumple con los estándares de seguridad modernos ". Se parece a esto . Solución alternativa " activando el acceso para aplicaciones menos seguras ". Y eso funcionó .
Bob Stein el
40
  1. Crea un proyecto: django-admin.py startproject gmail
  2. Edite settings.py con el siguiente código:

    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    EMAIL_USE_TLS = True
    EMAIL_HOST = 'smtp.gmail.com'
    EMAIL_HOST_USER = '[email protected]'
    EMAIL_HOST_PASSWORD = 'email_password'
    EMAIL_PORT = 587
    
  3. Ejecute el modo interactivo: python manage.py shell

  4. Importe el módulo EmailMessage:

    from django.core.mail import EmailMessage
  5. Envía el correo electrónico:

    email = EmailMessage('Subject', 'Body', to=['[email protected]'])
    email.send()
    

Para más información, consultar send_maily EmailMessagecaracterísticas en los documentos .

ACTUALIZACIÓN para Gmail

Además, si tiene problemas para enviar correos electrónicos a través de gmail, recuerde consultar estas guías de google.

En la configuración de su cuenta de Google, vaya Security > Account permissions > Access for less secure appsy habilite esta opción.

También cree una contraseña específica de la aplicación para su gmail después de haber activado la verificación en dos pasos .

Luego, debe usar una contraseña específica de la aplicación en la configuración. Entonces cambie la siguiente línea:

    EMAIL_HOST_PASSWORD = 'your_email_app_specific_password'

Además, si está interesado en enviar un correo electrónico HTML, consulte esto .

Alex Jolig
fuente
Sigo tus pasos, no puedo enviar, el correo electrónico no recibe correo electrónico /
qg_java_17137
¿ Cuál será EMAIL_HOST para outlookoffice365 ?
Antu
14

Mi sitio está alojado Godaddyy tengo un correo electrónico privado registrado en el mismo. Estas son las configuraciones que funcionaron para mí:

En settings.py:

EMAIL_HOST = 'mail.domain.com'
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD = 'abcdef'
DEFAULT_FROM_EMAIL = '[email protected]'
SERVER_EMAIL = '[email protected]'
EMAIL_PORT = 25
EMAIL_USE_TLS = False

Con cáscara:

from django.core.mail import EmailMessage
email = EmailMessage('Subject', 'Body', to=['[email protected]'])
email.send()

Luego obtuve "1" como O / P, es decir, Éxito. Y recibí el correo también. :)

  • ¿Cuál es el significado de domain.com?
ibaggu
fuente
Gracias, esa es la forma más fácil para proyectos antiguos <Django 1.4
François Constant
13

Para Django versión 1.7, si las soluciones anteriores no funcionan, intente lo siguiente

en settings.py agregar

#For email
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

EMAIL_USE_TLS = True

EMAIL_HOST = 'smtp.gmail.com'

EMAIL_HOST_USER = '[email protected]'

#Must generate specific password for your app in [gmail settings][1]
EMAIL_HOST_PASSWORD = 'app_specific_password'

EMAIL_PORT = 587

#This did the trick
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

La última línea hizo el truco para django 1.7

Cognoscis
fuente
Este no funcionó para mí por alguna razón. Seguí recibiendo un error con la contraseña incorrecta. Lo cual es extraño porque obtuve las credenciales directamente de Mailgun.
Alex Stewart
10

Debe usar smtp como back-end en settings.py

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

Si usa el backend como consola, recibirá la salida en la consola

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

Y también debajo de la configuración además

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD = 'password'

Si está utilizando gmail para esto, configure la verificación en dos pasos y la contraseña específica de la aplicación y copie y pegue esa contraseña en el valor superior de EMAIL_HOST_PASSWORD.

Vini.g.fer
fuente
5

Descubrí que usar SendGrid es la forma más fácil de configurar el envío de correo electrónico con Django. Así es como funciona:

  1. Cree una cuenta SendGrid (y verifique su correo electrónico)
  2. Agregue lo siguiente a su settings.py: EMAIL_HOST = 'smtp.sendgrid.net' EMAIL_HOST_USER = '<your sendgrid username>' EMAIL_HOST_PASSWORD = '<your sendgrid password>' EMAIL_PORT = 587 EMAIL_USE_TLS = True

¡Y ya está todo listo!

Para enviar un correo electrónico:

from django.core.mail import send_mail
send_mail('<Your subject>', '<Your message>', '[email protected]', ['[email protected]'])

Si desea que Django le envíe un correo electrónico cada vez que haya un error interno del servidor 500, agregue lo siguiente a su settings.py:

DEFAULT_FROM_EMAIL = '[email protected]'
ADMINS = [('<Your name>', '[email protected]')]

Enviar correos electrónicos con SendGrid es gratis hasta 12k correos electrónicos por mes.

yndolok
fuente
1
Excelente, pero no he podido hacer que funcione usando 'apikey' como nombre de usuario según la documentación, y SendGrid enumera tres docenas de configuraciones de permisos por apikey para un simple sendmail ...
SYK
3

De hecho, había hecho esto desde Django hace un tiempo. Abra una cuenta legítima de GMail e ingrese las credenciales aquí. Aquí está mi código

from email import Encoders
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart

def sendmail(to, subject, text, attach=[], mtype='html'):
    ok = True
    gmail_user = settings.EMAIL_HOST_USER
    gmail_pwd  = settings.EMAIL_HOST_PASSWORD

    msg = MIMEMultipart('alternative')

    msg['From']    = gmail_user
    msg['To']      = to
    msg['Cc']      = '[email protected]'
    msg['Subject'] = subject

    msg.attach(MIMEText(text, mtype))

    for a in attach:
        part = MIMEBase('application', 'octet-stream')
        part.set_payload(open(attach, 'rb').read())
        Encoders.encode_base64(part)
        part.add_header('Content-Disposition','attachment; filename="%s"' % os.path.basename(a))
        msg.attach(part)

    try:
        mailServer = smtplib.SMTP("smtp.gmail.com", 687)
        mailServer.ehlo()
        mailServer.starttls()
        mailServer.ehlo()
        mailServer.login(gmail_user, gmail_pwd)
        mailServer.sendmail(gmail_user, [to,msg['Cc']], msg.as_string())
        mailServer.close()
    except:
        ok = False
    return ok
Srikar Appalaraju
fuente
1
No hay necesidad de usar smtplibdirectamente; Django se encargará de esa parte por ti.
Ignacio Vazquez-Abrams
oh es como seria eso Aquí send_mail
omito por
1
send_mail()así es como lo harías. Todavía necesita ensamblar el mensaje usted mismo, pero no tiene que preocuparse por los bits SMTP.
Ignacio Vazquez-Abrams
2

Tarde, pero:

Además de la DEFAULT_FROM_EMAILsolución que otros han mencionado, y para permitir que aplicaciones menos seguras accedan a la cuenta, tuve que navegar a https://accounts.google.com/DisplayUnlockCaptcha mientras estaba conectado como la cuenta en cuestión para que Django finalmente se autentique .

Fui a esa URL a través de un túnel SSH al servidor web para asegurarme de que la dirección IP fuera la misma; No estoy totalmente seguro de si eso es necesario, pero no puede doler. Puede hacerlo así: ssh -D 8080 -fN <username>@<host>luego configure su navegador web para usarlo localhost:8080como proxy SOCKS.

James Johnson
fuente
2

Puede usar la "Herramienta de prueba del servidor de correo" para probar el envío de correo electrónico en su máquina o localhost. Google y descargue "Test Mail Server Tool" y configúrelo.

Luego en su settings.py:

EMAIL_BACKEND= 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_PORT = 25

De la cáscara:

from django.core.mail import send_mail
send_mail('subject','message','sender email',['receipient email'],    fail_silently=False)
Allan Guwatudde
fuente
1

Para SendGrid - Django Específicamente:

SendGrid Django Docs aquí

Establecer estas variables en

settings.py

EMAIL_HOST = 'smtp.sendgrid.net'
EMAIL_HOST_USER = 'sendgrid_username'
EMAIL_HOST_PASSWORD = 'sendgrid_password'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

en views.py

from django.core.mail import send_mail
send_mail('Subject here', 'Here is the message.', '[email protected]', ['[email protected]'], fail_silently=False)
Deepak Sharma
fuente