【问题标题】:How to send an email after User post the form?用户发布表单后如何发送电子邮件?
【发布时间】:2018-12-04 02:03:00
【问题描述】:

我是初学者并使用了从https://docs.djangoproject.com/en/2.0/topics/email/ 发送电子邮件的步骤 但我没有完成发送电子邮件。

我想在用户提交表单后使用 django 电子邮件自动发送电子邮件。在用户发布表格后,我有一个预订表格并在其中包含电子邮件字段,我想发送一封电子邮件“谢谢您的预订/您的预订已下达”。

例如

  1. 名字:阿布巴卡尔
  2. 姓氏:Afzal
  3. 电子邮件:any@gmail.com

我想使用 any@gmail.com 并向其发送电子邮件。用户发布表单后。

settings.py

EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'my@gmail.com'
EMAIL_HOST_PASSWORD = 'mypassword'
EMAIL_USE_TLS = True

View.py

     class BookingView(FormView):
         template_name = 'buggy_app/booking.html'
         form_class = BookingForm
         models = Booking
         def form_valid(self, form):
             car_id = self.request.GET.get('car', '')
             car = Car.objects.get(id=car_id)
             car.is_available_car = False
             car.save()
             form.save()
             return super(BookingView, self).form_valid(form)
        success_url = reverse_lazy('index')

Forms.py

      class BookingForm(ModelForm):

         class Meta:
            model = Booking
             widgets = {
             times_pick': TimePickerInput(),  }
             fields = ('first_name','last_name','email','book_car','contact_number','times_pick',)

【问题讨论】:

    标签: django django-forms django-email


    【解决方案1】:

    您可以定义一个名为 send_emails(或任何名称)的函数。并从 form_valid 方法中调用 taht 函数。它看起来像这样

       def form_valid(self, form):
            car_id = self.request.GET.get('car', '')
            car = Car.objects.get(id=car_id)
            car.is_available_car = False
            car.save()
            form.save()
            form.cleaned_data.get('username')
            first_name = form.cleaned_data.get('first_name')
            last_name = form.cleaned_data.get('last_name')
            to_email = form.cleaned_data.get('email')
    
            #your function here
            send_emails(first_name, last_name, to_email)
    

    然后定义类似这样的函数。

    def send_emails(first_name, last_name, to_email):
        #get template
        htmly = get_template('email_templates/welcome.html')
        #create a context
        d = {'first_name':first_name, 'last_name':last_name}
        subject, from_email, to = 'Subject line', settings.EMAIL_HOST_USER, to_email
        #pass the context to html template
        html_content = htmly.render(d)
        msg = EmailMultiAlternatives(subject, html_content, from_email, [to])
        msg.attach_alternative(html_content, "text/html")
        msg.send()
    

    【讨论】:

    • 我复制了你的代码,但它不起作用。你能用我的内容编辑你的答案吗@ojas
    • d = {传递您要发送到 html 模板的任何上下文数据} 无效语法
    • 我已经更新了上下文。这是总体思路。
    • name 'settings' 未定义提交表单后
    • 从 django.conf 导入设置
    【解决方案2】:
    class BookingView(FormView):
         template_name = 'buggy_app/booking.html'
         form_class = BookingForm
         models = Booking
         def form_valid(self, form):
             car_id = self.request.GET.get('car', '')
             car = Car.objects.get(id=car_id)
             car.is_available_car = False
             car.save()
             form.save()
             subject = 'Thankyou for your booking / your booking is placed'
             message = 'Thankyou for your booking / your booking is placed'
             email_from = settings.EMAIL_HOST_USER
             recipient_list = [any@gmail.com]
             send_mail( subject, message, email_from, recipient_list )
             return super(BookingView, self).form_valid(form)
        success_url = reverse_lazy('index')
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多