2011-06-16 25 views
110

在我settings.py,我有以下幾點:如何通過Django發送電子郵件?

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

當然,如果我安裝調試服務器通過python -m smtpd -n -c DebuggingServer localhost:1025,我可以看到我的終端的電子郵件。

但是,我怎樣才能真正發送電子郵件不是調試服務器,而是發送到[email protected]

閱讀答案後,讓我得到的東西直:

  1. 你不能使用localhost(簡單的Ubuntu PC)發送電子郵件?

  2. 我認爲在Django 1.3 send_mail()是有些不推薦使用,而是使用EmailMessage.send()

+1

1.您可以使用localhost *如果你有一個SMTP服務器上運行有*。 2.確切的機制並不重要。重要的部分是你有一個SMTP服務器。 – 2011-06-16 05:08:16

+0

所以如果我安裝postfix,我可以發送/接收電子郵件?你如何設置postfix來做到這一點? – Derek 2011-06-16 05:16:19

+3

這個問題超出了本網站的範圍。 – 2011-06-16 05:19:03

回答

43

將電子郵件發送到真正的SMTP服務器。如果你不想自己創建,那麼你可以找到可以爲你運行的公司,比如Google本身。

+2

太棒了,我只是自己的電子郵件!以上miku提到的文章是完美的。請注意文章評論中的小錯字更正。 (我只是用我的普通電腦/本地主機,之前我沒有設置任何東西。) – user984003 2012-10-24 16:11:13

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']  = '[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 
+1

沒有必要直接使用'smtplib'; Django會爲你處理這個部分。 – 2011-06-16 04:37:30

+0

哦!那會怎麼樣?在這裏我完全繞過默認的django'send_mail'函數&使用我自己的... – 2011-06-16 04:40:14

+1

'send_mail()'是你如何做到這一點。您仍然需要自己組裝郵件,但您不必擔心SMTP位。 – 2011-06-16 04:49:09

146

我使用Gmail作爲我的SMTP服務器用於Django。比處理postfix或任何其他服務器要容易得多。我不是管理電子郵件服務器的業務。

在settings.py:

EMAIL_USE_TLS = True 
EMAIL_HOST = 'smtp.gmail.com' 
EMAIL_PORT = 587 
EMAIL_HOST_USER = '[email protected]' 
EMAIL_HOST_PASSWORD = 'password' 

注意:2016年的Gmail默認情況下不會再允許這樣。您可以使用外部服務像Sendgrid,也可以按照從谷歌本教程以減少安全性,但允許此選項:https://support.google.com/accounts/answer/6010255

+11

實際上即插即用的代碼,thx – mihaicc 2012-07-05 22:34:59

+8

是否有將密碼作爲純文本的替代方案? – ritratt 2013-02-04 16:46:57

+1

您可以使用Mandrill之類的電子郵件服務,它可以讓您使用密碼短語,但我不確定這對您有什麼幫助。您也可以使用安裝在您的服務器上的加密密鑰,並使該行類似於EMAIL_HOST_PASSWORD = my_decrypt('abi304hubaushl9rchy2y9fd29') – Jordan 2013-02-04 22:02:38

8

你需要在settings.py使用SMTP作爲後端

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 = '[email protected]' 
EMAIL_HOST_PASSWORD = 'password' 

如果您使用的是此的Gmail,設置兩步驗證應用特定密碼複製並粘貼在上面EMAIL_HOST_PASSWORD值密碼。

17
  1. 創建一個項目:django-admin.py startproject gmail
  2. 編輯設置。PY與下面的代碼:

    EMAIL_USE_TLS = True 
    EMAIL_HOST = 'smtp.gmail.com' 
    EMAIL_HOST_USER = '[email protected]' 
    EMAIL_HOST_PASSWORD = 'yourpassword' 
    EMAIL_PORT = 587 
    
  3. 運行交互模式:python manage.py shell

  4. 導入EmailMessage模塊:

    from django.core.mail import EmailMessage 
    
  5. 發送電子郵件:

    email = EmailMessage('Subject', 'Body', to=['[email protected]']) 
    email.send() 
    
+0

我跟着你的腳步,我不能發送的電子郵件沒有收到電子郵件/ – 2017-11-30 04:27:11

12

我的網站託管在Godaddy上,我有私人的電子郵件註冊。 這些都是爲我工作的設置:

在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 

在外殼:

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

然後我得到了 「1」 的O/P,即成功。我也收到了郵件。 :)

+0

謝謝,這對舊項目 2015-09-21 01:16:54

12

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 = '[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 

最後一行做了Django的1.7

+0

這其中並沒有爲我出於某種原因最簡單的方法。我不斷收到密碼錯誤的錯誤。這很奇怪,因爲我得到了全權證書Mailgun直接。 – 2015-07-05 00:11:12

2
的伎倆

後期,但:

除了DEFAULT_FROM_EMAIL修復其他人提到,允許安全性較低的應用訪問該帳戶,我必須導航到https://accounts.google.com/DisplayUnlockCaptcha,同時登錄爲有問題的帳戶才能讓Django最終進行身份驗證。

我通過一個SSH隧道連接到Web服務器,以確保IP地址是相同的;我不完全確定這是否有必要,但不能傷害。您可以這樣做:ssh -D 8080 -fN <username>@<host>,然後將您的網絡瀏覽器設置爲使用localhost:8080作爲SOCKS代理。

2

我發現使用SendGrid是設置用Django發送電子郵件的最簡單的方法。下面是它如何工作的:

  1. Create a SendGrid account(並確認電子郵件)
  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>', '[email protected]', ['[email protected]']) 

如果你想Django的給你發郵件,每當有一個500內部服務器錯誤,以下內容添加到您的settings.py:與SendGrid

DEFAULT_FROM_EMAIL = '[email protected]' 
ADMINS = [('<Your name>', '[email protected]')] 

發送電子郵件是免費的每月高達12k封電子郵件。

+0

優秀,但還沒有能夠得到它使用「apikey」作爲用戶名按文件工作,並SendGrid列表每apikey二三十個許可配置一個簡單的sendmail ... – SYK 2017-01-04 07:11:23

1

你可以使用「測試郵件服務器的工具」測試電子郵件發送您的機器或本地主機上。 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)