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:
Ne pouvez-vous pas utiliser localhost(simple ubuntu pc) pour envoyer des e-mails?
Je pensais que dans django 1.3
send_mail()
est quelque peu obsolète etEmailMessage.send()
est utilisé à la place?
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.
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
- Créer un projet:
django-admin.py startproject gmail
-
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
Exécuter en mode interactif:
python manage.py shell
-
Importer le module EmailMessage:
from django.core.mail import EmailMessage
-
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'
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
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. :)
, 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.
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
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.
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:
- créez un compte SendGrid (et vérifiez votre e-mail)
- 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.
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)
Pour SendGrid - Django Spécifiquement:
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)