Comment envoyer un e-mail via Django?

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'email dans mon terminal.

Cependant, comment envoyer l'e-mail non pas au serveur de débogage mais à user@gmail.com?

Après avoir lu vos réponses, permettez - moi d'obtenir quelque chose de Clair:

  1. Ne pouvez-vous pas utiliser localhost(simple ubuntu pc) 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?

124
demandé sur Paolo Forgia 2011-06-16 08:11:12

11 réponses

Envoyez l'e-mail à un vrai serveur SMTP. Si vous ne voulez pas mettre en place votre propre alors vous pouvez trouver des entreprises qui exécuteront un pour vous, comme Google eux-mêmes.

45
répondu Ignacio Vazquez-Abrams 2011-06-16 04:12:58

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 le domaine de la gestion des 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'

NOTE : 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

155
répondu Jordan 2017-07-14 20:05:50
  1. Créer un projet: django-admin.py startproject gmail
  2. Modifier 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écuter en mode interactif: python manage.py shell

  4. Importer le module EmailMessage:

    from django.core.mail import EmailMessage
    
  5. Envoyer le courriel:

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

Pour plus d'informations, consultez send_mail et EmailMessage caractéristiques de documents.

Mise à jour pour Gmail

Aussi si vous avez des problèmes d'envoi d'e-mail via gmail n'oubliez pas de vérifier Ce guide {[31] } de google.

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

Aussi créez un mot de passe spécifique à l'application pour votre gmail après avoir activé vérification en 2 étapes pour ça.

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

    EMAIL_HOST_PASSWORD = 'your_email_app_specific_password'
19
répondu Alex Jolig 2018-07-02 19:15:09

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

12
répondu Cognoscis 2015-03-23 15:20:52

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 = '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

Dans le shell:

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

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

12
répondu ibaggu 2015-10-19 09:52:25

, Vous devez utiliser smtp comme backend dans settings.py

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

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

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

Et aussi en dessous des 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 Vérification en 2 étapes et Mot de passe spécifique à L'Application et copiez et collez ce mot de passe dans la valeur email_host_password ci-dessus.

10
répondu Vini.g.fer 2017-06-26 15:42:35

Je l'avais fait depuis Django il y a un moment. 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
3
répondu Srikar Appalaraju 2011-06-16 04:30:41

En retard, mais:

En plus de la correction DEFAULT_FROM_EMAIL mentionnée par d'autres, et permettant aux applications moins sécurisées d'accéder au compte, j'ai dû naviguer vers https://accounts.google.com/DisplayUnlockCaptcha {[9] } tout 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 suis pas totalement sûr si c'est nécessaire mais ça ne peut pas faire de mal. Tu peux faire ça comme donc: ssh -D 8080 -fN <username>@<host>, puis configurez votre navigateur web pour utiliser localhost:8080 comme proxy SOCKS.

2
répondu James Johnson 2016-05-27 15:59:04

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 cela fonctionne:

  1. créez un compte SendGrid (et vérifiez votre e-mail)
  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 courriel:

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

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

Envoyer un e-mail avec SendGrid est gratuit jusqu'à 12k e-mails par mois.

2
répondu yndolok 2016-11-25 22:36:10

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

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
répondu Allan Guwatudde 2017-03-23 09:12:43

Pour SendGrid - Django Spécifiquement:

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)
0
répondu Deepak Sharma 2018-04-19 07:29:43