web-dev-qa-db-fra.com

Comment envoyer un email via Django?

Dans mon settings.py, j'ai les éléments suivants:

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=['[email protected]'])
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 le courrier électronique dans mon terminal.

Cependant, comment puis-je réellement envoyer l'email non pas au serveur de débogage mais à [email protected]?

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

  1. Ne pouvez-vous pas utiliser localhost (ubuntu pc) pour envoyer des e-mails?

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

143
Derek

Envoyez le courrier électronique à un vrai serveur SMTP. Si vous ne souhaitez pas créer le vôtre, vous pouvez trouver des entreprises qui en gèreront une, comme Google eux-mêmes.

51

J'utilise Gmail comme serveur SMTP pour Django. Beaucoup plus facile que de traiter avec postfix ou un 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 = '[email protected]'
EMAIL_Host_PASSWORD = 'password'

NOTE: En 2016, Gmail ne le permet plus par défaut. Vous pouvez utiliser un service externe tel que Sendgrid ou suivre ce didacticiel de Google pour réduire la sécurité, mais autorisez cette option: https://support.google.com/accounts/answer/6010255

160
Jordan
  1. Créer 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 = '[email protected]'
    EMAIL_Host_PASSWORD = 'email_password'
    EMAIL_PORT = 587
    _
  3. Exécuter le mode interactif: _python manage.py Shell_

  4. Importez le module EmailMessage:

    _from Django.core.mail import EmailMessage
    _
  5. Envoyer le mail:

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

Pour plus d'informations, consultez send_mail et EmailMessage est présent dans documents .

MISE À JOUR POUR Gmail

De plus, si vous rencontrez des problèmes pour envoyer des courriels via Gmail, n'oubliez pas de vérifier ce guide de Google.

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

En outre, créez un mot de passe spécifique à l'application pour votre gmail après activé en 2 étapes de vérification .

Ensuite, vous devez utiliser le 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 êtes intéressé pour envoyer un email HTML, cochez cette case .

32
Alex Jolig

Pour Django version 1.7, si les solutions ci-dessus ne fonctionnent pas, essayez les solutions suivantes

dans settings.py add

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

13
Cognoscis

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

Dans 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

En coquille:

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

Ensuite, j'ai eu "1" comme O/P, c'est-à-dire le succès. Et j'ai aussi reçu le courrier. :)

12
ibaggu

Vous devez utiliser smtp en tant que 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 ci-dessous les paramètres en plus

EMAIL_USE_TLS = True
EMAIL_Host = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_Host_USER = '[email protected]'
EMAIL_Host_PASSWORD = 'password'

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

10
user966588

J'ai trouvé que SendGrid était le moyen le plus simple de configurer l'envoi d'e-mails avec Django. Voilà comment cela 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 tous ensemble!

Pour envoyer un email:

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

Si vous voulez 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 = '[email protected]'
ADMINS = [('<Your name>', '[email protected]')]

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

4
yndolok

Je l'avais déjà fait 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']      = '[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
3
Srikar Appalaraju

Vous pouvez utiliser "Test Mail Server Tool" pour tester l'envoi d'email sur votre machine ou sur votre hôte local. 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 Shell:

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

En retard, mais:

En plus du correctif DEFAULT_FROM_EMAIL 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 alors que vous êtes 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 suis pas tout à fait sûr que cela soit nécessaire, mais ça ne peut pas faire de mal. Vous pouvez le faire comme suit: ssh -D 8080 -fN <username>@<Host>, puis configurez votre navigateur Web pour qu'il utilise localhost:8080 en tant que proxy SOCKS.

2
James Johnson

Pour SendGrid - Django plus précisément:

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.', '[email protected]', ['[email protected]'], fail_silently=False)
1
Deepak Sharma