Bagaimana cara mengirim email melalui Django?


153

Di saya settings.py, saya punya yang berikut:

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

Kode email saya:

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

Tentu saja, jika saya menyiapkan server debugging melalui python -m smtpd -n -c DebuggingServer localhost:1025, saya bisa melihat email di terminal saya.

Namun, bagaimana cara saya mengirim email bukan ke server debugging tetapi ke user@gmail.com?

Setelah membaca jawaban Anda, izinkan saya meluruskan sesuatu:

  1. Tidak bisakah Anda menggunakan localhost (pc ubuntu sederhana) untuk mengirim email?

  2. Saya pikir dalam Django 1.3 send_mail()agak usang dan EmailMessage.send()digunakan sebagai gantinya?


2
1. Anda dapat menggunakan localhost jika Anda memiliki server SMTP yang berjalan di sana . 2. Mekanisme pastinya tidak penting. Bagian yang penting adalah bahwa Anda memiliki server SMTP.
Ignacio Vazquez-Abrams

jadi jika saya menginstal postfix, saya dapat mengirim / menerima email? Bagaimana Anda mengatur postfix untuk melakukan ini?
Derek

6
Pertanyaan itu berada di luar cakupan situs ini.
Ignacio Vazquez-Abrams


4
Namun SEO membawa kita ke halaman ini, Ignacio.
Phlip

Jawaban:


53

Kirim email ke server SMTP nyata. Jika Anda tidak ingin membuat sendiri, Anda dapat menemukan perusahaan yang akan menjalankannya untuk Anda, seperti Google sendiri.


3
Luar biasa, saya hanya punya email sendiri! Artikel di atas yang disebutkan oleh miku sangat sempurna. Perhatikan koreksi kesalahan ketik kecil di komentar artikel. (Dan saya hanya menggunakan komputer / localhost biasa saya. Saya belum mengatur apa pun sebelumnya.)
user984003

166

Saya menggunakan Gmail sebagai server SMTP saya untuk Django. Jauh lebih mudah daripada berurusan dengan postfix atau apa pun server lain. Saya tidak dalam bisnis mengelola server email.

Di settings.py:

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

CATATAN : Pada 2016 Gmail tidak memperbolehkan ini lagi secara default. Anda dapat menggunakan layanan eksternal seperti Sendgrid, atau Anda dapat mengikuti tutorial ini dari Google untuk mengurangi keamanan tetapi mengizinkan opsi ini: https://support.google.com/accounts/answer/6010255


8
apakah ada alternatif untuk meninggalkan kata sandi Anda sebagai plaintext?
ritratt

1
Anda dapat menggunakan layanan email seperti Mandrill yang akan membiarkan Anda menggunakan kata sandi, meskipun saya tidak yakin itu lebih bermanfaat bagi Anda. Anda juga dapat menggunakan kunci enkripsi yang diinstal pada server Anda, dan membuat garis itu seperti EMAIL_HOST_PASSWORD = my_decrypt ('abi304hubaushl9rchy2y9fd29')
Jordan

27
letakkan di variabel lingkungan. Kemudian, EMAIL_HOST_PASSWORD = os.environ ['MY_PASSWORD_THAT_YOU_CANT_KNOW']
Drew Shafer

1
Saya menggunakan kode Anda kata demi kata. Akun gmail saya telah diblokir setelah beberapa hari. Server saya mungkin mengirim kurang dari 20 email per hari. Adakah yang punya masalah serupa dengan google?
eugene

8
SMTPAuthenticationError dan saya mendapat email " Upaya masuk dicegah ... dari aplikasi yang tidak memenuhi standar keamanan modern ". Terlihat seperti ini . Penanganan masalah dengan " mengaktifkan akses untuk aplikasi yang kurang aman ". Dan itu berhasil .
Bob Stein

40
  1. Buat proyek: django-admin.py startproject gmail
  2. Edit settings.py dengan kode di bawah ini:

    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. Jalankan mode interaktif: python manage.py shell

  4. Impor modul EmailMessage:

    from django.core.mail import EmailMessage
  5. Kirim email:

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

Untuk informasi lebih lanjut, periksa send_maildan EmailMessagefitur dalam dokumen .

UPDATE untuk Gmail

Juga jika Anda memiliki masalah dalam mengirim email melalui gmail, ingatlah untuk memeriksa panduan ini dari google.

Di pengaturan akun Google Anda, buka Security > Account permissions > Access for less secure appsdan aktifkan opsi ini.

Juga buat kata sandi khusus aplikasi untuk gmail Anda setelah Anda mengaktifkan verifikasi 2 langkah untuk itu.

