Wie sende ich eine E-Mail über Django?

153

In meinem habe settings.pyich folgendes:

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

Mein E-Mail-Code:

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

Wenn ich einen Debugging-Server über einrichte python -m smtpd -n -c DebuggingServer localhost:1025, kann ich die E-Mail natürlich in meinem Terminal sehen.

Wie sende ich die E-Mail jedoch nicht an den Debugging-Server, sondern an [email protected]?

Lassen Sie mich nach dem Lesen Ihrer Antworten etwas klarstellen:

  1. Können Sie localhost (einfacher Ubuntu-PC) nicht zum Senden von E-Mails verwenden?

  2. Ich dachte in Django 1.3 send_mail()ist etwas veraltet und EmailMessage.send()wird stattdessen verwendet?

Derek
quelle
2
1. Sie können localhost verwenden, wenn dort ein SMTP-Server ausgeführt wird . 2. Der genaue Mechanismus ist unwichtig. Der wichtige Teil ist, dass Sie einen SMTP-Server haben.
Ignacio Vazquez-Abrams
Wenn ich also Postfix installiere, kann ich E-Mails senden / empfangen? Wie richten Sie Postfix dafür ein?
Derek
5
Diese Frage würde den Rahmen dieser Website sprengen.
Ignacio Vazquez-Abrams
4
Doch SEO bringt uns zu dieser Seite, Ignacio.
Phlip

Antworten:

53

Senden Sie die E-Mail an einen echten SMTP-Server. Wenn Sie keine eigenen einrichten möchten, können Sie Unternehmen finden, die eine für Sie betreiben, z. B. Google selbst.

Ignacio Vazquez-Abrams
quelle
3
Super, ich selbst nur eine E-Mail! Der obige Artikel von Miku war perfekt. Beachten Sie die kleine Tippfehlerkorrektur in den Kommentaren des Artikels. (Und ich habe gerade meinen normalen Computer / Localhost benutzt. Ich hatte vorher nichts anderes eingerichtet.)
user984003
166

Ich verwende Google Mail als meinen SMTP-Server für Django. Viel einfacher als mit Postfix oder einem anderen Server umzugehen. Ich beschäftige mich nicht mit der Verwaltung von E-Mail-Servern.

In settings.py:

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

HINWEIS : In 2016 lässt Google Mail dies standardmäßig nicht mehr zu. Sie können entweder einen externen Dienst wie Sendgrid verwenden oder diesem Tutorial von Google folgen, um die Sicherheit zu verringern. Lassen Sie jedoch diese Option zu: https://support.google.com/accounts/answer/6010255

Jordanien
quelle
8
Gibt es eine Alternative, um Ihr Passwort als Klartext zu hinterlassen?
Ritratt
1
Sie könnten einen E-Mail-Dienst wie Mandrill verwenden, mit dem Sie stattdessen eine Passphrase verwenden können, obwohl ich nicht sicher bin, ob dies für Sie hilfreicher ist. Sie können auch einen Verschlüsselungsschlüssel verwenden, der auf Ihrem Server installiert ist, und die Zeile wie EMAIL_HOST_PASSWORD = my_decrypt ('abi304hubaushl9rchy2y9fd29')
Jordan
27
Legen Sie es in eine Umgebungsvariable. Dann EMAIL_HOST_PASSWORD = os.environ ['MY_PASSWORD_THAT_YOU_CANT_KNOW']
Drew Shafer
1
Ich habe Ihren Code wörtlich verwendet. Mein Google Mail-Konto wurde nach einigen Tagen gesperrt. Mein Server hat wahrscheinlich weniger als 20 E-Mails pro Tag gesendet. Hatte jemand ein ähnliches Problem mit Google?
Eugene
8
SMTPAuthenticationError und ich erhalten eine E - Mail "Anmeldeversuch verhindert ... von einer App, die nicht den modernen Sicherheitsstandards entspricht ". Sieht so aus . Problemumgehung durch "Aktivieren des Zugriffs für weniger sichere Apps ". Und das hat funktioniert .
Bob Stein
40
  1. Erstellen Sie ein Projekt: django-admin.py startproject gmail
  2. Bearbeiten Sie settings.py mit dem folgenden Code:

    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. Interaktiven Modus ausführen: python manage.py shell

  4. Importieren Sie das EmailMessage-Modul:

    from django.core.mail import EmailMessage
  5. Senden Sie die E-Mail:

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

Für weitere Informationen, die Prüfung send_mailund EmailMessageFunktionen in Dokumenten .

UPDATE für Google Mail

Auch wenn Sie Probleme beim Senden von E-Mails über Google Mail haben, lesen Sie diese Anleitungen von Google.

Gehen Sie in Ihren Google-Kontoeinstellungen zu Security > Account permissions > Access for less secure appsund aktivieren Sie diese Option.

Auch eine App spezifisches Passwort für Ihre Google Mail erstellen , nachdem Sie haben eingeschaltet 2-Schritt-Prüfung für sie.

Dann sollten Sie in den Einstellungen ein app-spezifisches Passwort verwenden. Ändern Sie also die folgende Zeile:

    EMAIL_HOST_PASSWORD = 'your_email_app_specific_password'

Wenn Sie HTML-E-Mails senden möchten, lesen Sie dies auch .

Alex Jolig
quelle
Ich folge Ihren Schritten, ich kann nicht senden, die an E-Mail erhalten keine E-Mail /
qg_java_17137
Was wird EMAIL_HOST für Outlookoffice365 sein ?
Antu
14

Meine Website wird auf gehostet Godaddyund ich habe eine private E-Mail-Adresse registriert. Dies sind die Einstellungen, die für mich funktioniert haben:

In 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

In der Schale:

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

Dann bekam ich "1" als O / P dh Erfolg. Und ich habe die Post auch erhalten. :) :)

  • Was bedeutet domain.com?
ibaggu
quelle
Danke, das ist der einfachste Weg für alte Projekte <Django 1.4
François Constant
13

Wenn für Django Version 1.7 die oben genannten Lösungen nicht funktionieren, versuchen Sie Folgendes

in settings.py hinzufügen

#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

Die letzte Zeile hat den Trick für Django 1.7 gemacht

Cognoscis
quelle
Dieser hat aus irgendeinem Grund nicht für mich funktioniert. Ich habe immer wieder einen Fehler mit einem falschen Passwort erhalten. Was seltsam ist, weil ich die Anmeldeinformationen direkt von Mailgun erhalten habe.
Alex Stewart
10

Sie müssen SMTP als Backend in settings.py verwenden

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

Wenn Sie das Backend als Konsole verwenden, erhalten Sie eine Ausgabe in der Konsole

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

Und auch unter Einstellungen zusätzlich

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

Wenn Sie mit gmail hierfür Setup 2-Stufen - Verifikation und spezifisches Passwort Anwendung und kopieren und das Passwortes einfügen in über EMAIL_HOST_PASSWORD Wert.

Vini.g.fer
quelle
5

Ich fand, dass die Verwendung von SendGrid der einfachste Weg ist, das Senden von E-Mails mit Django einzurichten. So funktioniert das:

  1. Erstellen Sie ein SendGrid-Konto (und überprüfen Sie Ihre E-Mail- Adresse )
  2. Fügen Sie Folgendes hinzu 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

Und du bist fertig!

So senden Sie eine E-Mail:

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

Wenn Sie möchten, dass Django Ihnen eine E-Mail sendet, wenn ein interner Serverfehler von 500 auftritt, fügen Sie Folgendes hinzu settings.py:

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

Das Senden von E-Mails mit SendGrid ist bis zu 12.000 E-Mails pro Monat kostenlos.

yndolok
quelle
1
Ausgezeichnet, aber nicht in der Lage, es mit 'apikey' als Benutzername gemäß Dokumentation zum Laufen zu bringen, und SendGrid listet drei Dutzend Berechtigungskonfigurationen pro apikey für eine einfache Sendmail auf ...
SYK
3

Ich hatte das tatsächlich vor einiger Zeit von Django aus gemacht. Eröffnen Sie ein legitimes GMail-Konto und geben Sie hier die Anmeldeinformationen ein. Hier ist mein Code -

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
quelle
1
Es besteht keine Notwendigkeit, smtplibdirekt zu verwenden ; Django wird diesen Teil für Sie erledigen.
Ignacio Vazquez-Abrams
Oh ist es! wie wäre das Hier umgehe ich die Standard-Django- send_mailFunktion vollständig und benutze meine eigene ...
Srikar Appalaraju
1
send_mail()so würdest du es machen. Sie müssen die Nachricht immer noch selbst zusammenstellen, müssen sich jedoch nicht um die SMTP-Bits kümmern.
Ignacio Vazquez-Abrams
2

Spät, aber:

Zusätzlich zu dem von DEFAULT_FROM_EMAILanderen erwähnten Fix und dem Zugriff weniger sicherer Apps auf das Konto musste ich zu https://accounts.google.com/DisplayUnlockCaptcha navigieren, während ich als fragliches Konto angemeldet war, damit Django sich endgültig authentifiziert .

Ich ging über einen SSH-Tunnel zum Webserver zu dieser URL, um sicherzustellen, dass die IP-Adresse dieselbe war. Ich bin mir nicht ganz sicher, ob das notwendig ist, aber es kann nicht schaden. Sie können dies folgendermaßen tun: ssh -D 8080 -fN <username>@<host>Stellen Sie dann Ihren Webbrowser so ein, dass er localhost:8080als SOCKS-Proxy verwendet wird.

James Johnson
quelle
2

Sie können das "Test Mail Server Tool" verwenden , um das Senden von E-Mails auf Ihrem Computer oder localhost zu testen. Google und Download "Test Mail Server Tool" und richten Sie es ein.

Dann in Ihrer settings.py:

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

Aus der Schale:

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

Für SendGrid - Django Speziell:

SendGrid Django Docs hier

Setzen Sie diese Variablen in

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.', '[email protected]', ['[email protected]'], fail_silently=False)
Deepak Sharma
quelle