recipient_list 只向列表中的第一个地址发送邮件

recipient_list send mail just to the first address in the list

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

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

我读到,如果 google 检测到该帐户发送大量消息可能会被阻止,但同时只能发送 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:")

该表单显示用户列表,以 select 电子邮件地址字段中的电子邮件地址存储值。这是我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')

这是我用来填充电子邮件地址字段的 <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)

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

然后我 'log in' 在帐户中检查 'Sent Mail' 部分并检查邮件的详细信息,并显示已发送给 4 个用户,但唯一接收邮件的用户是列表中的第一个。

您的问题是您在 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)