Як надіслати електронну пошту через Django?


153

У 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-сервер.
Ігнасіо Васкес-Абрамс

тому якщо я встановлю постфікс, я можу надсилати / отримувати електронні листи? Як налаштувати постфікс для цього?
Дерек

6
Це питання виходить за межі цього веб-сайту.
Ігнасіо Васкес-Абрамс


4
І все ж SEO веде нас на цю сторінку, Ігнасіо.
Фліп

Відповіді:


53

Відправте електронний лист на справжній сервер SMTP. Якщо ви не хочете створити свою власну, тоді ви можете знайти компанії, які керуватимуть для вас, як-от Google.


3
Дивовижно, я просто собі електронний лист! Вищезгадана стаття, згадана Міку, була ідеальною. Зверніть увагу на невелику виправлення помилок у коментарях до статті. (І я щойно використовував звичайний комп'ютер / localhost. Я нічого іншого не встановлював перед рукою.)
user984003

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
чи є альтернатива залишати свій пароль як простой текст?
ritratt

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та увімкніть цю опцію.

Також створіть спеціальний пароль для своєї пошти після ввімкнення двоетапної перевірки .

Тоді слід використовувати специфічний пароль програми в налаштуваннях. Тому змініть наступний рядок:

    EMAIL_HOST_PASSWORD = 'your_email_app_specific_password'

Також якщо вам цікаво надіслати HTML-адресу електронної пошти, перегляньте це .


Я виконую ваші кроки, не можу надіслати, на електронну пошту не отримую електронну пошту /
qg_java_17137

що буде 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, тобто Успіх. І я отримав пошту теж. :)

  • Яке значення домену.com?

Дякую, це найпростіший спосіб для старих проектів <Django 1.4
François Constant

13

Для версії 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


Цей мені чомусь не працював. Я не можу повертати помилку, коли пароль був неправильним. Що дивно, тому що я отримав повноваження безпосередньо з 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

Ви можете використовувати "Інструмент перевірки поштового сервера", щоб перевірити надсилання електронної пошти на ваш комп'ютер або localhost. Google та скачайте "Інструмент перевірки поштового сервера" та налаштуйте його.

Потім у налаштуваннях.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 Docs сюди

Встановіть ці змінні в

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.