Làm thế nào để gửi email qua Django?


153

Trong tôi settings.py, tôi có những điều sau đây:

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

Mã email của tôi:

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

Tất nhiên, nếu tôi thiết lập một máy chủ gỡ lỗi thông qua python -m smtpd -n -c DebuggingServer localhost:1025, tôi có thể thấy email trong thiết bị đầu cuối của mình.

Tuy nhiên, làm thế nào để tôi thực sự gửi email không đến máy chủ gỡ lỗi mà đến user@gmail.com?

Sau khi đọc câu trả lời của bạn, hãy để tôi nói thẳng:

  1. Bạn không thể sử dụng localhost (pc ub Ubuntu đơn giản) để gửi e-mail?

  2. Tôi nghĩ trong django 1.3 send_mail()là hơi phản đối và EmailMessage.send()được sử dụng thay thế?


2
1. Bạn có thể sử dụng localhost nếu bạn có máy chủ SMTP đang chạy ở đó . 2. Cơ chế chính xác là không quan trọng. Phần quan trọng là bạn có một máy chủ SMTP.
Ignacio Vazquez-Abrams

Vì vậy, nếu tôi cài đặt postfix, tôi có thể gửi / nhận email không? Làm thế nào để bạn thiết lập postfix để làm điều này?
Derek

5
Câu hỏi đó nằm ngoài phạm vi của trang web này.
Ignacio Vazquez-Abrams


4
Tuy nhiên, SEO đưa chúng ta đến trang này, Ignacio.
Phlip

Câu trả lời:


53

Gửi email đến một máy chủ SMTP thực sự. Nếu bạn không muốn thành lập công ty của riêng mình thì bạn có thể tìm các công ty sẽ điều hành một công ty cho bạn, chẳng hạn như chính Google.


3
Tuyệt vời, tôi chỉ cần một email! Bài viết trên được đề cập bởi miku là hoàn hảo. Lưu ý sửa lỗi đánh máy nhỏ trong các bình luận của bài viết. (Và tôi chỉ sử dụng máy tính / localhost thông thường của mình. Tôi chưa thiết lập bất cứ thứ gì khác trước khi sử dụng.)
user984003

166

Tôi sử dụng Gmail làm máy chủ SMTP cho Django. Dễ dàng hơn nhiều so với việc xử lý postfix hoặc bất kỳ máy chủ nào khác. Tôi không làm công việc quản lý máy chủ email.

Trong cài đặt:

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

LƯU Ý : Trong năm 2016, Gmail không cho phép điều này nữa theo mặc định. Bạn có thể sử dụng một dịch vụ bên ngoài như Sendgrid hoặc bạn có thể làm theo hướng dẫn này từ Google để giảm bảo mật nhưng cho phép tùy chọn này: https://support.google.com/accountsals/6010255


8
Có cách nào khác để để lại mật khẩu của bạn dưới dạng bản rõ không?
ritratt

1
Bạn có thể sử dụng một dịch vụ email như Mandrill sẽ cho phép bạn sử dụng cụm mật khẩu thay thế, mặc dù tôi không chắc điều đó có hữu ích hơn cho bạn không. Bạn cũng có thể sử dụng khóa mã hóa được cài đặt trên máy chủ của mình và tạo dòng giống như EMAIL_HOST_PASSWORD = my_decrypt ('abi304hubaushl9rchy2y9fd29')
Jordan

27
đặt nó trong một biến môi trường. Sau đó, EMAIL_HOST_PASSWORD = os.envir ['MY_PASSWORD_THAT_YOU_CANT_KNOW']
Drew Shafer

1
Tôi đã sử dụng nguyên văn mã của bạn. Tài khoản gmail của tôi đã bị chặn sau vài ngày. Máy chủ của tôi có thể gửi ít hơn 20 email mỗi ngày. Đã có ai gặp vấn đề tương tự với google chưa?
eugene

8
SMTPAuthenticationError và tôi nhận được email "Đã ngăn chặn đăng nhập ... từ một ứng dụng không đáp ứng các tiêu chuẩn bảo mật hiện đại ". Hình như thế này . Giải pháp thay thế bằng cách " bật quyền truy cập cho các ứng dụng kém an toàn hơn ". Và điều đó đã làm việc .
Bob Stein

40
  1. Tạo một dự án: django-admin.py startproject gmail
  2. Chỉnh sửa cài đặt với mã bên dưới:

    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. Chạy chế độ tương tác: python manage.py shell

  4. Nhập mô-đun EmailMessage:

    from django.core.mail import EmailMessage
  5. Gửi email:

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

Để biết thêm thông tin, kiểm tra send_mailEmailMessagecác tính năng trong tài liệu .

CẬP NHẬT cho Gmail

Ngoài ra nếu bạn gặp vấn đề khi gửi email qua gmail, hãy nhớ kiểm tra hướng dẫn này từ google.

Trong cài đặt tài khoản Google của bạn, hãy truy cập Security > Account permissions > Access for less secure appsvà bật tùy chọn này.

Đồng thời tạo mật khẩu dành riêng cho Ứng dụng cho gmail của bạn sau khi bạn bật xác minh 2 bước cho nó.

