Django ile e-posta nasıl gönderilir?


153

Benim settings.py, aşağıdakiler var:

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

E-posta kodum:

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

Tabii ki, bir hata ayıklama sunucusu kurarsam python -m smtpd -n -c DebuggingServer localhost:1025, e-postayı terminalimde görebilirim.

Ancak, e-postayı hata ayıklama sunucusuna değil, user@gmail.com adresine nasıl gönderebilirim?

Yanıtlarınızı okuduktan sonra, düz bir şey elde edeyim:

  1. E-posta göndermek için localhost (basit ubuntu pc) kullanamaz mısınız?

  2. Ben django 1.3 send_mail()biraz reddedildi ve EmailMessage.send()bunun yerine kullanılır düşündüm ?


2
1. Orada çalışan bir SMTP sunucunuz varsa localhost'u kullanabilirsiniz . 2. Kesin mekanizma önemsizdir. Önemli olan bir SMTP sunucunuz olması.
Ignacio Vazquez-Abrams

postfix'i yüklersem, e-posta gönderebilir / alabilir miyim? Bunu yapmak için postfix'i nasıl kurarsınız?
Derek

6
Bu soru bu sitenin kapsamı dışındadır.
Ignacio Vazquez-Abrams


4
Yine de SEO bizi bu sayfaya götürüyor, Ignacio.
Phlip

Yanıtlar:


53

E-postayı gerçek bir SMTP sunucusuna gönderin. Kendinizinkini kurmak istemiyorsanız, Google'ın kendisi gibi sizin için çalışacak şirketler bulabilirsiniz.


3
Harika, sadece kendime bir e-posta! Miku tarafından bahsedilen yukarıdaki makale mükemmeldi. Makalenin yorumlarında küçük yazım hatası düzeltmesine dikkat edin. (Ve normal bilgisayarımı / localhost'umu kullandım. Daha önce başka bir şey ayarlamamıştım.)
user984003

166

Gmail'i Django için SMTP sunucum olarak kullanıyorum. Postfix veya başka herhangi bir sunucu ile uğraşmaktan çok daha kolay. E-posta sunucularını yönetme işinde değilim.

Settings.py'de:

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

NOT : 2016'da Gmail artık varsayılan olarak buna izin vermiyor. Sendgrid gibi harici bir hizmet kullanabilir veya güvenliği azaltmak, ancak şu seçeneğe izin vermek için bu öğreticiyi Google'dan takip edebilirsiniz: https://support.google.com/accounts/answer/6010255


8
şifrenizi düz metin olarak bırakmanın bir alternatifi var mı?
ritratt

1
Bunun sizin için daha yararlı olduğundan emin olmadığım halde, bunun yerine bir parola kullanmanıza izin veren Mandrill gibi bir e-posta hizmeti kullanabilirsiniz. Sunucunuzda yüklü bir şifreleme anahtarı da kullanabilir ve satırı EMAIL_HOST_PASSWORD = my_decrypt ('abi304hubaushl9rchy2y9fd29') gibi bir şey yapabilirsiniz
Ürdün

27
bir ortam değişkenine koyun. Ardından, EMAIL_HOST_PASSWORD = os.environ ['MY_PASSWORD_THAT_YOU_CANT_KNOW']
Drew Shafer

1
Kodunuzu verbatim kullandım. Gmail hesabım birkaç gün sonra engellendi. Sunucum muhtemelen günde 20'den az e-posta gönderdi. Google ile benzer bir sorunu olan var mı?
eugene

8
SMTPAuthenticationError ve ben " Modern güvenlik standartlarını karşılamayan bir uygulamadan oturum açma girişimi engellendi " e - postası alıyoruz . Dış görünüş gibi bu . " Daha az güvenli uygulamalar için erişimi açarak " geçici çözüm . Ve bu işe yaradı .
Bob Stein

40
  1. Bir proje oluşturun: django-admin.py startproject gmail
  2. Settings.py dosyasını aşağıdaki kodla düzenleyin:

    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. Etkileşimli modu çalıştırın: python manage.py shell

  4. EmailMessage modülünü içe aktarın:

    from django.core.mail import EmailMessage
  5. E-postayı gönder:

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

Daha fazla bilgi için belgelerdeki kontrol send_mailve EmailMessageözellikler .

Gmail için GÜNCELLEME

Ayrıca gmail ile e-posta gönderme konusunda sorun yaşıyorsanız, bu kılavuzları google'dan kontrol etmeyi unutmayın .

Google hesabı ayarlarınızda Security > Account permissions > Access for less secure appsbu seçeneğe gidin ve etkinleştirin.

Ayrıca , 2 adımlı doğrulamayı açtıktan sonra gmail'iniz için Uygulamaya özel bir şifre oluşturun .

Ardından ayarlarda uygulamaya özel şifre kullanmalısınız . Bu yüzden aşağıdaki satırı değiştirin:

    EMAIL_HOST_PASSWORD = 'your_email_app_specific_password'

Ayrıca HTML e-postası göndermek istiyorsanız, buna göz atın .


Adımlarınızı takip ediyorum, gönderemiyorum, e-postaya e-posta almıyorum /
qg_java_17137

outlookoffice365 için EMAIL_HOST ne olacak ?
Antu

14

Sitemde barındırılıyor Godaddyve aynı özel bir e-posta adresim var. Bunlar benim için çalışan ayarlardır:

Settings.py'de:

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

Kabukta:

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

Sonra O / P yani Başarı olarak "1" var. Ve ben de postayı aldım. :)

  • Domain.com'un anlamı nedir?

