Comment envoyer un email via Django?


153

Dans mon settings.py, j'ai ce qui suit:

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

Mon code email:

from django.core.mail import EmailMessage
email = EmailMessage('Hello', 'World', to=['user@gmail.com'])
email.send()

Bien sûr, si je configure un serveur de débogage via python -m smtpd -n -c DebuggingServer localhost:1025, je peux voir l'e-mail dans mon terminal.

Cependant, comment envoyer le courrier électronique non pas au serveur de débogage mais à user@gmail.com?

Après avoir lu vos réponses, permettez-moi de clarifier quelque chose:

  1. Vous ne pouvez pas utiliser localhost (simple pc ubuntu) pour envoyer des e-mails?

  2. Je pensais que dans django 1.3 send_mail()est quelque peu obsolète et EmailMessage.send()est utilisé à la place?


2
1. Vous pouvez utiliser localhost si un serveur SMTP y est exécuté . 2. Le mécanisme exact est sans importance. La partie importante est que vous disposez d'un serveur SMTP.
Ignacio Vazquez-Abrams

donc si j'installe postfix, je peux envoyer / recevoir des e-mails? Comment configurer postfix pour faire cela?
Derek

6
Cette question dépasse le cadre de ce site.
Ignacio Vazquez-Abrams


4
Pourtant, le référencement nous amène à cette page, Ignacio.
Phlip du

Réponses:


53

Envoyez l'e-mail à un vrai serveur SMTP. Si vous ne souhaitez pas créer le vôtre, vous pouvez trouver des entreprises qui en gèrent une pour vous, comme Google elles-mêmes.


3
Génial, je viens de moi-même un e-mail! L'article ci-dessus mentionné par miku était parfait. Notez la petite correction de faute de frappe dans les commentaires de l'article. (Et je viens d'utiliser mon ordinateur / hôte local habituel. Je n'avais rien configuré d'autre auparavant.)
user984003

166

J'utilise Gmail comme serveur SMTP pour Django. Beaucoup plus facile que de traiter avec postfix ou tout autre serveur. Je ne suis pas dans la gestion de serveurs de messagerie.

Dans settings.py:

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'me@gmail.com'
EMAIL_HOST_PASSWORD = 'password'

REMARQUE : en 2016, Gmail ne permet plus cela par défaut. Vous pouvez soit utiliser un service externe comme Sendgrid, soit suivre ce tutoriel de Google pour réduire la sécurité mais autoriser cette option: https://support.google.com/accounts/answer/6010255


8
existe-t-il une alternative à laisser votre mot de passe en texte clair?
ritratt

1
Vous pouvez utiliser un service de messagerie comme Mandrill qui vous permettra d'utiliser une phrase de passe à la place, même si je ne suis pas sûr que ce soit plus utile pour vous. Vous pouvez également utiliser une clé de chiffrement installée sur votre serveur et créer une ligne du type EMAIL_HOST_PASSWORD = my_decrypt ('abi304hubaushl9rchy2y9fd29')
Jordanie

27
placez-le dans une variable d'environnement. Ensuite, EMAIL_HOST_PASSWORD = os.environ ['MY_PASSWORD_THAT_YOU_CANT_KNOW']
Drew Shafer

1
J'ai utilisé votre code textuellement. Mon compte Gmail a été bloqué après quelques jours. Mon serveur a probablement envoyé moins de 20 e-mails par jour. Quelqu'un avait-il eu un problème similaire avec Google?
eugene

8
SMTPAuthenticationError et moi recevons un e - mail "Tentative de connexion empêchée ... d'une application qui ne répond pas aux normes de sécurité modernes ". On dirait ça . Solution de contournement en " activant l'accès pour les applications moins sécurisées ". Et cela a fonctionné .
Bob Stein le

40
  1. Créez un projet: django-admin.py startproject gmail
  2. Modifiez settings.py avec le code ci-dessous:

    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. Exécutez le mode interactif: python manage.py shell

  4. Importez le module EmailMessage:

    from django.core.mail import EmailMessage
  5. Envoyez l'e-mail:

    email = EmailMessage('Subject', 'Body', to=['your@email.com'])
    email.send()

Pour plus d'informations, vérifier send_mailet EmailMessagefonctionnalités dans les documents .

MISE À JOUR pour Gmail

Aussi, si vous rencontrez des problèmes pour envoyer des e-mails via gmail, n'oubliez pas de consulter ces guides de Google.

Dans les paramètres de votre compte Google, accédez à Security > Account permissions > Access for less secure appset activez cette option.

Créez également un mot de passe spécifique à l'application pour votre Gmail après avoir activé la vérification en deux étapes pour celui - ci.

Ensuite, vous devez utiliser un mot de passe spécifique à l'application dans les paramètres. Alors changez la ligne suivante:

    EMAIL_HOST_PASSWORD = 'your_email_app_specific_password'

Aussi, si vous souhaitez envoyer un e-mail HTML, vérifiez ceci .


Je suis vos pas, je ne peux pas envoyer, les e-mails ne reçoivent pas d'e-mail /
qg_java_17137

quel sera EMAIL_HOST pour outlookoffice365 ?
Antu

14

Mon site est hébergé sur Godaddyet j'ai un email privé enregistré sur le même. Voici les paramètres qui ont fonctionné pour moi:

Dans 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

En coque:

from django.core.mail import EmailMessage
email = EmailMessage('Subject', 'Body', to=['def@domain.com'])
email.send()

Ensuite, j'ai obtenu "1" comme O / P ie succès. Et j'ai aussi reçu le courrier. :)

  • Quelle est la signification de domain.com?

