recipient_list仅将邮件发送到列表中的第一个地址

时间:2016-04-22 23:35:09

标签: django email django-signals django-email

我根据某些操作使用信号向用户发送邮件。在我的一个信号中,我需要向多个用户发送相同的邮件,我的信号使用post_save因此对于参数[recipient_list]我使用此instance.email_list email_list是我存储电子邮件列表的位置发送邮件的地址,它们以user1@mail.com, user2@mail.com, user3@mail.com格式存储。

要发送我使用的电子邮件EMAIL_HOST = 'smtp.gmail.com',问题是收到电子邮件的唯一用户是列表中的第一个用户。所以我'登录'在gmail帐户中检查发送电子邮件部分,实际上在电子邮件显示的“到”区域发送给列表中的所有用户,但电子邮件永远不会到达第一个电子邮件地址清单。

我看到,如果谷歌检测到该帐户发送了大量邮件,则可能会被阻止,但只能同时发送5封电子邮件,当我在帐户中时,从未向我显示某些警报或其他内容。

问题是我如何发送电子邮件或者gmail帐户的一些错误配置?

非常感谢任何帮助。

抱歉我的语法不好。

编辑:这是我的代码。

forms.py

class MyForm(forms.Form):
    userslist = forms.ModelChoiceField(queryset = User.objects.filter(here goes my condition to show the users), empty_label='List of users', label='Users', required=False)
    emailaddress = forms.CharField(max_length=1000, label='Send to:', required=False)
    comment = forms.CharField(widget=CKEditorUploadingWidget(), label="Comment:")

该表单显示用户列表,以便在字段emailaddress中选择电子邮件地址存储值。这是我的Ajax带来的电子邮件地址:

views.py

class mails(TemplateView):
    def get(self, request, *args, **kwargs):
        id_user = request.GET['id']
        us = User.objects.filter(id = id_user)
        data = serializers.serialize('json', us, fields=('email'))
        return HttpResponse(data, content_type='application/json')

这是我用来填充emailaddres字段的<script>

<script>
    $('#id_userlist').on('change', concatenate);
    function concatenate() {
        var id = $(this).val();
        $.ajax({
            data: { 'id': id },
            url: '/the_url_to_get_data/',
            type: 'get',
            success: function (data) {
                var mail = ""
                for (var i = 0; i < data.length; i++) {
                    mail += data[i].fields.email;
                }
                var orig = $('#id_emailaddress').val();
                $('#id_emailaddress').val(orig + mail + ',');
            }
        })
    }
</script>

我用来发送邮件的信号是:

@receiver(post_save, sender=ModelOfMyForm, dispatch_uid='mails_signal')
def mails_signal(sender, instance, **kwargs):
    if kwargs.get('created', False):
        if instance.emailaddress:
            #Here goes the code for the subject, plane_message,
            #from_email and template_message.
            send_mail(subject, plane_message, from_email, [instance.emailaddress], fail_silently=False, html_message=template_message)

因此,如果我选择4个用户,则信息将以这种方式保存在数据库中:

data info

然后我在帐户中“登录”以检查“已发邮件”部分,并检查邮件的详细信息并显示发送给4位用户但显示该邮件的唯一用户是列表中的第一位用户

enter image description here

1 个答案:

答案 0 :(得分:2)

您的问题是您在instance.emailaddressfirst@gmail.com, second@hotmail.com, third@hotmail.com等)内传递逗号分隔的电子邮件地址字符串。 Django期望Python的地址列表,而不是逗号分隔的字符串。它会在第一个逗号后忽略所有内容。

按如下方式更改您的代码,它将起作用:

def mails_signal(sender, instance, **kwargs):
    if kwargs.get('created', False):
        if instance.emailaddress:
            #Here goes the code for the subject, plane_message,
            #from_email and template_message.
            recipients = [r.strip() for r in instance.emailaddress.split(',')]
            send_mail(subject, plane_message, from_email, recipients, fail_silently=False, html_message=template_message)