Sau đó, bạn nên sử dụng mật khẩu cụ thể của ứng dụng trong cài đặt. Vì vậy, thay đổi dòng sau:

    EMAIL_HOST_PASSWORD = 'your_email_app_specific_password'

Ngoài ra nếu bạn muốn gửi email HTML, hãy kiểm tra điều này .


Tôi làm theo các bước của bạn, tôi không thể gửi, email không nhận được email /
qg_java_17137

EMAIL_HOST sẽ là cho triển vọng365 ?
Antu

14

Trang web của tôi được lưu trữ trên Godaddyvà tôi có một email riêng được đăng ký trên cùng. Đây là các cài đặt hoạt động cho tôi:

Trong cài đặt:

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

Trong vỏ bọc:

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

Sau đó, tôi nhận được "1" là O / P tức là Thành công. Và tôi cũng nhận được thư. :)

  • Ý nghĩa của domain.com là gì?

Cảm ơn, đó là cách dễ nhất cho các dự án cũ <Django 1.4
François Constant

13

Đối với Django phiên bản 1.7, nếu các giải pháp trên không hoạt động thì hãy thử các cách sau

trong settings.txt thêm

#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

Dòng cuối cùng đã thực hiện thủ thuật cho django 1.7


Điều này đã không làm việc cho tôi vì một số lý do. Tôi liên tục nhận được một lỗi với mật khẩu bị sai. Điều này thật lạ vì tôi đã nhận được thông tin trực tiếp từ Mailgun.
Alex Stewart

10

Bạn cần sử dụng smtp làm phụ trợ trong settings.txt

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

Nếu bạn sử dụng phụ trợ làm bàn điều khiển, bạn sẽ nhận được đầu ra trong bàn điều khiển

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

Và ngoài ra cài đặt ngoài

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

Nếu bạn đang sử dụng gmail cho việc này, hãy thiết lập xác minh 2 bướcmật khẩu cụ thể cho Ứng dụng và sao chép và dán mật khẩu đó vào giá trị EMAIL_HOST_PASSWORD ở trên.


5

Tôi thấy rằng sử dụng SendGrid là cách dễ nhất để thiết lập gửi email với Django. Đây là cách nó hoạt động:

  1. Tạo tài khoản SendGrid (và xác minh email của bạn)
  2. Thêm phần sau vào 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

Và bạn đã sẵn sàng!

Để gửi email:

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

Nếu bạn muốn Django gửi email cho bạn bất cứ khi nào có lỗi 500 máy chủ nội bộ, hãy thêm thông tin sau vào settings.py:

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

Gửi email với SendGrid miễn phí tối đa 12k email mỗi tháng.


1
Tuyệt vời, nhưng không thể làm cho nó hoạt động bằng cách sử dụng 'apikey' làm tên người dùng theo tài liệu và SendGrid liệt kê ba cấu hình cấp phép cho mỗi apikey cho một mailmail đơn giản ...
SYK

3

Tôi đã thực sự làm điều này từ Django một thời gian trước. Mở một tài khoản GMail hợp pháp và nhập thông tin đăng nhập tại đây. Đây là mã của tôi -

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
Không cần sử dụng smtplibtrực tiếp; Django sẽ xử lý phần đó cho bạn.
Ignacio Vazquez-Abrams

Oh là nó! nó sẽ như thế nào Ở đây tôi hoàn toàn bỏ qua send_mailchức năng django mặc định và sử dụng riêng của mình ...
Srikar Appalaraju

1
send_mail()là cách bạn sẽ làm điều đó. Bạn vẫn cần phải tự lắp ráp tin nhắn, nhưng bạn không phải lo lắng về các bit SMTP.
Ignacio Vazquez-Abrams

2

Muộn, nhưng:

Ngoài cách DEFAULT_FROM_EMAILkhắc phục mà những người khác đã đề cập cho phép các ứng dụng kém an toàn truy cập vào tài khoản, tôi đã phải điều hướng đến https://accounts.google.com/DisplayUnlockCaptcha trong khi đăng nhập với tư cách là tài khoản được đề cập để Django cuối cùng xác thực .

Tôi đã truy cập URL đó thông qua một đường hầm SSH đến máy chủ web để đảm bảo địa chỉ IP giống nhau; Tôi không hoàn toàn chắc chắn nếu điều đó là cần thiết nhưng nó không thể làm tổn thương. Bạn có thể làm như vậy : ssh -D 8080 -fN <username>@<host>, sau đó đặt trình duyệt web của bạn để sử dụng localhost:8080làm proxy SOCKS.


2

Bạn có thể sử dụng "Test Mail Server Tool" để kiểm tra việc gửi email trên máy hoặc localhost của bạn. Google và Tải xuống "Test Mail Server Tool" và thiết lập nó.

Sau đó, trong cài đặt của bạn:

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

Từ vỏ:

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

1

Đối với SendGrid - Django Cụ thể:

Tài liệu SendGrid Django tại đây

Đặt các biến này trong

cài đặt

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

trong lượt xem

from django.core.mail import send_mail
send_mail('Subject here', 'Here is the message.', 'from@example.com', ['to@example.com'], fail_silently=False)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.