Django发送电子邮件

时间:2011-08-02 15:39:24

标签: python django smtp

我知道有20个类似于我的问题,但我已经尝试了一天以上才能收到与Django合作的电子邮件。

当我尝试发送电子邮件时,我收到此错误:[Errno 111] Connection refused

这是我创建电子邮件并尝试在我的视图中发送它的地方:

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

我的设置文件如下:

EMAIL_HOST = "localhost"
DEFAULT_FROM_EMAIL = "myemail@gmail.com"
EMAIL_PORT = 25
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"

我尝试使用python -m smtpd -n -c DebuggingServer localhost:1025进行测试发送并取得了成功,但是当它归结为真实的时候,没有成功。

当我尝试从shell执行send_mail时,我得到了这个回溯:

>>> from django.core.mail import send_mail
>>> send_mail('Test', 'Test', 'myemail@gmail.com', ['myemail@gmail.com'])
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

我似乎没有随处可见。任何帮助或建议将不胜感激。感谢

此外,如果您还有其他想要查看的内容,请对其进行评论。

7 个答案:

答案 0 :(得分:69)

您是否尝试使用Gmail帐户?也许试试这个:

EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'your-username@gmail.com'
EMAIL_HOST_PASSWORD = 'your-password'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

然后通过

尝试测试(django&lt; 1.4)
python manage.py shell
>>> from django.core.mail import send_mail
>>> send_mail('test email', 'hello world', to=['test@email.com'])

如果你使用django 1.4,请使用:

python manage.py shell
>>> from django.core.mail import send_mail
>>> send_mail('test email', 'hello world', 'your@email.com', ['test@email.com'])

如果您没有使用Gmail帐户但仍然遇到问题,请尝试将EMAIL_HOST_USEREMAIL_HOST_PASSWORD添加到您拥有的内容中。 如果您仍有问题,可能是您的网络阻止了您。您的操作系统或路由器上的防火墙。

Thanks to knite for the updated syntax. Throw him a +1感谢pranavk让我知道django 1.4中的语法变化

答案 1 :(得分:35)

首先创建特定于应用程序的密码

  1. 访问Google Account security page。并点击两步验证: enter image description here

    1. 点击Google Account security page处的App passwordsenter image description here

      1. 创建App,选择Mail并输入名称: enter image description here

        1. 记下App Passwordenter image description here
        2. 然后将适当的值添加到settings.py:

          EMAIL_HOST = 'smtp.gmail.com'
          EMAIL_HOST_USER = 'your-username@gmail.com'
          EMAIL_HOST_PASSWORD = 'Application spectific password(for eg: smbumqjiurmqrywn)'
          EMAIL_PORT = 587
          EMAIL_USE_TLS = True
          

          您可以使用shell来测试它:

          python manage.py shell
          >>> from django.core.mail import send_mail
          >>> send_mail('Test', 'This is a test', 'your@email.com', ['toemail@email.com'],
               fail_silently=False)
          

答案 2 :(得分:17)

@mongoose_za有一个很好的答案,但Django 1.4 +的语法略有不同。

而不是:

send_mail('test email', 'hello world', to=['test@email.com'])

使用

send_mail('test email', 'hello world', 'your@email.com', ['test@email.com'])

前四个参数是必需的:subject,message,from_email和recipient_list。

答案 3 :(得分:4)

  1. 在Gmail设置中启用pop3。
  2. 为此django应用程序创建应用程序专用密码。 (http://support.google.com/accounts/bin/answer.py?hl=en&answer=185833)

答案 4 :(得分:3)

我会避免使用GMail。它适用于几封电子邮件,但在此之后,您可能会发现所有电子邮件都被拒绝或垃圾邮件。我使用Amazon的“SES”服务与Django-SES来解决这个问题。

答案 5 :(得分:1)

在settings.py中,使用 smtp 作为后端,不是控制台

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

答案 6 :(得分:0)

将以下最小设置放在服务器上的settings.py或local_settings.py文件中。

EMAIL_HOST = 'localhost'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

而不是使用smtp.gmail.com,它有很多限制,你可以拥有自己的邮件服务器。

您可以通过安装自己的邮件服务器来实现:

sudo apt-get install sendmail