32

Djangoにメールを送信させる方法は、以下に示す標準設定を使用してここでうまく説明されています。

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = "mail.mysmtpserver.somewhere"
#EMAIL_PORT
EMAIL_HOST_USER = "my@login"
EMAIL_HOST_PASSWORD = "mypassword"
#EMAIL_USE_TLS = True

次に、を使用django.core.mail.EmailMessageして送信します。

ただし、複数のサイトを実行していて、それぞれが独自のSMTPサーバー(または同じSMTPサーバーでの異なるログイン)を介して電子メールを送信する必要がある場合はどうでしょうか。

このようなEmailBackendを検索したり、現在のバックエンドでそれを行う方法を検索しても、満足のいく結果は得られませんでした。

4

5 に答える 5

43

提供された設定を上書きしたい場合は、独自の接続を作成して、send_emailまたはに提供することができますEmailMessage

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の回答は、接続がSMTP用にキャッシュされていることを示すコードを示しています。@dhackner answerは、withステートメントを使用して接続を自動的に閉じる方法を示しています。

于 2013-01-18T11:38:19.257 に答える
19

ドキュメントのようにコンテキストマネージャーを使用するように、DanielBackmanの回答を少し変更します。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, 
    use_tls=my_use_tls
) as connection:
    EmailMessage(subject1, body1, from1, [to1],
                 connection=connection).send()

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

于 2014-04-28T20:50:35.250 に答える
2

申し訳ありませんが、残りの回答に直接コメントすることはできません。担当者が足りません。

たった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)

デフォルトでTrueに設定されているため、TLSを使用していない場合(および使用する必要がある場合)にのみ問題が発生します。

于 2014-06-03T08:12:24.463 に答える
1

djangoのメールバックエンドを見て、カスタマイズしたものを作成するのもいいかもしれません。

コードは次のとおりです:https ://github.com/django/django/blob/master/django/core/mail/backends/smtp.py

この例は、カスタムのものを作成する方法を示しています(これはSMTPの代わりにSMTP_SSLを使用します):

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

そして、私はそれをフォークして、両方を組み合わせました(したがって、異なるメール設定を持つ異なるサイトに1つのバックエンドを使用できます):

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

それが機能するかどうかはわかりませんが、上記のすべてのコードは、すでに接続が存在する場合に接続を開くと戻ります...したがって、ソリューションの開始点があるかもしれません....それをしないで、閉じてください接続を開き、別の設定で再度開きます...(それが機能するかどうかはわかりません)。

于 2013-04-18T20:14:06.953 に答える
0

サイトごとに異なる構成を使用します。

1つの方法は、サイトごとsettings.pyに、を使用することです。settings_SITENAME.pyこれらのファイルには、カスタムメールサーバー設定があります。各サイトにはsettings_local.py、独自のカスタム設定ファイルへのシンボリックリンクがあります

次に、このスタンザをsettings.py:の下部に配置します。

try:                                                                                                                                                                            
    from settings_local import *                                                                                                                                                
except ImportError:                                                                                                                                                             
    pass  

これで、サイトごとのカスタム設定ができました

于 2012-11-27T19:18:58.913 に答える