Como enviar email via Django?

153

No meu settings.py, eu tenho o seguinte:

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

Meu código de email:

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

Obviamente, se eu configurar um servidor de depuração via python -m smtpd -n -c DebuggingServer localhost:1025, posso ver o email no meu terminal.

No entanto, como realmente envio o email não para o servidor de depuração, mas para [email protected]?

Depois de ler suas respostas, deixe-me esclarecer uma coisa:

  1. Você não pode usar o localhost (simples ubuntu pc) para enviar e-mails?

  2. Eu pensei que no django 1.3 send_mail()é um pouco obsoleto e EmailMessage.send()é usado em vez disso?

Derek
fonte
2
1. Você pode usar o host local se tiver um servidor SMTP em execução lá . 2. O mecanismo exato não é importante. A parte importante é que você tem um servidor SMTP.
Ignacio Vazquez-Abrams
então, se eu instalar o postfix, posso enviar / receber e-mails? Como você configura o postfix para fazer isso?
Derek
6
Essa questão está além do escopo deste site.
Ignacio Vazquez-Abrams
4
No entanto, o SEO nos leva a esta página, Ignacio.
Phlip 11/11/2015

Respostas:

53

Envie o email para um servidor SMTP real. Se você não deseja configurar por conta própria, pode encontrar empresas que administrarão uma para você, como o próprio Google.

Ignacio Vazquez-Abrams
fonte
3
Impressionante, eu sou apenas um email! O artigo acima mencionado por miku foi perfeito. Observe a pequena correção de erros de digitação nos comentários do artigo. (E eu só usei meu regulares computador / localhost eu não tinha definido qualquer outra coisa antes de mão..)
user984003
166

Eu uso o Gmail como meu servidor SMTP para o Django. Muito mais fácil do que lidar com o postfix ou qualquer outro servidor. Não estou no negócio de gerenciar servidores de email.

Em settings.py:

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

NOTA : Em 2016, o Gmail não permite mais isso por padrão. Você pode usar um serviço externo como o Sendgrid ou pode seguir este tutorial do Google para reduzir a segurança, mas permitir esta opção: https://support.google.com/accounts/answer/6010255

Jordânia
fonte
8
existe uma alternativa para deixar sua senha como texto simples?
Ritratt
1
Você pode usar um serviço de e-mail como o Mandrill que permitirá que você use uma frase secreta, embora não tenha certeza de que seja mais útil para você. Você também pode usar uma chave de criptografia que está instalado no seu servidor e fazer a linha de algo como EMAIL_HOST_PASSWORD = my_decrypt ( 'abi304hubaushl9rchy2y9fd29')
Jordan
27
coloque-o em uma variável de ambiente. Então, EMAIL_HOST_PASSWORD = os.environ ['MY_PASSWORD_THAT_YOU_CANT_KNOW']
Drew Shafer
1
Eu usei o seu código literalmente. Minha conta do Gmail foi bloqueada após alguns dias. Meu servidor provavelmente enviou menos de 20 e-mails por dia. Alguém já teve um problema semelhante com o google?
Eugene
8
SMTPAuthenticationError e recebemos um email " Tentativa de login impedida ... de um aplicativo que não atende aos padrões de segurança modernos ". Parece com isso . Solução alternativa " ativando o acesso a aplicativos menos seguros ". E isso funcionou .
Bob Stein
40
  1. Crie um projeto: django-admin.py startproject gmail
  2. Edite settings.py com o código abaixo:

    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. Execute o modo interativo: python manage.py shell

  4. Importe o módulo EmailMessage:

    from django.core.mail import EmailMessage
  5. Envie o email:

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

Para mais informações, verifique send_maile EmailMessagerecursos nos documentos .

ATUALIZAÇÃO para Gmail

Além disso, se você tiver problemas para enviar e-mail via gmail, lembre-se de verificar os guias no google.

Nas configurações da sua conta do Google, acesse Security > Account permissions > Access for less secure appse ative esta opção.

