Jak wysłać e-mail przez Django?

153

W moim settings.pymam:

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

Mój kod e-mail:

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

Oczywiście, jeśli skonfiguruję serwer do debugowania przez python -m smtpd -n -c DebuggingServer localhost:1025, widzę wiadomość e-mail na moim terminalu.

Jednak w jaki sposób mam wysłać wiadomość e-mail nie na serwer debugowania, ale na adres [email protected]?

Po przeczytaniu twoich odpowiedzi pozwól mi coś wyjaśnić:

  1. Nie możesz używać localhost (prostego komputera ubuntu) do wysyłania wiadomości e-mail?

  2. Myślałem, że w django 1.3 send_mail()jest nieco przestarzałe i EmailMessage.send()jest używane zamiast tego?

Derek
źródło
2
1. Możesz użyć localhost, jeśli masz tam uruchomiony serwer SMTP . 2. Dokładny mechanizm nie ma znaczenia. Ważną częścią jest to, że masz serwer SMTP.
Ignacio Vazquez-Abrams
więc jeśli zainstaluję postfix, mogę wysyłać / odbierać e-maile? Jak skonfigurować Postfix, aby to zrobić?
Derek
6
To pytanie wykracza poza zakres tej witryny.
Ignacio Vazquez-Abrams
4
Jednak SEO prowadzi nas do tej strony, Ignacio.
Phlip

Odpowiedzi:

53

Wyślij wiadomość e-mail do prawdziwego serwera SMTP. Jeśli nie chcesz zakładać własnej, możesz znaleźć firmy, które będą ją prowadzić, na przykład same Google.

Ignacio Vazquez-Abrams
źródło
3
Super, po prostu sam e-mail! Powyższy artykuł wymieniony przez miku był doskonały. Zwróć uwagę na małą poprawkę literówki w komentarzach do artykułu. (I właśnie użyłem mojego zwykłego komputera / lokalnego hosta. Nie ustawiłem wcześniej niczego innego.)
user984003
166

Używam Gmaila jako mojego serwera SMTP dla Django. O wiele łatwiejsze niż radzenie sobie z postfiksem lub jakimkolwiek innym serwerem. Nie zajmuję się zarządzaniem serwerami poczty elektronicznej.

W settings.py:

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

UWAGA : w 2016 roku Gmail domyślnie już na to nie zezwala. Możesz skorzystać z usługi zewnętrznej, takiej jak Sendgrid, lub skorzystać z tego samouczka od Google, aby zmniejszyć bezpieczeństwo, ale zezwolić na tę opcję: https://support.google.com/accounts/answer/6010255

Jordania
źródło
8
czy istnieje alternatywa dla pozostawienia hasła w postaci zwykłego tekstu?
ritratt
1
Możesz skorzystać z usługi e-mail, takiej jak Mandrill, która pozwoli ci zamiast tego użyć hasła, chociaż nie jestem pewien, czy jest to dla ciebie bardziej pomocne. Możesz również użyć klucza szyfrowania zainstalowanego na serwerze i ustawić wiersz w stylu EMAIL_HOST_PASSWORD = my_decrypt ('abi304hubaushl9rchy2y9fd29')
Jordan,
27
umieść go w zmiennej środowiskowej. Następnie EMAIL_HOST_PASSWORD = os.environ ['MY_PASSWORD_THAT_YOU_CANT_KNOW']
Drew Shafer,
1
Użyłem twojego kodu dosłownie. Moje konto Gmail zostało zablokowane po kilku dniach. Mój serwer prawdopodobnie wysyłał mniej niż 20 e-maili dziennie. Czy ktoś miał podobny problem z Google?
Eugene
8
SMTPAuthenticationError i otrzymuję wiadomość e - mail „Udało się zalogować ... z aplikacji, która nie spełnia współczesnych standardów bezpieczeństwa ”. Wygląda na to . Obejście problemu przez „ włączenie dostępu dla mniej bezpiecznych aplikacji ”. I to zadziałało .
Bob Stein
40
  1. Utwórz projekt: django-admin.py startproject gmail
  2. Edytuj settings.py kodem poniżej:

    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    EMAIL_USE_TLS = True
    EMAIL_HOST = 'smtp.gmail.com'
    EMAIL_HOST_USER = '[email protected]'
    EMAIL_HOST_PASSWORD = 'email_password'
    EMAIL_PORT = 587
    
  3. Uruchom tryb interaktywny: python manage.py shell

  4. Importuj moduł EmailMessage:

    from django.core.mail import EmailMessage
  5. Wyślij email:

    email = EmailMessage('Subject', 'Body', to=['[email protected]'])
    email.send()
    

Aby uzyskać więcej informacji, sprawdź send_maili EmailMessagefunkcje w dokumentach .

UPDATE dla Gmaila

Również jeśli masz problemy z wysyłaniem e-maili przez Gmaila, pamiętaj, aby sprawdzić te przewodniki od Google.

W ustawieniach konta Google przejdź do Security > Account permissions > Access for less secure appsi włącz tę opcję.

Utwórz także hasło aplikacji do Gmaila po włączeniu dla niej weryfikacji dwuetapowej .

