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:
Ne pouvez-vous pas utiliser localhost (ubuntu pc) pour envoyer des e-mails?
Je pensais que dans Django 1.3 send_mail()
est quelque peu obsolète et que EmailMessage.send()
est utilisé à la place?
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.
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
Django-admin.py startproject gmail
_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
_
Exécuter le mode interactif: _python manage.py Shell
_
Importez le module EmailMessage:
_from Django.core.mail import EmailMessage
_
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 .
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
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. :)
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.
J'ai trouvé que SendGrid était le moyen le plus simple de configurer l'envoi d'e-mails avec Django. Voilà comment cela fonctionne:
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.
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
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)
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.
Pour SendGrid - Django plus précisément:
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)