จะส่งอีเมลผ่าน Django ได้อย่างไร?


153

ในตัวฉันsettings.pyฉันมีดังต่อไปนี้:

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

รหัสอีเมลของฉัน:

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

แน่นอนถ้าฉันติดตั้งเซิร์ฟเวอร์ดีบั๊กผ่านpython -m smtpd -n -c DebuggingServer localhost:1025ฉันสามารถดูอีเมลในเทอร์มินัลของฉัน

อย่างไรก็ตามฉันจะส่งอีเมลไม่ไปยังเซิร์ฟเวอร์ดีบั๊กได้อย่างไร แต่ส่งไปยัง user@gmail.com

หลังจากอ่านคำตอบของคุณแล้วขอให้ฉันทำสิ่งที่ตรง

  1. คุณไม่สามารถใช้ localhost (อูบุนตูพีซีธรรมดา) เพื่อส่งอีเมลได้หรือไม่?

  2. ฉันคิดว่าใน django 1.3 send_mail()ค่อนข้างเลิกใช้แล้วและEmailMessage.send()ใช้แทนไหม?


2
1. คุณสามารถใช้ localhost ถ้าคุณมีเซิร์ฟเวอร์ที่ทำงานที่นั่น 2. กลไกที่แน่นอนไม่สำคัญ ส่วนที่สำคัญคือคุณมีเซิร์ฟเวอร์ SMTP
Ignacio Vazquez-Abrams

ดังนั้นถ้าฉันติดตั้ง postfix ฉันสามารถส่ง / รับอีเมลได้หรือไม่ คุณจะตั้งค่า postfix เพื่อทำสิ่งนี้ได้อย่างไร
ดีเร็ก

6
คำถามนั้นอยู่นอกเหนือขอบเขตของไซต์นี้
Ignacio Vazquez-Abrams


4
ทว่า SEO นำเราไปสู่หน้านี้อิกนาชิโอ
Phlip

คำตอบ:


53

ส่งอีเมลไปยังเซิร์ฟเวอร์ SMTP จริง หากคุณไม่ต้องการตั้งค่าของคุณเองคุณสามารถค้นหา บริษัท ที่จะดำเนินการให้กับคุณเช่น Google เอง


3
เยี่ยมมากฉันแค่ส่งอีเมลถึงตัวเอง! บทความข้างต้นที่กล่าวถึงโดย miku นั้นสมบูรณ์แบบ หมายเหตุการแก้ไขการพิมพ์ผิดขนาดเล็กในความคิดเห็นของบทความ (และฉันเพิ่งใช้คอมพิวเตอร์ปกติ / localhost ฉันไม่ได้ตั้งค่าอะไรก่อนถึงมือ)
user984003

166

ฉันใช้ Gmail เป็นเซิร์ฟเวอร์ SMTP ของฉันสำหรับ Django ง่ายกว่าจัดการกับ postfix หรือเซิร์ฟเวอร์อื่น ๆ ฉันไม่ได้อยู่ในธุรกิจการจัดการเซิร์ฟเวอร์อีเมล

ใน settings.py:

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

หมายเหตุ : ในปี 2559 Gmail ไม่อนุญาตให้ทำเช่นนี้อีกต่อไปตามค่าเริ่มต้น คุณสามารถใช้บริการภายนอกเช่น Sendgrid หรือทำตามบทช่วยสอนนี้จาก Google เพื่อลดความปลอดภัย แต่อนุญาตตัวเลือกนี้: https://support.google.com/accounts/answer/6010255


8
มีทางเลือกอื่นในการปล่อยรหัสผ่านของคุณเป็นข้อความธรรมดาหรือไม่?
ritratt

1
คุณสามารถใช้บริการอีเมลเช่น Mandrill ที่จะให้คุณใช้ข้อความรหัสผ่านแทน แต่ฉันไม่แน่ใจว่ามันจะมีประโยชน์สำหรับคุณมากกว่านี้ คุณสามารถใช้รหัสการเข้ารหัสที่ติดตั้งบนเซิร์ฟเวอร์ของคุณและสร้างบรรทัดเช่น EMAIL_HOST_PASSWORD = my_decrypt ('abi304hubaushl9rchy2y9fd29')
Jordan

