【问题标题】:Email to multiple Users via Send Grid APis通过 Send Grid API 向多个用户发送电子邮件
【发布时间】:2015-02-25 09:04:27
【问题描述】:

我是 Django 新手,在 django 中盯着我的第一个应用程序,我正在向我的用户发送有关特定事件的电子邮件。我正在使用 SendGrid API 发送电子邮件。我编写了以下代码来向单个用户发送电子邮件,这对我有用。但想一次向多个用户发送电子邮件。我还有一张供用户使用的桌子。我需要从列表中的数据库中获取所有用户并立即向他们发送电子邮件。

注意我刚开始学习django,对django orm知之甚少。

这里是通过html表单从用户那里获取消息主题和内容并发送给单个用户的功能。现在我已经硬编码了收件人的电子邮件。

def send_message(request):
    Message_Subject = str(request.POST.get('Subject'))
    Message_Content = str(request.POST.get('Content'))
    Message_Type = str(request.POST.get('optionsRadios'))
    Message.objects.create(MessageSubject= Message_Subject, MessageContent=Message_Content)
    sg = sendgrid.SendGridClient(settings.SENDGRID_USERNAME, settings.SENDGRID_PASSWORD)
    message = sendgrid.Mail()
    message.add_to('user@bar.com')
    message.set_subject(Message_Subject)
    message.set_html(Message_Content)
    message.set_text(Message_Content)
    message.set_from('Emailer System <foo@example.com>')
    status, msg = sg.send(message)
    if status == 200:
        messages.success(request, 'Your email was successfully sent.')
    else:
        messages.error(request, msg)
    return render_to_response('send_message.html', context_instance=RequestContext(request))

这是我的 model.py 文件

从 django.db 导入模型

class Users(models.Model):
    UserID = models.IntegerField(verbose_name='User ID',max_length=255,primary_key=True,blank=True)
    UserName = models.CharField(verbose_name='User Name',max_length=254,null=True,blank=True)
    Email = models.EmailField(verbose_name='Email',max_length=254,null=True,blank=True)
    Phone = models.CharField(verbose_name='Phone Number',max_length=254,null=True,blank=True)

class Message(models.Model):
    MessageID = models.AutoField(verbose_name='Message ID',primary_key=True)
    MessageSubject = models.CharField(verbose_name='Subject',max_length=255,null=True,blank=True)
    MessageContent = models.TextField(verbose_name='Content',null=True,blank=True)
    MessageType = models.CharField(verbose_name='Message Type',max_length=255,default='Email',null=True,blank=True)

class Log_Messages(models.Model):
    LogID = models.AutoField(verbose_name='Log ID',primary_key=True)
    MessageID = models.ForeignKey(Message,verbose_name='Message ID',null=True, blank=True)
    UserID = models.ForeignKey(Users,verbose_name='User ID',null=True, blank=True)
    Status = models.BooleanField(default=False)
    SentDateTime = models.DateTimeField(default=datetime.now(), blank=None, null=None)

【问题讨论】:

  • message.add_to('taqi.hassan@cogilent.com') 你可以尝试传递电子邮件地址列表,如 ["abc@gmail.com","xyz@gmail.com", 。 ..] 在上述声明中。它对我有用-对于 smtplib 这是用于发送电子邮件的 python lib。

标签: python django sendgrid


【解决方案1】:

您所要做的就是将您的电子邮件发送代码放入一个循环中,然后从数据库中读取。您应该使用 django 附带的表单 api(请参阅文档中的 Working with Forms),以便在处理用户输入时更轻松。

这是一个帮助您入门的完整示例。

您的模型,其中Recipient 是最终用户。我还将它链接到消息,以便您可以记录每条消息的每个收件人的传递状态:

class Message(models.Model):
    subject = models.CharField(max_length=200)
    content = models.TextField()
    mtype = models.CharField(max_length=1, choices=(('1','Normal Message'),
                                                    ('2','Other Message'),))
class Recipient(models.Model):
   email = models.EmailField()
   message = models.ForeignKey(Message)
   delivered = models.BooleanField(default=False)
   status = models.CharField(max_length=200, blank=True, null=True)

下一步是为您的消息模型创建一个表单。你可以把它放在你的views.py 中,但惯例是创建一个名为forms.py 的新文件并将它放在那里。确保导入模型:

from .models import Message


class MessageForm(forms.ModelForm):
    class Meta:
        model = Message

现在在您看来,您将使用表单来收集要发送的消息,然后遍历收件人并向每个收件人发送一条消息。每次交付的状态都与收件人模型一起记录。

最后,由于这是一个发布请求,您应该重定向用户(而不是重新加载页面)。

def send_message(request):
    form = MessageForm(request.POST or None)
    if form.is_valid():
        data = form.save() # This the new message object that was
                           # saved from the data in the form.

        sg = sendgrid.SendGridClient(settings.SENDGRID_USERNAME,
                                     settings.SENDGRID_PASSWORD)

        for user in Recipient.objects.all():  # Loop through all users.
            message = sendgrid.Mail()
            message.add_to(user.email)  # Fetch the email address for each user.
            message.set_subject(data.subject)
            message.set_html(data.content)
            message.set_text(data.content)
            message.set_from('Django Mailer <foo@example.com>')
            status, msg = sg.send(message)
            if status == 200:
                user.received = True
            else:
                user.received = False
            user.message = data # Log which message was sent to this user
            user.status = msg # Log any error message from Sendgrid
            user.save()
         return redirect('/thank-you/')  # Redirect to some thank you page.

    return render(request, 'form.html', {'form': form})

【讨论】:

  • 我了解您对消息模型、形式和功能的逻辑。但不了解收件人模型。你能解释一下它的作用是什么吗?
  • 看看我现在更新的问题。我有存储所有信息的用户表。现在我只想从管理员那里获取他输入的任何消息,然后发送给表中的每个用户并维护这些消息的日志。我已经在 asp.net 中完成了这项工作,但我是 django 新手,所以我在我的第一个应用程序中需要一些帮助/指导。
  • 收件人模型存储电子邮件地址,并且对于每个电子邮件地址,它存储指向消息和传递状态的链接以及任何错误消息。它充当传输的记录器。我想你肯定可以从我给出的例子中弄清楚其余的部分吗?您有什么具体问题吗?
  • 谢谢,但最后的帮助。你能告诉我如何在 django 中编写自定义 sql 查询以从数据库中获取数据。就像我们在 mysql 中所做的那样。例如从用户中选择 * 并将这些信息存储在 python 列表中。
  • 请浏览本教程的Playing with the API 部分。
【解决方案2】:

您可以尝试为每封电子邮件拨打add_to

... 

message = sendgrid.Mail()
user_emails = Users.objects.filter(is_active=True).values_list('email', flat=True)

for email in user_emails:
    message.add_to(email)

message.set_subject(Message_Subject)
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-06
    • 2012-05-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    相关资源
    最近更新 更多