Crie também uma senha específica do aplicativo para o seu gmail após ativar a verificação em duas etapas .

Em seguida, você deve usar a senha específica do aplicativo nas configurações. Então mude a seguinte linha:

    EMAIL_HOST_PASSWORD = 'your_email_app_specific_password'

Além disso, se você estiver interessado em enviar email em HTML, verifique isso .

Alex Jolig
fonte
Sigo
o que será EMAIL_HOST para o outlookoffice365 ?
Antu
14

Meu site está hospedado Godaddye eu tenho um email particular registrado no mesmo. Estas são as configurações que funcionaram para mim:

Em 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

Com casca:

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

Então recebi "1" como O / P, ou seja, Sucesso. E também recebi o correio. :)

  • Qual é o significado de domain.com?
ibaggu
fonte
Obrigado, essa é a maneira mais fácil para projetos antigos <Django 1.4
François Constant
13

Para o Django versão 1.7, se as soluções acima não funcionarem, tente o seguinte

em settings.py add

#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

A última linha fez o truque para o django 1.7

Cognoscis
fonte
Este não funcionou para mim por algum motivo. Eu continuava recebendo um erro com a senha errada. O que é estranho, porque eu recebi as credenciais diretamente da Mailgun.
Alex Stewart
10

Você precisa usar o smtp como back-end em settings.py

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

Se você usar o back-end como console, receberá saída no console

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

E também abaixo das configurações, além

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

Se você estiver usando o gmail , configure a verificação em duas etapas e a senha específica do aplicativo e copie e cole essa senha acima do valor EMAIL_HOST_PASSWORD.

Vini.g.fer
fonte
5

Eu achei que o SendGrid era a maneira mais fácil de configurar o envio de email com o Django. Veja como funciona:

  1. Crie uma conta SendGrid (e verifique seu email)
  2. Adicione o seguinte ao seu 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 está tudo pronto!

Para enviar email:

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

Se você deseja que o Django lhe envie um e-mail sempre que houver um erro interno de 500 servidores, adicione o seguinte ao seu settings.py:

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

O envio de e-mail com o SendGrid é gratuito até 12 mil e-mails por mês.

yndolok
fonte
1
Excelente, mas não tem poder para fazê-lo funcionar usando 'apiKey' como nome de usuário de acordo com a documentação, e lista SendGrid três configurações dezenas de permissão por apiKey para uma sendmail simples ...
SYK
3

Eu já havia feito isso no Django há um tempo. Abra uma conta legítima do GMail e insira as credenciais aqui. Aqui está o meu código -

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
fonte
1
Não há necessidade de usar smtplibdiretamente; O Django cuidará dessa parte para você.
Ignacio Vazquez-Abrams
Ah, é! como seria isso? Aqui eu send_mail
ignoro
1
send_mail()é como você faria isso. Você ainda precisa montar a mensagem, mas não precisa se preocupar com os bits SMTP.
Ignacio Vazquez-Abrams
2

Tarde, mas:

Além da DEFAULT_FROM_EMAILcorreção que outras pessoas mencionaram, e permitindo que aplicativos menos seguros acessem a conta, tive que navegar para https://accounts.google.com/DisplayUnlockCaptcha enquanto estava conectado como a conta em questão para que o Django finalmente se autenticasse. .

Eu fui a esse URL através de um túnel SSH para o servidor da Web para garantir que o endereço IP fosse o mesmo; Não tenho muita certeza se isso é necessário, mas não pode doer. Você pode fazer isso da seguinte maneira: ssh -D 8080 -fN <username>@<host>e defina seu navegador da Web para usar localhost:8080como um proxy SOCKS.

James Johnson
fonte
2

Você pode usar o "Test Mail Server Tool" para testar o envio de email em sua máquina ou host local. Google e faça o download "Test Mail Server Tool" e configure-o.

Em seguida, em seu settings.py:

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

Do shell:

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

Para SendGrid - Django Especificamente:

SendGrid Django Docs aqui

Defina essas variáveis ​​em

settings.py

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

em 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
fonte