27
วางไว้ในตัวแปรสภาพแวดล้อม จากนั้น EMAIL_HOST_PASSWORD = os.environ ['MY_PASSWORD_THAT_YOU_CANT_KNOW']
Drew Shafer

1
ฉันใช้รหัสคำต่อคำของคุณ บัญชี gmail ของฉันถูกบล็อกหลังจากผ่านไปสองสามวัน เซิร์ฟเวอร์ของฉันอาจส่งอีเมลน้อยกว่า 20 ฉบับต่อวัน มีใครมีปัญหาคล้ายกันกับ google?
eugene

8
SMTPAuthenticationError และฉันได้รับอีเมล " ความพยายามในการลงชื่อเข้าใช้ป้องกันไม่ให้ ... จากแอพที่ไม่ตรงตามมาตรฐานความปลอดภัยที่ทันสมัย " ลักษณะเช่นนี้ วิธีแก้ปัญหาโดย " การเปิดการเข้าถึงแอปที่ปลอดภัยน้อยกว่า " และนั่นก็ใช้ได้
Bob Stein

40
  1. สร้างโครงการ: django-admin.py startproject gmail
  2. แก้ไข settings.py ด้วยรหัสด้านล่าง:

    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. เรียกใช้โหมดโต้ตอบ: python manage.py shell

  4. อิมพอร์ตโมดูล EmailMessage:

    from django.core.mail import EmailMessage
  5. ส่งอีเมล:

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

สำหรับรายละเอียดเพิ่มเติมตรวจสอบsend_mailและEmailMessageคุณลักษณะในเอกสาร

อัปเดตสำหรับ Gmail

นอกจากนี้หากคุณมีปัญหาในการส่งอีเมลผ่าน gmail อย่าลืมตรวจสอบคำแนะนำนี้จาก google

ในการตั้งค่าบัญชี Google ของคุณไปที่ Security > Account permissions > Access for less secure appsและเปิดใช้งานตัวเลือกนี้

นอกจากนี้ยังสร้างรหัสผ่านเฉพาะ App สำหรับ Gmail ของคุณหลังจากที่คุณได้เปิดอยู่2 ขั้นตอนการยืนยันสำหรับมัน

จากนั้นคุณควรใช้รหัสผ่านเฉพาะแอปในการตั้งค่า ดังนั้นเปลี่ยนบรรทัดต่อไปนี้:

    EMAIL_HOST_PASSWORD = 'your_email_app_specific_password'

นอกจากนี้หากคุณสนใจที่จะส่งอีเมล HTML ลองดูสิ


ฉันทำตามขั้นตอนของคุณฉันไม่สามารถส่งไปยังอีเมลไม่ได้รับอีเมล /
qg_java_17137

สิ่งที่จะเป็น EMAIL_HOST สำหรับoutlookoffice365 ?
Antu

14

ไซต์ของฉันโฮสต์อยู่Godaddyและฉันได้ลงทะเบียนอีเมลส่วนตัวด้วย นี่คือการตั้งค่าที่เหมาะกับฉัน:

ใน 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

ในเปลือก:

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

จากนั้นฉันได้ "1" เป็น O / P คือความสำเร็จ และฉันก็ได้รับเมลด้วย :)

  • domain.com มีความหมายอะไร?

ขอบคุณนั่นเป็นวิธีที่ง่ายที่สุดสำหรับโครงการเก่า <Django 1.4
François Constant

13

สำหรับ Django เวอร์ชัน 1.7 หากวิธีข้างต้นไม่ได้ผลให้ลองทำดังนี้

ในsettings.pyเพิ่ม

#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

บรรทัดสุดท้ายทำเคล็ดลับสำหรับ django 1.7


อันนี้ไม่ทำงานสำหรับฉันด้วยเหตุผลบางอย่าง ฉันได้รับข้อผิดพลาดกลับมาโดยที่รหัสผ่านไม่ถูกต้อง ซึ่งแปลกเพราะฉันได้รับสิทธิโดยตรงจาก Mailgun
Alex Stewart

10

คุณต้องใช้smtp เป็นแบ็กเอนด์ใน settings.py

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

หากคุณใช้แบ็กเอนด์เป็นคอนโซลคุณจะได้รับผลลัพธ์ในคอนโซล

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

และด้านล่างการตั้งค่านอกจากนี้

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