Merci, c'est le moyen le plus simple pour les anciens projets <Django 1.4
François Constant

13

Pour Django version 1.7, si les solutions ci-dessus ne fonctionnent pas, essayez ce qui suit

dans settings.py ajouter

#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 dernière ligne a fait l'affaire pour django 1.7


Celui-ci n'a pas fonctionné pour moi pour une raison quelconque. J'ai continué à recevoir une erreur avec le mot de passe erroné. Ce qui est étrange car j'ai obtenu les informations d'identification directement de Mailgun.
Alex Stewart

10

Vous devez utiliser smtp comme backend dans settings.py

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

Si vous utilisez le backend comme console, vous recevrez une sortie dans la console

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

Et aussi sous les paramètres en plus

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'urusername@gmail.com'
EMAIL_HOST_PASSWORD = 'password'

Si vous utilisez gmail pour cela, configurez la vérification en 2 étapes et le mot de passe spécifique à l'application, puis copiez et collez ce mot de passe dans la valeur EMAIL_HOST_PASSWORD ci-dessus.


5

J'ai trouvé que l'utilisation de SendGrid était le moyen le plus simple de configurer l'envoi d'e-mails avec Django. Voici comment ça fonctionne:

  1. Créez un compte SendGrid (et vérifiez votre email)
  2. Ajoutez ce qui suit à votre 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

Et vous êtes prêt!

Pour envoyer un e-mail:

from django.core.mail import send_mail
send_mail('<Your subject>', '<Your message>', 'from@example.com', ['to@example.com'])

Si vous souhaitez que Django vous envoie un e-mail chaque fois qu'il y a une erreur de serveur interne 500, ajoutez ce qui suit à votre settings.py:

DEFAULT_FROM_EMAIL = 'your.email@example.com'
ADMINS = [('<Your name>', 'your.email@example.com')]

L'envoi d'e-mails avec SendGrid est gratuit jusqu'à 12 000 e-mails par mois.


1
Excellent, mais je n'ai pas pu le faire fonctionner en utilisant 'apikey' comme nom d'utilisateur selon la documentation, et SendGrid répertorie trois dizaines de configurations d'autorisation par apikey pour un simple sendmail ...
SYK

3

J'avais fait cela depuis Django il y a quelque temps. Ouvrez un compte GMail légitime et entrez les informations d'identification ici. Voici mon code -

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
Il n'est pas nécessaire d'utiliser smtplibdirectement; Django s'occupera de cette partie pour vous.
Ignacio Vazquez-Abrams

oh c'est ça! comment cela serait-il? Ici, je contourne entièrement la send_mailfonction django par défaut et utilise ma propre ...
Srikar Appalaraju

1
send_mail()est comment vous le feriez. Vous devez toujours assembler le message vous-même, mais vous n'avez pas à vous soucier des bits SMTP.
Ignacio Vazquez-Abrams

2

En retard, mais:

En plus du DEFAULT_FROM_EMAILcorrectif que d'autres ont mentionné et permettant aux applications moins sécurisées d'accéder au compte, j'ai dû accéder à https://accounts.google.com/DisplayUnlockCaptcha en étant connecté en tant que compte en question pour que Django s'authentifie enfin. .

Je suis allé à cette URL via un tunnel SSH vers le serveur Web pour m'assurer que l'adresse IP était la même; Je ne sais pas vraiment si c'est nécessaire mais ça ne peut pas faire de mal. Vous pouvez le faire comme ceci:, ssh -D 8080 -fN <username>@<host>puis configurez votre navigateur Web pour l'utiliser localhost:8080comme proxy SOCKS.


2

Vous pouvez utiliser "Test Mail Server Tool" pour tester l'envoi d'e-mails sur votre ordinateur ou localhost. Google et téléchargez "Test Mail Server Tool" et configurez-le.

Puis dans votre settings.py:

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

De la coque:

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

1

Pour SendGrid - Django en particulier:

SendGrid Django Docs ici

Définissez ces variables dans

settings.py

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

dans 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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.