2017-05-08 150 views
0

我试图从Google发送使用SMTP的电子邮件。我已经发送了一封电子邮件,将设置变量放在文件“settings.py”中,但我需要在视图中配置这些变量并使用我的“配置”模型进行设置。Django:在视图中设置电子邮件设置

这是我的模型代码:

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) 

这是我的看法代码:

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() 

我的问题:当我设置视图中的变量电子邮件不会被发送。

我需要配置这些变量dinamically所以我不能写在setting.py文件中。

+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() 

(注意connection=connection当EmailMessage是第一次设置通过自定义连接来发送电子邮件)

Django Email Backends docs很好地解释了这一点,而且这似乎是一种比覆盖设置更直接的方式。

+0

它工作正常,似乎是一个更好的方法 – Nazkter

0

我发现这个解决办法,但我不知道这是否是对的形式给出这个问题的最好方法:在使用本

https://docs.djangoproject.com/en/1.11/_modules/django/test/utils/#override_settings

在我看来,我overrride设置变量:

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() 

在这个问题中,我使用“django.test.utils”将装饰器“@override_settings()”放在“send_custom_mail”函数之前。它覆盖了设置,让我从保存在名为Config的模型中的邮件发送邮件。

实际上,我不确定它是否是最好的答案,因为“django.test”模块是用于单元测试,但我想分享我的解决方案。

+0

如果还有其他人可以回答正确的解决方法,我会很乐意为他/她提供正确的答案。 – Nazkter