Как отправить электронную почту через Django?
в своем settings.py
, у меня есть следующие:
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
мой код электронной почты:
from django.core.mail import EmailMessage
email = EmailMessage('Hello', 'World', to=['user@gmail.com'])
email.send()
конечно, если я настрою сервер отладки через python -m smtpd -n -c DebuggingServer localhost:1025
, Я вижу электронную почту в своем терминале.
однако, как мне отправить электронное письмо не на сервер отладки, а на user@gmail.com?
после прочтения ваших ответов, давайте кое что проясним:
не можете ли вы использовать localhost(простой ubuntu pc) для отправки электронные письма?
Я думал в django 1.3
send_mail()
несколько устарел иEmailMessage.send()
используется вместо этого?
11 ответов
отправить письмо на реальный SMTP-сервер. Если вы не хотите создавать свои собственные, вы можете найти компании, которые будут запускать один для вас, например, сами Google.
Я использую Gmail в качестве SMTP-сервера для Django. Гораздо проще, чем иметь дело с postfix или любым другим сервером. Я не занимаюсь управлением почтовыми серверами.
In settings.py:
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'me@gmail.com'
EMAIL_HOST_PASSWORD = 'password'
Примечание: в 2016 Gmail больше не позволяет это по умолчанию. Вы можете использовать внешнюю службу, такую как Sendgrid, или следовать этому руководству от Google, чтобы уменьшить безопасность, но разрешить эту опцию: https://support.google.com/accounts/answer/6010255
- создать проект:
django-admin.py startproject gmail
-
изменить settings.py с кодом ниже:
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
запустить интерактивный режим:
python manage.py shell
-
импорт модуля EmailMessage:
from django.core.mail import EmailMessage
-
отправить по электронной почте:
email = EmailMessage('Subject', 'Body', to=['your@email.com']) email.send()
для получения дополнительной информации, проверить send_mail
и EmailMessage
функции в документы.
обновление для Gmail
также, если у вас есть проблемы с отправкой электронной почты через Gmail, не забудьте проверить этого руководства из google.
в настройках учетной записи Google перейдите в Security > Account permissions > Access for less secure apps
и включите эту опцию.
и создайте пароль приложения для вашего gmail после повернул на 2-шаг-проверка для он.
затем вы должны использовать app конкретный пароль в настройках. Поэтому измените следующую строку:
EMAIL_HOST_PASSWORD = 'your_email_app_specific_password'
для Django версии 1.7, если вышеуказанные решения не работают, попробуйте следующее
в settings.py добавить
#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
последняя строка сделала трюк для django 1.7
мой сайт размещен на Godaddy, и у меня есть частная электронная почта, зарегистрированная на том же. Это настройки, которые работали для меня:
In 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
в консоли:
from django.core.mail import EmailMessage
email = EmailMessage('Subject', 'Body', to=['def@domain.com'])
email.send()
затем я получил " 1 " как O/P, т. е. успех. И почту я тоже получил. :)
вам нужно использовать smtp в качестве бэкэнда in settings.py
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
Если вы используете бэкэнд в качестве консоли, вы получите вывод в console
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
а также ниже настроек в дополнение
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'urusername@gmail.com'
EMAIL_HOST_PASSWORD = 'password'
Если вы используете в Gmail для этого, setup 2-этап проверки и пароль конкретного приложения и скопируйте и вставьте этот пароль выше значения EMAIL_HOST_PASSWORD.
Я действительно сделал это из Django некоторое время назад. Откройте законную учетную запись GMail и введите учетные данные здесь. Вот мой код -
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
поздно, но:
кроме DEFAULT_FROM_EMAIL
исправить уже упоминалось, и позволяя менее безопасных приложений для доступа к учетной записи, мне пришлось перейти к https://accounts.google.com/DisplayUnlockCaptcha в то время как вошли в аккаунт, чтобы получить Джанго наконец-то подлинность.
Я пошел на этот URL через SSH-туннель на веб-сервер, чтобы убедиться, что IP-адрес был таким же; я не совсем уверен, что это необходимо, но это не повредит. Вы можете сделать это так:ssh -D 8080 -fN <username>@<host>
, затем установите веб-браузер для использования localhost:8080
как прокси SOCKS.
я нашел, что использование SendGrid является самым простым способом настроить отправку электронной почты с Django. Вот как это работает:
- создать учетную запись SendGrid (и проверьте свою электронную почту)
- добавьте в свой
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
и все готово!
отправить по электронной почте:
from django.core.mail import send_mail
send_mail('<Your subject>', '<Your message>', 'from@example.com', ['to@example.com'])
если вы хотите, чтобы Django посылал вам по электронной почте всякий раз, когда есть ошибка внутреннего сервера 500, добавьте следующее settings.py
:
DEFAULT_FROM_EMAIL = 'your.email@example.com'
ADMINS = [('<Your name>', 'your.email@example.com')]
отправка электронной почты с SendGrid бесплатно до 12k писем в месяц.
можно использовать "Test Mail Server Tool" для проверки отправки электронной почты на вашем компьютере или localhost. Google и скачать "Test Mail Server Tool" и настроить его.
затем в settings.py:
EMAIL_BACKEND= 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_PORT = 25
от Shell:
from django.core.mail import send_mail
send_mail('subject','message','sender email',['receipient email'], fail_silently=False)
на В Статье - Джанго в частности:
установить эти переменные в
settings.py
EMAIL_HOST = 'smtp.sendgrid.net'
EMAIL_HOST_USER = 'sendgrid_username'
EMAIL_HOST_PASSWORD = 'sendgrid_password'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
in 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)