¿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=['user@gmail.com'])
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 user@gmail.com?

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.


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.


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 = 'me@gmail.com'
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


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 = 'youremail@gmail.com'
    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=['your@email.com'])
    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 .


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 = 'abc@domain.com'
EMAIL_HOST_PASSWORD = 'abcdef'
DEFAULT_FROM_EMAIL = 'abc@domain.com'
SERVER_EMAIL = 'abc@domain.com'
EMAIL_PORT = 25
EMAIL_USE_TLS = False

Con cáscara:

from django.core.mail import EmailMessage
email = EmailMessage('Subject', 'Body', to=['def@domain.com'])
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?

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 = 'sender@gmail.com'

#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


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 = 'urusername@gmail.com'
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.


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>', 'from@example.com', ['to@example.com'])

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 = 'your.email@example.com'
ADMINS = [('<Your name>', 'your.email@example.com')]

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


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']      = 'you@gmail.com'
    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

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.


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)

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.', 'from@example.com', ['to@example.com'], fail_silently=False)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.