หากคุณใช้gmailสำหรับสิ่งนี้ให้ตั้งค่าการยืนยันแบบสองขั้นตอนและรหัสผ่านเฉพาะแอปพลิเคชันแล้วคัดลอกและวางรหัสผ่านนั้นในค่า EMAIL_HOST_PASSWORD ด้านบน


5

ฉันพบว่าการใช้ SendGrid เป็นวิธีที่ง่ายที่สุดในการตั้งค่าการส่งอีเมลด้วย Django นี่คือวิธีการทำงาน:

  1. สร้างบัญชี SendGrid (และยืนยันอีเมลของคุณ)
  2. เพิ่มสิ่งต่อไปนี้ในของคุณ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

และคุณพร้อมแล้ว!

ในการส่งอีเมล:

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

หากคุณต้องการ Django ส่งอีเมลถึงคุณเมื่อใดก็ตามที่มีข้อผิดพลาดภายในเซิร์ฟเวอร์ 500 ข้อให้เพิ่มสิ่งต่อไปนี้ในsettings.py:

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

การส่งอีเมลด้วย SendGrid นั้นฟรีมากถึง 12k อีเมลต่อเดือน


1
ยอดเยี่ยม แต่ไม่สามารถใช้งานได้โดยใช้ 'apikey' เป็นชื่อผู้ใช้ตามเอกสารประกอบและรายการ SendGrid มีการกำหนดค่าการอนุญาตสามสิบต่อ apikey สำหรับ sendmail ง่ายๆ ...
SYK

3

จริง ๆ แล้วฉันได้ทำสิ่งนี้จาก Django แล้ว เปิดบัญชี GMail ที่ถูกต้องและป้อนข้อมูลรับรองที่นี่ นี่คือรหัสของฉัน -

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
ไม่จำเป็นต้องใช้smtplibโดยตรง Django จะจัดการส่วนนั้นให้คุณ
Ignacio Vazquez-Abrams

โอ้! มันจะเป็นอย่างไร ที่นี่ฉันจะข้ามsend_mailฟังก์ชั่นเริ่มต้น django และใช้ของตัวเอง ...
Srikar Appalaraju

1
send_mail()เป็นวิธีที่คุณจะทำมัน คุณยังต้องรวบรวมข้อความด้วยตนเอง แต่คุณไม่ต้องกังวลเกี่ยวกับบิต SMTP
Ignacio Vazquez-Abrams

2

ช้า แต่:

นอกจากนี้ยังมีDEFAULT_FROM_EMAILการแก้ไขคนอื่น ๆ ได้กล่าวถึงและช่วยให้แอพพลิเคน้อยปลอดภัยในการเข้าถึงบัญชีของฉันมีเพื่อนำทางไปยังhttps://accounts.google.com/DisplayUnlockCaptchaขณะลงชื่อเข้าเป็นบัญชีในคำถามที่จะได้รับ Django ไปจนรับรองความถูกต้อง .

ฉันไปที่ URL นั้นผ่านอุโมงค์ SSH ไปยังเว็บเซิร์ฟเวอร์เพื่อให้แน่ใจว่าที่อยู่ IP นั้นเหมือนกัน ฉันไม่แน่ใจทั้งหมดถ้าจำเป็น แต่ไม่สามารถทำร้ายได้ คุณสามารถทำได้ดังนี้: ssh -D 8080 -fN <username>@<host>จากนั้นตั้งค่าเว็บเบราว์เซอร์ให้ใช้localhost:8080เป็นพร็อกซี SOCKS


2

คุณสามารถใช้"เครื่องมือทดสอบเซิร์ฟเวอร์อีเมล"เพื่อทดสอบการส่งอีเมลบนเครื่องหรือโฮสต์ในพื้นที่ของคุณ Google และดาวน์โหลด "เครื่องมือทดสอบเซิร์ฟเวอร์อีเมล" และตั้งค่า

จากนั้นใน settings.py ของคุณ:

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

จากเปลือก:

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

1

สำหรับSendGrid - Djangoโดยเฉพาะ:

ส่งเอกสาร Django ที่นี่

ตั้งค่าตัวแปรเหล่านี้เป็น

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

from django.core.mail import send_mail
send_mail('Subject here', 'Here is the message.', 'from@example.com', ['to@example.com'], fail_silently=False)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.