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=['[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 l'e-mail dans mon terminal.

Cependant, comment envoyer le courrier électronique non pas au serveur de débogage mais à [email protected]?

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?

Derek
la source
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.

Ignacio Vazquez-Abrams
la source
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 = '[email protected]'
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

Jordan
la source
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 = '[email protected]'
    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=['[email protected]'])
    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 .

Alex Jolig
la source
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 = '[email protected]'
EMAIL_HOST_PASSWORD = 'abcdef'
DEFAULT_FROM_EMAIL = '[email protected]'
SERVER_EMAIL = '[email protected]'
EMAIL_PORT = 25
EMAIL_USE_TLS = False

En coque:

from django.core.mail import EmailMessage
email = EmailMessage('Subject', 'Body', to=['[email protected]'])
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?
ibaggu
la source
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 = '[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

Cognoscis
la source
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 = '[email protected]'
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.

Vini.g.fer
la source
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>', '[email protected]', ['[email protected]'])

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

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

yndolok
la source
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']      = '[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
la source
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.

James Johnson
la source
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)
Allan Guwatudde
la source
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.', '[email protected]', ['[email protected]'], fail_silently=False)
Deepak Sharma
la source