Teşekkürler, bu eski projeler için en kolay yol <Django 1.4
François Constant

13

Django sürüm 1.7 için, yukarıdaki çözümler işe yaramazsa aşağıdakileri deneyin

in settings.py ekle

#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

Son satır django 1.7 için hile yaptı


Bu benim için bir sebepten ötürü işe yaramadı. Parola yanlış bir hata geri almaya devam etti. Bu garip çünkü kimlik bilgilerini doğrudan Mailgun'dan aldım.
Alex Stewart

10

Smtp'yi settings.py içinde arka uç olarak kullanmanız gerekir

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

Arka ucu konsol olarak kullanırsanız, konsolda çıktı alırsınız

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

Ayrıca ek olarak aşağıdaki ayarlar

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

Bunun için gmail kullanıyorsanız , 2 adımlı doğrulama ve Uygulamaya özel şifre belirleyin ve bu şifreyi kopyalayıp EMAIL_HOST_PASSWORD değerinin üzerine yapıştırın.


5

SendGrid kullanarak Django ile e-posta gönderme kurmak için en kolay yolu olarak buldum. Şöyle çalışır:

  1. Bir SendGrid hesabı oluşturun (ve e-postanızı doğrulayın)
  2. Aşağıdakileri kendinize ekleyin 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

Ve hepiniz hazırsınız!

E-posta göndermek için:

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

Django'nun 500 dahili sunucu hatası olduğunda size e-posta göndermesini istiyorsanız, aşağıdakileri ekleyin settings.py:

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

SendGrid ile e-posta göndermek ayda 12 bin e-postaya kadar ücretsizdir.


1
Mükemmel, ancak belgelere göre kullanıcı adı olarak 'apikey' kullanarak çalışmaya başlayamadık ve SendGrid, basit bir posta için apikey başına üç düzine izin yapılandırmasını listeliyor ...
SYK

3

Bunu bir süre önce Django'dan yapmıştım. Meşru bir GMail hesabı açın ve kimlik bilgilerini buraya girin. İşte kodum -

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
smtplibDoğrudan kullanmaya gerek yoktur ; Django bu kısmı senin için halledecek.
Ignacio Vazquez-Abrams

oh öyle mi! bu nasıl olurdu? Burada tamamen varsayılan django send_mailişlevini atlamak ve kendi kullanın ...
Srikar Appalaraju

1
send_mail()nasıl yapacağınızdır. Mesajı hala kendiniz toplamanız gerekiyor, ancak SMTP bitleri hakkında endişelenmenize gerek yok.
Ignacio Vazquez-Abrams

2

Geç, ama:

Ek olarak DEFAULT_FROM_EMAILdüzeltme başkalarının sözü, var ve hesabına erişmek için daha az güvenli uygulamaların izin ben gitmek zorunda https://accounts.google.com/DisplayUnlockCaptcha nihayet authenticate Django almak için söz konusu hesabı olarak oturum açmışken .

IP adresinin aynı olduğundan emin olmak için web sunucusuna bir SSH tüneli üzerinden bu URL'ye gittim; Bunun gerekli olup olmadığından tam olarak emin değilim ama incinemez. Bunu şu şekilde yapabilirsiniz: ssh -D 8080 -fN <username>@<host>ardından web tarayıcınızı localhost:8080SOCKS proxy'si olarak kullanılacak şekilde ayarlayın .


2

Makinenizde veya yerel ana makinenizde e-posta göndermeyi test etmek için "Posta Sunucusu Aracını Test Et" seçeneğini kullanabilirsiniz . Google ve "Test Posta Sunucusu Aracı" nı indirin ve ayarlayın.

Ardından ayarlarınızda .py:

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

Kabuktan:

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

1

For SendGrid - Django Özellikle:

SendGrid Django Belgeleri burada

Bu değişkenleri şurada ayarla:

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 içinde

from django.core.mail import send_mail
send_mail('Subject here', 'Here is the message.', 'from@example.com', ['to@example.com'], fail_silently=False)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.