Как отправить электронное письмо через Django?


154

По моему у 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?

Прочитав ваши ответы, позвольте мне получить кое-что прямо:

  1. Разве вы не можете использовать localhost (простой компьютер с Ubuntu) для отправки электронной почты?

  2. Я думал, что в Django 1.3 send_mail()несколько устарела и EmailMessage.send()используется вместо этого?


2
1. Вы можете использовать localhost, если у вас там работает SMTP-сервер . 2. Точный механизм не важен. Важной частью является то, что у вас есть SMTP-сервер.
Игнасио Васкес-Абрамс

поэтому, если я установлю postfix, я смогу отправлять / получать электронные письма? Как настроить postfix для этого?
Дерек

6
Этот вопрос выходит за рамки этого сайта.
Игнасио Васкес-Абрамс


5
И все же SEO ведет нас на эту страницу, Игнасио.
Флип

Ответы:


53

Отправьте письмо на настоящий SMTP-сервер. Если вы не хотите настраивать свою собственную систему, то вы можете найти компании, которые будут ее использовать, например, Google.


3
Круто, я просто сама себе по электронной почте! Вышеупомянутая статья, упомянутая Мику, была идеальной. Обратите внимание на небольшую опечатку в комментариях к статье. (И я просто использовал свой обычный компьютер / localhost. Я ничего раньше не настраивал.)
user984003

Какая статья? Не могли бы вы связать это снова?
CGFoX

166

Я использую Gmail в качестве SMTP-сервера для Django. Гораздо проще, чем иметь дело с postfix или любым другим сервером. Я не занимаюсь управлением почтовыми серверами.

В 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.


8
Есть ли альтернатива, чтобы оставить свой пароль в виде открытого текста?
Ритратт

1
Вы можете использовать почтовый сервис, такой как Mandrill, который позволит вам вместо этого использовать парольную фразу, хотя я не уверен, что это будет более полезным для вас. Вы также можете использовать ключ шифрования, установленный на вашем сервере, и сделать строку примерно такой: EMAIL_HOST_PASSWORD = my_decrypt ('abi304hubaushl9rchy2y9fd29')
Джордан,

27
положить его в переменную окружения. Затем EMAIL_HOST_PASSWORD = os.environ ['MY_PASSWORD_THAT_YOU_CANT_KNOW']
Дрю Шафер

1
Я использовал твой код дословно. Моя учетная запись Gmail была заблокирована через несколько дней. Мой сервер, вероятно, отправлял менее 20 писем в день. У кого-нибудь была похожая проблема с Google?
Евгений

8
SMTPAuthenticationError и я получаю электронное письмо " Попытка входа запрещена ... из приложения, которое не соответствует современным стандартам безопасности ". Похоже на это . Обходной путь « включив доступ для менее безопасных приложений ». И это сработало .
Боб Стейн

40
  1. Создать проект: django-admin.py startproject gmail
  2. Отредактируйте 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
  3. Запустить интерактивный режим: python manage.py shell

  4. Импортируйте модуль EmailMessage:

    from django.core.mail import EmailMessage
  5. Отправить письмо:

    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 после включения двухэтапной проверки .

Затем вы должны использовать конкретный пароль приложения в настройках. Поэтому измените следующую строку:

    EMAIL_HOST_PASSWORD = 'your_email_app_specific_password'

Также, если вы заинтересованы в отправке электронной почты в формате HTML, проверьте это .


Я следую твоим шагам, я не могу отправить, на почту не
приходят

что будет EMAIL_HOST для outlookoffice365 ?
Анту

14

Мой сайт размещен, Godaddyи у меня есть личный адрес электронной почты, зарегистрированный на том же. Вот настройки, которые работали для меня:

В 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, т.е. Успех. И я получил почту тоже. :)

  • В чем смысл domain.com?

Спасибо, это самый простой способ для старых проектов <Django 1.4
Франсуа Константа

13

Для 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

Последняя строка сделала трюк для Джанго 1.7


Этот не работал для меня по некоторым причинам. Я продолжал возвращать ошибку с неправильным паролем. Что странно, потому что я получил учетные данные прямо из Mailgun.
Алекс Стюарт

10

Вам нужно использовать smtp в качестве бэкэнда в settings.py

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

Если вы используете бэкэнд в качестве консоли, вы получите вывод в консоли

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 , настройте двухэтапную проверку и пароль для конкретного приложения, а затем скопируйте и вставьте этот пароль в значение EMAIL_HOST_PASSWORD, указанное выше.


5

Я обнаружил, что использование SendGrid - это самый простой способ настроить отправку электронной почты с помощью Django. Вот как это работает:

  1. Создайте учетную запись SendGrid (и подтвердите свой адрес электронной почты)
  2. Добавьте следующее к вашему 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 бесплатна до 12 тысяч электронных писем в месяц.


1
Отлично, но я не смог заставить его работать, используя 'apikey' в качестве имени пользователя согласно документации, и SendGrid перечислил три десятка конфигураций разрешений на apikey для простого sendmail ...
SYK

3

Я действительно сделал это от Джанго некоторое время назад. Откройте законную учетную запись 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

1
Там нет необходимости использовать smtplibнапрямую; Джанго справится с этой частью за вас.
Игнасио Васкес-Абрамс

о, это так! как бы это было? Здесь я полностью send_mail
игнорирую

1
send_mail()как бы вы это сделали Вам все еще нужно собрать сообщение самостоятельно, но вам не нужно беспокоиться о битах SMTP.
Игнасио Васкес-Абрамс

2

Поздно, но:

В дополнение к DEFAULT_FROM_EMAILисправлению, о котором упоминали другие, и позволяющему менее защищенным приложениям получать доступ к учетной записи, мне пришлось перейти на страницу https://accounts.google.com/DisplayUnlockCaptcha во время входа в качестве рассматриваемой учетной записи, чтобы Django окончательно аутентифицировался ,

Я перешел по этому URL через туннель SSH к веб-серверу, чтобы убедиться, что IP-адрес тот же; Я не совсем уверен, если это необходимо, но это не повредит. Вы можете сделать это следующим образом:, а ssh -D 8080 -fN <username>@<host>затем настроить свой веб-браузер на использование localhost:8080в качестве прокси-сервера SOCKS.


2

Вы можете использовать «Test Mail Server Tool» для проверки отправки электронной почты на вашем компьютере или локальном хосте. Google и загрузите «Test Mail Server Tool» и настройте его.

Тогда в вашем settings.py:

EMAIL_BACKEND= 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_PORT = 25

Из оболочки:

from django.core.mail import send_mail
send_mail('subject','message','sender email',['receipient email'],    fail_silently=False)

1

Для SendGrid - Django В частности:

SendGrid Django Документы здесь

Установите эти переменные в

settings.py

EMAIL_HOST = 'smtp.sendgrid.net'
EMAIL_HOST_USER = 'sendgrid_username'
EMAIL_HOST_PASSWORD = 'sendgrid_password'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

в 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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.