2017-05-08 8 views
0

GoogleからSMTPを使用してメールを送信しようとしています。私はすでに "settings.py"ファイルに設定変数を入れる電子メールを送ってきますが、これらの変数をビューで設定し、私の "Config"モデルを使ってそれらを設定する必要があります。Django:表示でメール設定を設定する

これは私のモデルコードです:

def send_custom_mail(request): 
    config = Config.objects.get(pk = 1) 
    EMAIL_HOST = config.smtp_server 
    EMAIL_PORT = config.smtp_port 
    EMAIL_HOST_USER = config.email_sender 
    EMAIL_HOST_PASSWORD = config.email_password 
    EMAIL_USE_TLS = True 
    DEFAULT_FROM_EMAIL = EMAIL_HOST_USER 
    subject = 'test' 
    msg = '<p>Test: <strong>Mensaje</strong>></p>' 
    mail_from = config.email_sender 
    mail_to = ['{}'.format(email)] 
    from django.core.mail import EmailMessage 
    email2send = EmailMessage(subject, msg, mail_from, to=mail_to) 
    email2send.content_subtype = "html" # Main content is now text/html 
    email2send.send() 

私の問題:私はビューで変数を設定するときに電子メールが送信されない

class Config(models.Model): 
    email_sender = models.CharField(max_length = 100, default = '', blank = True) 
    email_password = models.CharField(max_length = 30, default = '', blank = True) 
    smtp_server  = models.CharField(max_length = 100, default = '', blank = True) 
    smtp_port  = models.PositiveIntegerField(default = 587, blank = True) 

これが私の見解コードです。

私はこれらの変数をdinamically設定する必要がありますので、設定ファイルに書き込めません。

+0

うーん、コードの設定方法が分かりません。ビュー内からDjango設定変数(例えば '' EMAIL_HOST'')を設定しようとしていますか?もしそうなら、Djangoの設定を変更するのではなく、ローカルスコープ内の変数を設定するだけなので、あなたが得たものは動作しません。ビュー内から設定値を変更する方法について質問がありますか? –

+0

@RodManningええ、それは私がしたいことです。ビュー内からこれらの変数を設定して動的にする必要があります。 – Nazkter

答えて

1

私は、ビュー内の設定を上書きしなければならないということに少し困惑しています。これまでのユースケースは見たことがありません。

私は通常、下位レベルの機能のいずれかにフォールバックする戦略を使用します。

send_mail()関数とget_connection()関数を使用すると、必要と思われるものを実現することができます。

は、このコードをテストしたが、それは次のようになります考えていませんがあります:

from django.core import mail 

connection = mail.get_connection(
    host = config.smtp_server, 
    port = config.smtp_port, 
    username = config.email_sender, 
    password = config.email_password , 
    (... etc etc ...) 
) 

# Manually open the connection 
connection.open() 

# Send the message 
subject = 'test' 
msg = 'Test:Mensaje' 
mail_to = ['[email protected]'] 
email2send = EmailMessage(
    subject, 
    msg, t 
    o=mail_to 
    connection=connection 
) 

# Send the email using the custom connection 
email2send.send() 

# Close the connection 
connection.close() 

(。EmailMessageのは、カスタム接続を介して電子メールを送信する最初のセットアップがあるときconnection=connection注)

Django Email Backendsドキュメントはこれを非常にうまく説明していますが、これは設定を上書きするよりも簡単な方法です。

+0

これはうまく動作し、より良いアプローチであるようです – Nazkter

0

私はこの解決策を見つけたが、それはこの問題をaproachするための最良の方法である場合、私は知らない。

この使用:

:私の見解では https://docs.djangoproject.com/en/1.11/_modules/django/test/utils/#override_settings

を私は設定変数を書き換えて

from django.core.mail import EmailMessage 
from django.test.utils import override_settings 

@override_settings(EMAIL_HOST = Config.objects.get(pk = 1).smtp_server) 
@override_settings(EMAIL_HOST_USER = Config.objects.get(pk = 1).email_sender) 
@override_settings(EMAIL_PORT = Config.objects.get(pk = 1).smtp_port) 
def send_custom_mail(request): 
subject = 'test' 
    msg = 'Test:Mensaje' 
    mail_to = ['[email protected]'] 
    email2send = EmailMessage(subject, msg, to=mail_to) 
    email2send.content_subtype = "html" # Main content is now text/html 
    email2send.send() 

このaproachでは、 "send_custom_mail"関数の前にデコレータ "@override_settings()"を置くために "django.test.utils"を使います。これは設定を上書きし、Configというモデルに保存されたメールから電子メールを送信させます。

実際には、 "django.test"モジュールは単体テストで使用するための最良の方法かどうかはわかりませんが、私は自分の解決策を共有したいと思います。

+0

他の人がこれに近づく正しい方法に答えることができれば、私は彼/彼女に正しい答えを与えることをうれしく思うでしょう。 – Nazkter

関連する問題