烧瓶电子邮件API,可从表单标签获取信息

时间:2018-06-23 13:33:39

标签: python flask

我有一个联系页面,当用户提交消息时,我想在其中发送一些信息到我的电子邮件帐户。到目前为止,我已经为配置配置了一个send.py文件。

send.py

from flask import Flask
from flask_mail import Mail, Message

app =Flask(__name__)
mail=Mail(app)

app.config.update(
DEBUG=True,
#EMAIL SETTINGS
MAIL_SERVER='smtp.gmail.com',
MAIL_PORT=465,
MAIL_USE_SSL=True,
MAIL_USERNAME = '(myemailaccount)',
MAIL_PASSWORD = '(mypassword)'
)

mail=Mail(app)

@app.route("/")
def index():
    msg = Message(
          'Hello',
       sender='(myemailaccount)',
       recipients=
           ['(myemailaccount('])
    msg.body = "This is the email body"
    mail.send(msg)
    return "Sent"

if __name__ == "__main__":
    app.run()

在我的 routes.py 上,有一个关于页面,在该页面上,我呈现了一个HTML模板,该模板带有一些要显示的<form>标签在电子邮件中,如何将HTML代码呈现到我的 send.py 中。我应该先将其另存为 routes.py 中的参数吗?我应该在 routes.py 中添加我的 send.py 信息吗?

1 个答案:

答案 0 :(得分:1)

根据docs for flask-mailMessage类还接受和html参数。您需要做的就是分配一个值render_template("home.html"),以将呈现的html页面发送到电子邮件正文,假设home.html关于页面。您还必须确保home.html位于 templates 文件夹中,因为Flask会渲染该文件夹中的所有html模板。

我举一个小例子。请注意,我没有使用单独的 send.py ,因为我想在其他路由上调用send_message函数,因此我将其添加到了相同的 routes.py < / strong>文件:

项目结构:

root
└───templates
    |___ home.html
|___ routes.py

home.html

<!DOCTYPE html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Send Message</title>
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="">
</head>
<body>
    <form class="form-inline" action="/send_message" method="POST">
        <label>Enter name:</label>
        <input type="text" name="name">
        <input type="submit" value="Send Message" class="btn btn-primary">
        <p>{{confirm_msg}}</p>
    </form>
    <script></script>
</body>
</html>

routes.py

from flask import Flask, render_template, request
from flask_mail import Mail, Message

app =Flask(__name__)

app.config.update(
DEBUG=True,
#EMAIL SETTINGS
MAIL_SERVER='smtp.gmail.com',
MAIL_PORT=465,
MAIL_USE_SSL=True,
MAIL_USERNAME = 'myemailaccount',
MAIL_PASSWORD = 'mypassword'
)

mail=Mail(app)

@app.route("/")
def home():
    return render_template("home.html")

@app.route("/send_message", methods=['POST'])
def send_message():
    name = request.form.get('name')
    msg = Message(
       subject='Hello ' + name,
       sender='myemailaccount',
       recipients=
           ['myemailaccount'],
       html=render_template("home.html"))
    mail.send(msg)
    confirm_msg = "Your message has been sent!"
    return render_template("home.html", confirm_msg=confirm_msg)

    if __name__ == "__main__":
        app.run(debug=True, port=5000)

说明:

home.html 页面呈现了一个接受name的简单形式。使用Flask的send_message()函数将该名称发送到request.form.get()函数。然后,该名称将在电子邮件的主题行中发送。注意Message()类中的html参数,它在电子邮件正文中发送呈现的表单。最后,显示一条消息,确认已发送消息。由于这是一个POST请求(发送电子邮件),因此我们必须在<form>标签和路由/send_message中指定方法。 <form>标记还具有action属性,该属性在提交表单时通过send_message()路由对函数/send_message进行调用。

注意事项:

请确保在mail=Mail(app)之后调用app.config.update(),如上面的代码所示。这是为了确保在创建mail对象之前成功应用配置设置。接下来,您可能必须在gmail帐户中启用安全设置,才能发送电子邮件(我必须这样做)以进行测试。这是因为gmail将阻止所有不安全的尝试对您的帐户进行身份验证的应用。更多详细信息here

我已经测试了上面的代码,并成功接收了显示在电子邮件正文中的简单html form