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

111

В моем 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=['[email protected]'])
email.send()

Конечно, если я настрою сервер отладки через python -m smtpd -n -c DebuggingServer localhost:1025, я могу увидеть письмо в моем терминале.

Однако, как отправить сообщение электронной почты не на сервер отладки, а на адрес [email protected]?

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

  • Не можете ли вы использовать localhost (простой ubuntu pc) для отправки электронной почты?

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

  • 2
    1. Вы можете использовать localhost, если у вас там работает SMTP-сервер . 2. Точный механизм не важен. Важной частью является то, что у вас есть SMTP-сервер.
  • 0
    поэтому, если я установлю postfix, я смогу отправлять / получать электронные письма? Как настроить postfix для этого?
Показать ещё 5 комментариев
Теги:
email
smtp

10 ответов

45
Лучший ответ

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

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

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

В settings.py:

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD = 'password'

ПРИМЕЧАНИЕ. В 2016 году Gmail больше не разрешает это по умолчанию. Вы можете использовать внешнюю службу, например Sendgrid, или можете следовать этому руководству Google для снижения безопасности, но разрешите эту опцию: https://support.google.com/accounts/answer/6010255 p >

  • 11
    Практически самонастраиваемый код, спасибо
  • 8
    Есть ли альтернатива, чтобы оставить свой пароль в виде открытого текста?
Показать ещё 13 комментариев
18
  • Создайте проект: django-admin.py startproject gmail
  • Измените settings.py с кодом ниже:

    EMAIL_USE_TLS = True
    EMAIL_HOST = 'smtp.gmail.com'
    EMAIL_HOST_USER = '[email protected]'
    EMAIL_HOST_PASSWORD = 'yourpassword'
    EMAIL_PORT = 587
    
  • Запуск интерактивного режима: python manage.py shell

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

    from django.core.mail import EmailMessage
    
  • Отправьте электронное письмо:

    email = EmailMessage('Subject', 'Body', to=['[email protected]'])
    email.send()
    
  • 0
    Я следую вашим шагам, я не могу отправить, на электронную почту не приходят письма /
  • 0
    Спасибо! Работал на меня. @ qg_java_17137 пробовали ли вы с конкретным паролем приложения Gmail?
Показать ещё 1 комментарий
12

Для версии 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 = '[email protected]'

#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

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

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

В settings.py:

EMAIL_HOST = 'mail.domain.com'
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD = 'abcdef'
DEFAULT_FROM_EMAIL = '[email protected]'
SERVER_EMAIL = '[email protected]'
EMAIL_PORT = 25
EMAIL_USE_TLS = False

В оболочке:

from django.core.mail import EmailMessage
email = EmailMessage('Subject', 'Body', to=['[email protected]'])
email.send()

Затем я получил "1" в качестве успеха O/P. И я тоже получил почту.:)

  • 0
    Спасибо, это самый простой способ для старых проектов <Django 1.4
10

Вам нужно использовать smtp в качестве backend в 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 = '[email protected]'
EMAIL_HOST_PASSWORD = 'password'

Если для этого используется gmail, установите двухэтапную аутентификацию и специальный пароль для приложения и скопируйте и вставьте этот пароль в EMAIL_HOST_PASSWORD стоимость.

3

Я действительно сделал это из 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']      = '[email protected]'
    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 напрямую; Джанго справится с этой частью за вас.
  • 0
    о, это так! как бы это было? Здесь я полностью игнорирую стандартную функцию django send_mail и использую свою собственную ...
Показать ещё 1 комментарий
2

Я нашел, используя 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>', '[email protected]', ['[email protected]'])

Если вы хотите, чтобы Django отправлял вам сообщения по электронной почте, когда есть ошибка внутреннего внутреннего сервера, добавьте следующее к своему settings.py:

DEFAULT_FROM_EMAIL = '[email protected]'
ADMINS = [('<Your name>', '[email protected]')]

Отправка электронной почты с помощью SendGrid бесплатна до 12 тыс. писем в месяц.

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

Поздно, но:

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

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

1

Вы можете использовать "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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню