Come inviare e-mail tramite Django?


153

Nel mio settings.py, ho il seguente:

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

Il mio codice email:

from django.core.mail import EmailMessage
email = EmailMessage('Hello', 'World', to=['user@gmail.com'])
email.send()

Naturalmente, se installo un server di debug tramite python -m smtpd -n -c DebuggingServer localhost:1025, posso vedere l'e-mail nel mio terminale.

Tuttavia, come posso effettivamente inviare l'e-mail non al server di debug ma a user@gmail.com?

Dopo aver letto le tue risposte, fammi capire bene:

  1. Non puoi usare localhost (semplice PC Ubuntu) per inviare e-mail?

  2. Pensavo che in Django 1.3 send_mail()fosse un po 'deprecato e EmailMessage.send()fosse usato invece?


2
1. Puoi usare localhost se hai un server SMTP in esecuzione lì . 2. L'esatto meccanismo non è importante. La parte importante è che hai un server SMTP.
Ignacio Vazquez-Abrams,

quindi se installo postfix, posso inviare / ricevere e-mail? Come si configura Postfix per farlo?
Derek,

6
Questa domanda va oltre lo scopo di questo sito.
Ignacio Vazquez-Abrams,


4
Eppure SEO ci porta in questa pagina, Ignacio.
Phlip

Risposte:


53

Invia l'e-mail a un vero server SMTP. Se non desideri crearne uno tuo, puoi trovare aziende che ne gestiranno uno per te, come Google stesso.


3
Fantastico, mi sono solo scritto un'e-mail! L'articolo sopra menzionato da Miku era perfetto. Nota la piccola correzione dell'errore di battitura nei commenti dell'articolo. (E ho appena usato il mio normale computer / localhost. Non avevo impostato altro prima d'ora.)
user984003

166

Uso Gmail come mio server SMTP per Django. Molto più facile che gestire postfix o qualunque altro server. Non mi occupo della gestione di server di posta elettronica.

In settings.py:

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'me@gmail.com'
EMAIL_HOST_PASSWORD = 'password'

NOTA : nel 2016 Gmail non lo consente più per impostazione predefinita. Puoi utilizzare un servizio esterno come Sendgrid oppure puoi seguire questo tutorial di Google per ridurre la sicurezza ma consentire questa opzione: https://support.google.com/accounts/answer/6010255


8
esiste un'alternativa a lasciare la password come testo normale?
ritrattato

1
Potresti utilizzare un servizio di posta elettronica come Mandrill che ti permetterà invece di utilizzare una passphrase, anche se non sono sicuro che sia più utile per te. Puoi anche utilizzare una chiave di crittografia installata sul tuo server e rendere la linea simile a EMAIL_HOST_PASSWORD = my_decrypt ('abi304hubaushl9rchy2y9fd29')
Jordan

27
mettilo in una variabile d'ambiente. Quindi, EMAIL_HOST_PASSWORD = os.environ ['MY_PASSWORD_THAT_YOU_CANT_KNOW']
Drew Shafer

1
Ho usato il tuo codice alla lettera. Il mio account Gmail è stato bloccato dopo alcuni giorni. Il mio server probabilmente ha inviato meno di 20 email al giorno. Qualcuno ha avuto un problema simile con Google?
Eugene,

8
SMTPAuthenticationError e io riceviamo un'email " Tentativo di accesso impedito ... da un'app che non soddisfa i moderni standard di sicurezza ". Assomiglia a questo . Soluzione alternativa " attivando l'accesso per app meno sicure ". E ha funzionato .
Bob Stein,

40
  1. Crea un progetto: django-admin.py startproject gmail
  2. Modifica settings.py con il codice seguente:

    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. Esegui modalità interattiva: python manage.py shell

  4. Importa il modulo EmailMessage:

    from django.core.mail import EmailMessage
  5. Invia l'e-mail:

    email = EmailMessage('Subject', 'Body', to=['your@email.com'])
    email.send()

Per ulteriori informazioni, controllare send_maile EmailMessagefunzionalità nei documenti .

AGGIORNAMENTO per Gmail

Inoltre, se hai problemi con l'invio di e-mail tramite Gmail, ricorda di consultare queste guide da Google.

Nelle impostazioni del tuo account Google, vai Security > Account permissions > Access for less secure appse abilita questa opzione.

Crea anche una password specifica per l'app per Gmail dopo aver attivato la verifica in due passaggi .

Quindi dovresti usare la password specifica dell'app nelle impostazioni. Quindi cambia la seguente riga:

    EMAIL_HOST_PASSWORD = 'your_email_app_specific_password'

Inoltre, se sei interessato a inviare e-mail HTML, dai un'occhiata a questo .


Seguo i tuoi passi, non riesco a inviare, l'e-mail non riceve e-mail /
qg_java_17137

quale sarà EMAIL_HOST per outlookoffice365 ?
Antu,

14

Il mio sito è ospitato su Godaddye ho un indirizzo email privato registrato sullo stesso. Queste sono le impostazioni che hanno funzionato per me:

In 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

Nel guscio:

from django.core.mail import EmailMessage
email = EmailMessage('Subject', 'Body', to=['def@domain.com'])
email.send()

Poi ho ottenuto "1" come O / P cioè successo. E ho ricevuto anche la posta. :)

  • Qual è il significato di domain.com?

Grazie, questo è il modo più semplice per i vecchi progetti <Django 1.4
François Constant,

13

Per Django versione 1.7, se le soluzioni precedenti non funzionano, provare quanto segue

in settings.py aggiungi

#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

L'ultima riga ha fatto il trucco per Django 1.7


Questo non ha funzionato per me per qualche motivo. Continuavo a ricevere un errore con la password errata. Il che è strano perché ho ricevuto le credenziali direttamente da Mailgun.
Alex Stewart,

10

Devi usare smtp come backend in settings.py

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

Se usi il backend come console, riceverai l'output nella console

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

E anche sotto le impostazioni in aggiunta

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'urusername@gmail.com'
EMAIL_HOST_PASSWORD = 'password'

Se stai utilizzando gmail per questo, imposta la verifica in due passaggi e la password specifica dell'applicazione e copia e incolla quella password sopra il valore EMAIL_HOST_PASSWORD sopra.


5

Ho scoperto che usare SendGrid è il modo più semplice per impostare l'invio di e-mail con Django. Ecco come funziona:

  1. Crea un account SendGrid (e verifica la tua email)
  2. Aggiungi quanto segue al tuo 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

E sei pronto!

Per inviare e-mail:

from django.core.mail import send_mail
send_mail('<Your subject>', '<Your message>', 'from@example.com', ['to@example.com'])

Se vuoi che Django ti invii un'email ogni volta che si verifica un errore del server interno 500, aggiungi quanto segue a settings.py:

DEFAULT_FROM_EMAIL = 'your.email@example.com'
ADMINS = [('<Your name>', 'your.email@example.com')]

L'invio di e-mail con SendGrid è gratuito fino a 12k e-mail al mese.


1
Eccellente, ma non sono riuscito a farlo funzionare usando 'apikey' come nome utente come da documentazione, e SendGrid elenca tre dozzine di configurazioni di autorizzazione per apikey per un semplice sendmail ...
SYK,

3

Lo avevo già fatto da Django qualche tempo fa. Apri un account GMail legittimo e inserisci le credenziali qui. Ecco il mio codice -

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
Non è necessario utilizzare smtplibdirettamente; Django gestirà quella parte per te.
Ignacio Vazquez-Abrams,

Oh è! come sarebbe? Qui send_mail
ignoro

1
send_mail()è come lo faresti. Devi ancora assemblare il messaggio da solo, ma non devi preoccuparti dei bit SMTP.
Ignacio Vazquez-Abrams,

2

In ritardo, ma:

Oltre alla DEFAULT_FROM_EMAILcorrezione menzionata da altri, e consentendo alle app meno sicure di accedere all'account, ho dovuto accedere a https://accounts.google.com/DisplayUnlockCaptcha mentre ho effettuato l'accesso come account in questione per consentire a Django di autenticarsi finalmente .

Sono andato a quell'URL attraverso un tunnel SSH al server Web per assicurarmi che l'indirizzo IP fosse lo stesso; Non sono del tutto sicuro che sia necessario, ma non può far male. Puoi farlo in questo modo:, ssh -D 8080 -fN <username>@<host>quindi imposta il tuo browser Web da utilizzare localhost:8080come proxy SOCKS.


2

È possibile utilizzare "Test Mail Server Tool" per testare l'invio di e-mail sul proprio computer o localhost. Google e scarica "Test Mail Server Tool" e configuralo.

Quindi in settings.py:

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

Dalla shell:

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

1

Per SendGrid - In particolare Django :

SendGrid Django Docs qui

Imposta queste variabili 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.', 'from@example.com', ['to@example.com'], fail_silently=False)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.