Maka Anda harus menggunakan kata sandi khusus aplikasi dalam pengaturan. Jadi ubah baris berikut:

    EMAIL_HOST_PASSWORD = 'your_email_app_specific_password'

Juga jika Anda tertarik untuk mengirim email HTML, lihat ini .


Saya mengikuti langkah-langkah Anda, saya tidak bisa mengirim, email ke tidak menerima email /
qg_java_17137

apa yang akan menjadi EMAIL_HOST untuk outlookoffice365 ?
Antu

14

Situs saya dihosting pada Godaddydan saya memiliki email pribadi yang terdaftar pada yang sama. Ini adalah pengaturan yang berfungsi untuk saya:

Di 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

Dalam shell:

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

Lalu saya mendapat "1" sebagai O / P yaitu Sukses. Dan saya menerima surat juga. :)

  • Apa arti dari domain.com?

Terima kasih, itu cara termudah untuk proyek-proyek lama <Django 1.4
François Constant

13

Untuk Django versi 1.7, jika solusi di atas tidak berhasil maka coba yang berikut ini

di settings.py tambahkan

#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

Baris terakhir melakukan trik untuk Django 1.7


Yang ini tidak bekerja untuk saya karena suatu alasan. Saya terus mendapatkan kesalahan dengan kata sandi salah. Yang aneh karena saya mendapat kredensial langsung dari Mailgun.
Alex Stewart

10

Anda perlu menggunakan smtp sebagai backend di settings.py

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

Jika Anda menggunakan backend sebagai konsol, Anda akan menerima output di konsol

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

Dan juga pengaturan di bawah ini sebagai tambahan

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

Jika Anda menggunakan gmail untuk ini, siapkan verifikasi 2 langkah dan kata sandi khusus Aplikasi dan salin dan tempel kata sandi tersebut di atas nilai EMAIL_HOST_PASSWORD.


5

Saya menemukan menggunakan SendGrid menjadi cara termudah untuk mengatur pengiriman email dengan Django. Begini cara kerjanya:

  1. Buat akun SendGrid (dan verifikasi email Anda)
  2. Tambahkan yang berikut ke Anda 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

Dan Anda sudah siap!

Untuk mengirim email:

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

Jika Anda ingin Django mengirim email kepada Anda setiap kali ada 500 server internal kesalahan, tambahkan berikut ini ke Anda settings.py:

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

Mengirim email dengan SendGrid gratis hingga 12rb email per bulan.


1
Luar biasa, tetapi belum dapat membuatnya berfungsi menggunakan 'apikey' sebagai nama pengguna sesuai dokumentasi, dan SendGrid mencantumkan tiga lusin konfigurasi izin per apikey untuk sendmail sederhana ...
SYK

3

Sebenarnya saya sudah melakukan ini dari Django beberapa waktu lalu. Buka akun GMail yang sah & masukkan kredensial di sini. Ini kode saya -

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
Tidak perlu digunakan smtplibsecara langsung; Django akan menangani bagian itu untuk Anda.
Ignacio Vazquez-Abrams

oh itu dia! bagaimana itu bisa terjadi? Di sini saya sepenuhnya memotong fungsi default Django send_mail& menggunakan saya sendiri ...
Srikar Appalaraju

1
send_mail()adalah bagaimana Anda akan melakukannya. Anda masih perlu merakit pesan sendiri, tetapi Anda tidak perlu khawatir tentang bit SMTP.
Ignacio Vazquez-Abrams

2

Terlambat, tapi:

Selain DEFAULT_FROM_EMAILperbaikan yang disebutkan orang lain, dan memungkinkan aplikasi yang kurang aman untuk mengakses akun, saya harus menavigasi ke https://accounts.google.com/DisplayUnlockCaptcha saat masuk sebagai akun yang bersangkutan agar Django akhirnya mengotentikasi .

Saya pergi ke URL itu melalui terowongan SSH ke server web untuk memastikan alamat IPnya sama; Saya tidak sepenuhnya yakin apakah itu perlu tetapi tidak ada salahnya. Anda dapat melakukannya seperti ssh -D 8080 -fN <username>@<host>itu:, lalu atur browser web Anda untuk digunakan localhost:8080sebagai proxy SOCKS.


2

Anda dapat menggunakan "Alat Uji Server Surat" untuk menguji pengiriman email di komputer atau server lokal Anda. Google dan Unduh "Alat Uji Server Surat" dan aturlah.

Kemudian di settings.py Anda:

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

Dari shell:

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

1

Untuk SendGrid - Django Secara Khusus:

SendGrid Django Docs di sini

Tetapkan variabel-variabel ini di

settings.py

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

di 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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.