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=['[email protected]'])
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 [email protected]?

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?

Derek
sumber
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.

Ignacio Vazquez-Abrams
sumber
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 = '[email protected]'
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

Yordania
sumber
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 = '[email protected]'
    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=['[email protected]'])
    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 .

Alex Jolig
sumber
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 = '[email protected]'
EMAIL_HOST_PASSWORD = 'abcdef'
DEFAULT_FROM_EMAIL = '[email protected]'
SERVER_EMAIL = '[email protected]'
EMAIL_PORT = 25
EMAIL_USE_TLS = False

Dalam shell:

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

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

  • Apa arti dari domain.com?
ibaggu
sumber
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 = '[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

Baris terakhir melakukan trik untuk Django 1.7

Cognoscis
sumber
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 = '[email protected]'
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.

Vini.g.fer
sumber
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>', '[email protected]', ['[email protected]'])

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 = '[email protected]'
ADMINS = [('<Your name>', '[email protected]')]

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

yndolok
sumber
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']      = '[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
sumber
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.

James Johnson
sumber
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)
Allan Guwatudde
sumber
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.', '[email protected]', ['[email protected]'], fail_silently=False)
Deepak Sharma
sumber