【问题标题】:Django - How to add sender-name in Email?Django - 如何在电子邮件中添加发件人名称?
【发布时间】:2017-10-19 23:42:47
【问题描述】:

我想要实现的是让当前登录用户的发送者名称与关联名称显示在接收者收件箱中,如下所示:

'associaton-name'@domain.com

我已经在下面评论了它,我试图在views.py 中实现它

经过几天和几个小时的工作,似乎找不到任何相关的解决方案。

非常感谢您的帮助,伙计们!

Django:1.10
蟒蛇:3.6


views.py

class mailPost(FormView):
   success_url = '.'
   form_class = mailHandler
   template_name = 'post/post.html'

   def form_valid(self, form):
       messages.add_message(self.request, messages.SUCCESS, 'Email Sent!')
       return super(mailPost, self).form_valid(form)

   def form_invalid(self, form):
       messages.add_message(self.request, messages.WARNING,
                         'Email not sent. Please try again.')
       return super(mailPost, self).form_invalid(form)

   def post(self, request, *args, **kwargs):
       form_class = self.get_form_class()
       form = self.get_form(form_class)

       if form.is_valid():
           sender = "noreply@domain.com"      # Instead of noreply I wish for current requested associaton name
           receiver = form.cleaned_data.get('receiver')
           cc = form.cleaned_data.get('cc')
           bcc = form.cleaned_data.get('bcc')
           subject = form.cleaned_data.get('subject')
           message = form.cleaned_data.get('message')
           time = datetime.now()
           asoc_pk = Association.objects.filter(asoc_name=self.request.user.association)
           asoc = Association.objects.get(id=asoc_pk)

           Email.objects.create(
               sender=sender,
               receiver=receiver,
               cc=cc,
               bcc=bcc,
               subject=subject,
               message=message,
               association=asoc,
               sentTime=time
           )

           msg = EmailMultiAlternatives(subject, message, sender, [receiver], bcc=[bcc], cc=[cc])
           msg.send()

           return self.form_valid(form)
       else:
           return self.form_invalid(form)

models.py

class Email(models.Model):
   sender = models.CharField(max_length=254)
   sentTime = models.DateTimeField(auto_now_add=True, blank=False)
   subject = models.CharField(max_length=254)
   receiver = models.CharField(max_length=254)
   cc = models.CharField(max_length=254)
   bcc = models.CharField(max_length=254)
   message = models.TextField()
   association = models.ForeignKey(Association)

   class Meta:
       db_table = 'Email'    


class Association(models.Model):
    asoc_name = models.CharField(max_length=50, null=True, blank=True, unique=True)


   class Meta:
       db_table = 'Association'     


class Administrator(AbstractUser):
   ...
   association = models.ForeignKey(Association)


   class Meta:
       db_table = 'Administrator'

【问题讨论】:

  • 关联名和当前用户是什么关系?
  • @HaifengZhang - 抱歉忘记添加User 模型。现在在上方可见。

标签: django python-3.x python-3.6 django-1.10


【解决方案1】:

我不确定我是否正确理解了您的问题。您可以通过调用self.request.user 来访问经过身份验证的用户(假设您使用的是 Django 身份验证系统)。

您必须在Association 和用户之间建立关系:

class Association(models.Model):
    asoc_name = models.CharField(max_length=50, null=True, blank=True, unique=True)
    # Option 1 - if one user can be a member of several associations
    members = models.ManyToMany(User)

   class Meta:
       db_table = 'Association'

如果用户只能是一个关联的成员,则为新模型实例:

# Option 2
class Membership(Model):
    association = models.ForeignKey(Association)
    user = models.ForeignKey(User, unique=True)

您使用直接查找(或反向关系)获得关联。

 # option 1
 if form.is_valid():
       sender = Association.objects.filter(members=self.request.user).first()
       # sender might be None

 # option 2
 if form.is_valid():
       membership = Membership.objects.filter(user=self.request.user).first()
       if membership:
           sender = membership.association

https://docs.djangoproject.com/en/1.11/topics/db/examples/many_to_many/

【讨论】:

  • 我只想获取作为关联成员的当前用户..并获取该关联的名称并将其作为发件人电子邮件的一部分传递:例如dortmund@gmail.com 其中 dortmund 是关联名称
  • 我还是看不出问题出在哪里——你为什么不能用self.request.user使用Django的ORM查询?
  • form.is_valid() 中的选项 2 几乎可以工作,但我不断收到此错误:从多特蒙德向 reciever@gmail.com 发送消息 ...Mailgun API 响应 400: { "message ": "'from' 参数不是有效地址。请检查文档" } 看来我最后只需要 @domain.com 就可以了
猜你喜欢
  • 2019-11-15
  • 1970-01-01
  • 2011-10-07
  • 2013-08-19
  • 2016-09-27
  • 2018-02-16
  • 2011-02-13
  • 2021-04-13
相关资源
最近更新 更多