为什么django send_mail无法成功发送电子邮件且没有错误?

时间:2019-12-09 21:24:22

标签: django smtp gmail sendmail wagtail

我想在Django中使用send_mail,但是它不发送任何电子邮件。这是我的设置:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'MY-GMAIL-USERNAME@gmail.com'
EMAIL_HOST_PASSWORD = 'MY-GMAIL-PASSWORD'
EMAIL_PORT = 465
EMAIL_USE_TLS = False
EMAIL_USE_SSL = True
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
SERVER_EMAIL = DEFAULT_FROM_EMAIL

然后,我运行python manage.py shell

from django.conf import settings
from django.core.mail import send_mail

subject = 'Test Subject'
message = 'Test Message'
email_from = settings.EMAIL_HOST_USER
recipient_list = ['MY-YAHOO-USERNAME@yahoo.com']
send_mail(subject, message, email_from, recipient_list, fail_silently=False)

它不发送电子邮件并打印:

Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: Test Subject
From: MY-GMAIL-USERNAME@gmail.com
To: MY-YAHOO-USERNAME@yahoo.com
Date: Mon, 09 Dec 2019 21:02:16 -0000
Message-ID: <157592533640.18842.5494330274157836181@thinkpad-e560>

Test Message
-------------------------------------------------------------------------------
1

似乎没有错误。为什么不发送电子邮件?怎么了?为什么它没有记录任何错误?

this page之后,我尝试了一种纯python的方式,并且效果很好:

import smtplib, ssl

smtp_server = "smtp.gmail.com"
port = 465
sender_email = "MY-GMAIL-USERNAME@gmail.com"
password = 'MY-GMAIL-PASSWORD'
receiver_email = 'MY-YAHOO-USERNAME@yahoo.com'
context = ssl.create_default_context()
server = smtplib.SMTP_SSL("smtp.gmail.com", port, context=context)
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, 'Test Message')

正如我提到的,这种纯python方式很好用!我很困惑。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

感谢@IainShelvington和@ivissani,我知道了。我在django顶部使用wagtail cms,并使用“ wagtail start mysite”创建了项目。有关更多信息,请参见this

在w标准项目结构中,存在base.py,dev.py和production.py而不是settings.py。

电子邮件设置位于base.py中,但在dev.py中,EMAIL_BACKEND被覆盖。当您使用w创建django项目时,这是dev.py:

from .base import *

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'MY-SITE-KEY'

# SECURITY WARNING: define the correct hosts in production!
ALLOWED_HOSTS = ['*'] 

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


try:
    from .local import *
except ImportError:
    pass

所以我通过从dev.py中删除EMAIL_BACKEND来解决了问题

答案 1 :(得分:0)

使用以下命令启动您的python文件:

body.ios {
    .side-nav {
        top: var(--ios-50-vh);
    }
    section {
        min-height: var(--ios-100-vh);
        .container {
            position: relative;
            padding-top: var(--ios-10-vh);
            padding-bottom: var(--ios-10-vh);
        }
    }
}

import os import sys import django django.setup() # rest of your code 导入设置,但未将其设置为os环境。

from django.conf import settings-这也应该起作用