2012-11-27 82 views
20

讓Django發送電子郵件很好地解釋了here使用標準設置,如下所示。EmailBackend通過Django中的多個SMTP發送電子郵件

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' 
EMAIL_HOST = "mail.mysmtpserver.somewhere" 
#EMAIL_PORT 
EMAIL_HOST_USER = "[email protected]" 
EMAIL_HOST_PASSWORD = "mypassword" 
#EMAIL_USE_TLS = True 

然後使用django.core.mail.EmailMessage發送它的。

如何過,如果你正在運行多個站點,並需要每一種通過自己的SMTP服務器(或只是不同的登錄在同一個SMTP服務器)發送電子郵件呢?

搜索這樣或方式與當前的後端沒有產生任何令人滿意的結果做一個EmailBackend。

回答

19

如果您想覆蓋提供的設置,您可以創建自己的連接並將其提供給send_emailEmailMessage

from django.core.mail import get_connection, send_mail 
from django.core.mail.message import EmailMessage 
# TODO: Insert clever settings mechanism 
my_host = '' 
my_port = 587 
my_username = '' 
my_password = '' 
my_use_tls = True 
connection = get_connection(host=my_host, 
          port=my_port, 
          username=my_username, 
          password=my_password, 
          use_tls=my_use_tls) 

send_mail('diditwork?', 'test message', 'from_email', ['to'], connection=connection) 
# or 
EmailMessage('diditwork?', 'test message', 'from_email', ['to'], connection=connection).send(fail_silently=False) 

更新:確保關閉後使用的連接,@ michel.iamit答案要點代碼顯示的連接緩存SMPT。 @dhackner答案顯示瞭如何使用語句自動關閉連接。

+0

當我使用這種解決方案時發現的東西是Celery/Kombu * cant當你傳遞一個連接對象時,醃製EmailMessage *,所以我認爲這個方法在安排電子郵件以備將來交付時可能不起作用 –

+0

你應該永遠不要嘗試醃製一個「連接」,因爲它可能在將來的任務中不可用。它應該工作,如果只是數據傳遞給未來的任務和EmailMessage構造任務執行時... –

0

對每個站點使用不同的配置。

一種方法是有,除了你settings.py,一個settings_SITENAME.py爲每個站點。這些文件將具有自定義郵件服務器設置。 每個站點都會有settings_local.py是一個符號鏈接到它自己的自定義設置文件

然後把這個節在settings.py底部:

try:                                            
    from settings_local import *                                     
except ImportError:                                        
    pass 

現在你有每個站點自定義設置

+0

任何方式用一個設置文件todo?我需要使用多個SMTP服務器發送一個Django實例。 – gorus

+1

不要使用django電子郵件後端 - 使用較低級別的python庫 - http://docs.python.org/2/library/email-examples.html – scytale

1

查看django的電子郵件後端並創建一個定製的電子郵件可能是個好主意。

這裏是代碼:https://github.com/django/django/blob/master/django/core/mail/backends/smtp.py

這個例子說明了如何使自定義(在此人使用SMTP_SSL在SMTP代替):

https://gist.github.com/jsummerfield/1486891

我分叉那一個, (所以我可以使用一個後端爲不同的網站使用不同的郵件設置):

https://gist.github.com/iamit/5415771

不知道這是否會工作,但正如你看到上面的所有代碼返回打開連接,如果已經有連接... 所以也許有你的解決方案的開始....不要做那關閉打開的連接並重新打開不同的設置......(不知道這是否有效)。

7

我會稍微修改Daniel Backman的答案,以使用文檔中的上下文管理器。它將自行處理open()和close()調用。

from django.core.mail import get_connection, send_mail 
from django.core.mail.message import EmailMessage 

with get_connection(
    host=my_host, 
    port=my_port, 
    username=my_username, 
    password=my_password, 
    user_tls=my_use_tls 
) as connection: 
    EmailMessage(subject1, body1, from1, [to1], 
       connection=connection).send() 

https://docs.djangoproject.com/en/dev/topics/email/#email-backends

+0

確實是一個更優雅的解決方案,只是一個說明,它只適用於Django當前的開發版本(> 1.7) –

+0

是嗎?如果您使用django <= 1.7,可以問這裏如何關閉連接? –

+0

我想我找到了。 'connection.close()時'。我應該猜到了。 :) –

1

抱歉,無法對答案的其餘部分,沒有足夠的代表直接評論。

只是一個加法:

connection = get_connection(host=my_host, 
           port=my_port, 
           username=my_username, 
           password=my_password, 
           user_tls=my_use_tls) 

應該

connection = get_connection(host=my_host, 
           port=my_port, 
           username=my_username, 
           password=my_password, 
           use_tls=my_use_tls) 

這只是如果你不使用TLS的問題(你應該),因爲它默認爲True。

+1

指出的那樣這兩個代碼甚至不同嗎? –

+0

@Manish,是的! 'user_tls'vs'use_tls' –

+0

@RajkumarRajendran:好的。無論如何,你可以剛剛提到那個特定的參數。 ;) –

相關問題