Następnie w ustawieniach należy użyć hasła aplikacji . Więc zmień następującą linię:

    EMAIL_HOST_PASSWORD = 'your_email_app_specific_password'

Jeśli jesteś zainteresowany wysyłaniem wiadomości e-mail w formacie HTML, sprawdź to .

Alex Jolig
źródło
Podążam
co będzie EMAIL_HOST dla outlookoffice365 ?
Antu
14

Moja witryna jest hostowana Godaddyi mam na niej zarejestrowany prywatny adres e-mail. Oto ustawienia, które działały u mnie:

W 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

W skorupkach:

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

Wtedy otrzymałem „1” jako O / P czyli Sukces. Otrzymałem też pocztę. :)

  • Jakie jest znaczenie domain.com?
ibaggu
źródło
Dzięki, to najłatwiejszy sposób dla starych projektów <Django 1.4
François Constant
13

W przypadku Django w wersji 1.7, jeśli powyższe rozwiązania nie działają, spróbuj następujących rozwiązań

w settings.py dodaj

#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

Ostatnia linia załatwiła sprawę w przypadku django 1.7

Cognoscis
źródło
Ten z jakiegoś powodu nie zadziałał. Ciągle otrzymywałem błąd z błędnym hasłem. Co jest dziwne, ponieważ dostałem dane uwierzytelniające bezpośrednio od Mailgun.
Alex Stewart,
10

Musisz użyć smtp jako zaplecza w settings.py

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

Jeśli używasz zaplecza jako konsoli, otrzymasz dane wyjściowe w konsoli

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

A także poniżej ustawienia dodatkowo

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

Jeśli używasz Gmaila do tego, konfiguracji 2-stopniową weryfikację i hasło konkretnego zastosowania i skopiuj i wklej to hasło w powyżej wartości EMAIL_HOST_PASSWORD.

Vini.g.fer
źródło
5

Zauważyłem, że użycie SendGrid jest najłatwiejszym sposobem skonfigurowania wysyłania wiadomości e-mail za pomocą Django. Oto jak to działa:

  1. Utwórz konto SendGrid (i zweryfikuj swój adres e-mail)
  2. Dodaj do swojego 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

I gotowe!

Aby wysłać e-mail:

from django.core.mail import send_mail
send_mail('<Your subject>', '<Your message>', '[email protected]', ['[email protected]'])

Jeśli chcesz, aby Django wysyłało Ci e-maila za każdym razem, gdy wystąpi wewnętrzny błąd serwera 500, dodaj do swojego settings.py:

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

Wysyłanie e-maili za pomocą SendGrid jest darmowe do 12 000 e-maili miesięcznie.

yndolok
źródło
1
Doskonale, ale nie udało się go uruchomić, używając „apikey” jako nazwy użytkownika zgodnie z dokumentacją, a SendGrid wyświetla trzy tuziny konfiguracji uprawnień na apikey dla prostego sendmaila ...
SYK
3

Właściwie to zrobiłem to od Django jakiś czas temu. Otwórz legalne konto GMail i wprowadź tutaj poświadczenia. Oto mój kod -

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
Srikar Appalaraju
źródło
1
Nie ma potrzeby smtplibbezpośredniego użycia ; Django zajmie się tą częścią za Ciebie.
Ignacio Vazquez-Abrams
o to jest! jak by to było? Tutaj całkowicie send_mail
pomijam
1
send_mail()jak byś to zrobił. Nadal musisz samodzielnie złożyć wiadomość, ale nie musisz się martwić o bity SMTP.
Ignacio Vazquez-Abrams
2

Późno, ale:

Oprócz DEFAULT_FROM_EMAILpoprawki, o której wspominali inni, i umożliwienia mniej bezpiecznym aplikacjom dostępu do konta, musiałem przejść do https://accounts.google.com/DisplayUnlockCaptcha po zalogowaniu się jako konto, o którym mowa, aby Django ostatecznie uwierzytelniło się .

Poszedłem pod ten adres URL przez tunel SSH do serwera WWW, aby upewnić się, że adres IP jest taki sam; Nie jestem do końca pewien, czy to konieczne, ale nie zaszkodzi. Możesz to zrobić w następujący sposób: ssh -D 8080 -fN <username>@<host>a następnie ustaw przeglądarkę internetową, aby używała go localhost:8080jako proxy SOCKS.

James Johnson
źródło
2

Możesz użyć narzędzia „Test Mail Server Tool”, aby przetestować wysyłanie wiadomości e-mail na komputerze lub na hoście lokalnym. Google, pobierz „Test Mail Server Tool” i skonfiguruj.

Następnie w twoim settings.py:

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

Z muszli:

from django.core.mail import send_mail
send_mail('subject','message','sender email',['receipient email'],    fail_silently=False)
Allan Guwatudde
źródło
1

Dla SendGrid - w szczególności Django :

SendGrid Django Docs tutaj

Ustaw te zmienne w

settings.py

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

w views.py

from django.core.mail import send_mail
send_mail('Subject here', 'Here is the message.', '[email protected]', ['[email protected]'], fail_silently=False)
Deepak Sharma
źródło