web-dev-qa-db-fra.com

Django envoie un email

Je sais qu'il y a 20 questions similaires aux miennes, mais cela fait maintenant plus d'une journée que je tente d'obtenir un courrier électronique pour travailler avec Django. 

Je reçois cette erreur: [Errno 111] Connection refused lorsque j'essaie d'envoyer un courrier électronique

C’est là que je crée le courrier électronique et que je tente de l’envoyer à mon avis:

try:
    msg = EmailMessage(subject, message, from_email, [receiver])
    msg.content_subtype = "html"
    msg.send()

Mon fichier de paramètres est le suivant:

EMAIL_Host = "localhost"
DEFAULT_FROM_EMAIL = "[email protected]"
EMAIL_PORT = 25
EMAIL_BACKEND = "Django.core.mail.backends.smtp.EmailBackend"

J'ai essayé d'envoyer des tests en utilisant python -m smtpd -n -c DebuggingServer localhost:1025 et j'ai eu du succès, mais quand il s'agit de le faire pour de vrai, pas de succès. 

Lorsque j'essaie de faire un send_mail depuis le shell, j'obtiens cette trace:

>>> from Django.core.mail import send_mail
>>> send_mail('Test', 'Test', '[email protected]', ['[email protected]'])
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.6/dist-packages/Django/core/mail/__init__.py", line 61, in send_mail
    connection=connection).send()
  File "/usr/local/lib/python2.6/dist-packages/Django/core/mail/message.py", line 251, in send
    return self.get_connection(fail_silently).send_messages([self])
  File "/usr/local/lib/python2.6/dist-packages/Django/core/mail/backends/smtp.py", line 79, in send_messages
    new_conn_created = self.open()
  File "/usr/local/lib/python2.6/dist-packages/Django/core/mail/backends/smtp.py", line 42, in open
    local_hostname=DNS_NAME.get_fqdn())
  File "/usr/lib/python2.6/smtplib.py", line 239, in __init__
    (code, msg) = self.connect(Host, port)
  File "/usr/lib/python2.6/smtplib.py", line 295, in connect
    self.sock = self._get_socket(Host, port, self.timeout)
  File "/usr/lib/python2.6/smtplib.py", line 273, in _get_socket
    return socket.create_connection((port, Host), timeout)
  File "/usr/lib/python2.6/socket.py", line 561, in create_connection
    raise error, msg
error: [Errno 111] Connection refused

Je semble juste ne pas être aller nulle part avec cela. Toute aide ou conseil serait très apprécié. Merci

De plus, s'il y a autre chose que vous aimeriez voir, commentez-le.

31
Luke

Essayez-vous d'utiliser un compte Gmail? Peut-être essayez-vous alors:

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

Puis essayez test (Django <1.4) en

python manage.py Shell
>>> from Django.core.mail import send_mail
>>> send_mail('test email', 'hello world', to=['[email protected]'])

Et si vous utilisez Django 1.4, utilisez ceci:

python manage.py Shell
>>> from Django.core.mail import send_mail
>>> send_mail('test email', 'hello world', '[email protected]', ['[email protected]'])

Si vous n'utilisez pas de compte Gmail et que vous rencontrez toujours des problèmes, essayez simplement d'ajouter les EMAIL_Host_USER et EMAIL_Host_PASSWORD à ce que vous avez .. .. Si vous avez toujours des problèmes, votre réseau vous bloque peut-être. Pare-feu sur votre système d'exploitation ou votre routeur.

Merci à knite pour la syntaxe mise à jour. Envoyez-lui un +1 et merci à pranavk de m'avoir informé du changement de syntaxe dans Django 1.4

68
darren

Créez d'abord un mot de passe spécifique à l'application

  1. Consultez votre page de sécurité du compte Google .
  2. Dans la zone 2-Step Verification, cliquez sur Settings (s'il n'existe aucun lien de paramètres, vous pouvez en créer un nouveau. Vous pouvez ignorer les étapes 3 et 4).
  3. Cliquez sur l'onglet pour App-specific passwords.
  4. Cliquez sur Manage your application specific passwords.
  5. Dans la section Application-specific passwords, entrez un nom descriptif pour l'application que vous souhaitez autoriser, tel que "Django gmail", puis cliquez sur le bouton Generate application-specific password.
  6. notez le mot de passe. par exemple: smbumqjiurmqrywn password

Ajoutez ensuite les valeurs appropriées à settings.py:

EMAIL_Host = 'smtp.gmail.com'
EMAIL_Host_USER = '[email protected]'
EMAIL_Host_PASSWORD = 'Application spectific password(for eg: smbumqjiurmqrywn)'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

Vous pouvez utiliser le shell pour le tester:

python manage.py Shell
>>> from Django.core.mail import send_mail
>>> send_mail('Test', 'This is a test', '[email protected]', ['[email protected]'],
     fail_silently=False)
35
simple_human

@mongoose_za a une excellente réponse, mais la syntaxe est un peu différente dans Django 1.4+.

Au lieu de:

send_mail('test email', 'hello world', to=['[email protected]'])

utilisation

send_mail('test email', 'hello world', '[email protected]', ['[email protected]'])

Les quatre premiers arguments sont obligatoires: subject, message, from_email et recipient_list.

17
knite
  1. Activer pop3 dans les paramètres gmail.
  2. créer un mot de passe spécifique à l'application pour cette application Django. (http://support.google.com/accounts/bin/answer.py?hl=fr&answer=185833)
4
ameya1984

Je voudrais éviter d'utiliser GMail. Cela fonctionnera pour quelques courriels, mais après cela, vous constaterez peut-être que tous vos courriels sont rejetés ou stockés dans une boîte de spam. J'ai utilisé le service "SES" d'Amazon avec Django-SES pour résoudre ce problème.

3
Rich Jones

Dans settings.py, utilisez smtp en tant que backend et pas de console

EMAIL_BACKEND = 'Django.core.mail.backends.smtp.EmailBackend'
1
user966588

placez les paramètres minimaux suivants dans le fichier settings.py ou local_settings.py sur votre serveur. 

EMAIL_Host = 'localhost'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

au lieu d'utiliser smtp.gmail.com qui impose beaucoup de limitations, vous pouvez avoir votre propre serveur de messagerie. 

vous pouvez le faire en installant votre propre serveur de messagerie:

Sudo apt-get install sendmail
0
user993563