微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将 Sengrid 链接到 Flask 中的联系表单以转发电子邮件

如何解决如何将 Sengrid 链接到 Flask 中的联系表单以转发电子邮件

我正在编写一个 Web 应用程序并尝试使用 sendgrid 来处理电子邮件传送服务。

我正在用 Flask 编写应用程序。

现在我有一个联系表格,我的问题是只有当我使用 sendgrid 从我预先批准的电子邮件地址发送电子邮件时,电子邮件才会被发送。显然这不好,因为其他填写电子邮件表格的人都不会通过。

这是我拥有的代码

路线

app.config['MAIL_SERVER'] = 'smtp.sendgrid.net'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = 'apikey'
app.config['MAIL_PASSWORD'] = os.environ.get('SENDGRID_API_KEY')
app.config['MAIL_DEFAULT_SENDER'] = os.environ.get('MAIL_DEFAULT_SENDER')


@app.route('/contact',methods=['GET','POST'])
def contactpage():
    if request.method == 'POST':
        print("Message sent")
        print(request.form.to_dict())
        m = message(request.form.to_dict())
        m.send()
    title = "Jonathan Bechtel contact form"
    description = "Contact Jonathan Bechtel with questions about teaching or working with him"
    return render_template("contact.html",title=title,description=description)

这是我实际发送电子邮件代码

import os
from sendgrid import SendGridapiclient
from sendgrid.helpers.mail import Mail
class message():

    def __init__(self,message_data):
        for key in message_data:
            print(key,message_data[key])
            setattr(self,key,message_data[key])

    def send(self):
        message      = Mail(
        from_email   = self.email,to_emails    = 'jonathanbechtel@gmail.com',subject      = 'Sample Email Message',html_content = f'<strong>From: {self.email}</strong><br><strong>Reason: {self.reason}</strong><br><strong>Message:</strong>{self.message}')
        try:
            sg = SendGridapiclient(os.environ.get('SENDGRID_API_KEY'))
            response = sg.send(message)
        except Exception as e:
            print(e)

如果我将联系表单中的 from 地址设置为我自己的地址,则电子邮件可以正常工作。但是,如果我使用任何其他消息,则消息不会通过并生成 403 状态代码

我认为这意味着我没有使用正确的 API 部分,但不确定从哪里开始。

谢谢。

解决方法

这里是 Twilio SendGrid 开发者布道者。

SendGrid 不允许您仅从任何电子邮件地址发送电子邮件。我可以看到,在这种情况下,您只是想创建一个仅向您的电子邮件地址发送电子邮件的联系表单,因此能够从任何电子邮件地址发送电子邮件可能会有用。但是考虑一个允许用户设置收件人和发件人地址的表单,您会发现这可能会被滥用。

你可以read more about sender identity and SendGrid here

与此同时,对于您的用例,这是我的建议。

将发件人电子邮件设置为您预先批准的电子邮件地址,在电子邮件正文中包含用户的电子邮件地址,就像您已经在做的那样。然后将用户的电子邮件也添加为回复电子邮件,这样您就可以回复电子邮件并将其直接发送给用户。

我相信您可以使用 mail 对象的 reply_to 方法设置回复:

    def send(self):
        message      = Mail(
        from_email   = APPROVED_SENDGRID_EMAIL,to_emails    = 'jonathanbechtel@gmail.com',subject      = 'Sample Email Message',html_content = f'<strong>From: {self.email}</strong><br><strong>Reason: {self.reason}</strong><br><strong>Message:</strong>{self.message}')

        # Set the reply-to email
        message.reply_to(self.email)

        try:
            sg = SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
            response = sg.send(message)
        except Exception as e:
            print(e)

有关详细信息,请参阅 the examples in the helper library

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。