📅  最后修改于: 2021-01-02 04:34:07             🧑  作者: Mango
考虑到Flask是一个微型框架,因此在为开发人员提供设施方面存在局限性。虽然,对烧瓶有一些扩展,例如Mail,WTF,SQLite,SQLAlchemy等,这使开发人员可以为用户提供一些基本功能。
在本教程的这一部分中,我们将研究烧瓶的最常见扩展之一,即Flask-Mail。
Web应用程序必须能够向用户发送电子邮件。 flask-mail扩展为开发人员和电子邮件服务器提供了简单的界面,以通过Web应用程序发送电子邮件。
为此,我们必须使用pip安装程序安装flask-mail扩展。
应用程序必须为以下参数配置flask-mail。
SN | Parameter | Description |
---|---|---|
1 | MAIL_SERVER | It represents the name or IP address of the email server. The default is localhost. |
2 | MAIL_PORT | It represents the port number of the server. Default port number is 25. |
3 | MAIL_USE_TLS | It is used to enable or disable the transport security layer description. The default is false. |
4 | MAIL_USE_SSL | It is used to enable or disable the secure socket layer description. The default value is false. |
5 | MAIL_DEBUG | It is used to provide the debug support to the mail application. The default value is None. |
6 | MAIL_USERNAME | It represents the user name of the sender. The default value is None. |
7 | MAIL_PASSWORD | It represents the password of the server email id. The default value is None. |
8 | MAIL_DEFAULT_SENDER | It is used to set the default sender id for the multiple emails. The default value is None. |
9 | MAIL_MAX_EMAILS | It is used to set the maximum number of email to be sent. The default value is None. |
10 | MAIL_SUPPRESS_SEND | Sending the mail is suppressed if the app.testing is set to the true. |
11 | MAIL_ASCII_ATTACHMENTS | If it is set to true, attached file names are converted to ASCII. The default is False. |
有几个类对于使用Python flask Web应用程序发送电子邮件很重要。
Message类将电子邮件消息绑定到一个简单的Message类实例中,以便可以在此实例上调用诸如attach()之类的重要方法。下面给出了实例化Message类的语法。
Flask-mail.Message(subject, recipients, body, html, sender, cc, bcc, reply-to, date, charset, extra-headers, mail-options, rcpt_options)
在Message类对象上可以调用以下方法。
邮件类对象用于发送电子邮件。通过将应用程序对象传递给Mail类构造函数来实例化Mail类,如下所示。
Flask-mail.Mail(app=None)
Mail类包含以下方法。
使用flask网络应用程序发送电子邮件涉及以下步骤。
步骤1:使用from-import语句导入所需的模块,例如flask-mail,flask。
from flask import *
from flask-mail import *
步骤2:配置Flask Mail。
app.config['MAIL_SERVER']='smtp.gmail.com'
app.config['MAIL_PORT']=465
app.config['MAIL_USERNAME'] = 'admin@gmail.com'
app.config['MAIL_PASSWORD'] = '******'
app.config['MAIL_USE_TLS'] = False
app.config['MAIL_USE_SSL'] = True
步骤3:实例化Mail类。
mail = Mail(app)
步骤4:在某些URL规则映射的函数,使用所需的属性实例化Message类。
@app.route('/')
def index():
msg = Message('subject', sender = 'admin@gmail.com', recipients=['username@gmail.com'])
msg.body = 'hi, this is the mail sent by using the flask web application'
return "Mail Sent, Please check the mail id"
以下示例包含一个Python脚本,我们将电子邮件发送到给定的电子邮件ID。
Mailer.py
from flask import *
from flask-mail import *
app = Flask(__name__)
#Flask mail configuration
app.config['MAIL_SERVER']='smtp.gmail.com'
app.config['MAIL_PORT']=465
app.config['MAIL_USERNAME'] = 'admin@gmail.com'
app.config['MAIL_PASSWORD'] = '******'
app.config['MAIL_USE_TLS'] = False
app.config['MAIL_USE_SSL'] = True
#instantiate the Mail class
mail = Mail(app)
#configure the Message class object and send the mail from a URL
@app.route('/')
def index():
msg = Message('subject', sender = 'admin@gmail.com', recipients=['username@gmail.com'])
msg.body = 'hi, this is the mail sent by using the flask web application'
return "Mail Sent, Please check the mail id"
if __name__ == '__main__':
app.run(debug = True)
我们的Python Web应用程序尝试登录到脚本中提到的email_id。如果您不允许您的Google帐户访问不太安全的应用程序,则可以阻止此尝试。在这种情况下,请访问链接https://www.google.com/settings/security/lesssecureapps并允许访问安全性较低的应用程序。
在现代的Web应用程序中,有时会使用程序随机生成的一次性密码来验证电子邮件。在此示例中,我们将创建一个Python脚本,该脚本接受用户的电子邮件ID作为来自用户的输入,并发送包含自动(随机)生成的(4位)一次性密码的电子邮件。
为了成功验证电子邮件ID,要求用户输入发送到上述电子邮件ID的otp。如果用户输入的OTP与随机生成的OTP相匹配,则将成功验证email-id,并向用户显示成功消息,否则验证失败,并向用户显示失败消息。
在下面的示例中,烧瓶脚本Mailer.py充当控制器,其功能分别与URL / verify和/ validate关联的verify()和validate()。这些功能还呈现HTML模板,以接受来自用户的输入并根据电子邮件验证显示结果。
Mailer.py
from flask import *
from flask_mail import *
from random import *
app = Flask(__name__)
mail = Mail(app)
app.config["MAIL_SERVER"]='smtp.gmail.com'
app.config["MAIL_PORT"] = 465
app.config["MAIL_USERNAME"] = 'username@gmail.com'
app.config['MAIL_PASSWORD'] = '*************'
app.config['MAIL_USE_TLS'] = False
app.config['MAIL_USE_SSL'] = True
mail = Mail(app)
otp = randint(000000,999999)
@app.route('/')
def index():
return render_template("index.html")
@app.route('/verify',methods = ["POST"])
def verify():
email = request.form["email"]
msg = Message('OTP',sender = 'username@gmail.com', recipients = [email])
msg.body = str(otp)
mail.send(msg)
return render_template('verify.html')
@app.route('/validate',methods=["POST"])
def validate():
user_otp = request.form['otp']
if otp == int(user_otp):
return "Email verified successfully
"
return "failure
"
if __name__ == '__main__':
app.run(debug = True)
index.html
index
verify.html
OTP Verification
以下模板提示用户输入email_id和密码。脚本Mailer.py将向用户输入的电子邮件ID发送包含一次性密码的电子邮件。
现在,提示用户输入发送到指定电子邮件的OTP。
函数validate()将用户输入的OTP与随机生成并邮寄到用户的电子邮件ID的OTP相匹配。在这种情况下,OTP是匹配的;因此用户将获得成功消息,如下图所示。
在上面的示例中,脚本仅向用户发送一封电子邮件以进行电子邮件验证。在Web应用程序中,有时需要在单个连接中发送多封电子邮件或大量电子邮件。
在这种情况下,我们可以在语句中使用Python ,一旦所有电子邮件发送完毕,该语句就会自动关闭连接对象。
from flask import *
from flask_mail import *
app = Flask(__name__)
app.config["MAIL_SERVER"]='smtp.gmail.com'
app.config["MAIL_PORT"] = 465
app.config["MAIL_USERNAME"] = 'admin@gmail.com'
app.config['MAIL_PASSWORD'] = '******'
app.config['MAIL_USE_TLS'] = False
app.config['MAIL_USE_SSL'] = True
users = [{'name':'john','email':'john@gmail.com'},{'name':'Ayush','email':'ayush@javatpoint.com'},{'name':'david','email':'david@gmail.com'}]
mail = Mail(app)
@app.route("/")
def index():
with mail.connect() as con:
for user in users:
message = "hello %s" %user['name']
msgs = Message(recipients=[user['email']],body = message, subject = 'hello', sender = 'david@gmail.com')
con.send(msgs)
return "Sent"
if __name__ == "__main__":
app.run(debug = True)
Flask使我们可以随邮件一起发送附件。为此,我们需要使用Flask类的open_resource()方法打开资源。然后,我们可以使用python-with语句将资源与消息一起附加。工作完成后,with语句自动关闭资源。
以下语法用于将附件与邮件一起发送。
with app.open_resource("image.png") as fp:
msg.attach("image.png", "image/png", fp.read())
下面给出了随邮件一起发送附件的flask脚本。
mailer_attach.py
from flask import *
from flask_mail import *
app = Flask(__name__)
app.config["MAIL_SERVER"]='smtp.gmail.com'
app.config["MAIL_PORT"] = 465
app.config["MAIL_USERNAME"] = 'admin@gmail.com'
app.config['MAIL_PASSWORD'] = '********'
app.config['MAIL_USE_TLS'] = False
app.config['MAIL_USE_SSL'] = True
mail = Mail(app)
@app.route("/")
def index():
msg = Message(subject = "hello", body = "hello", sender = "admin@gmail.com", recipients = ["ayush@javatpoint.com"])
with app.open_resource("/home/javatpoint/Desktop/galexy.jpg") as fp:
msg.attach("galexy.jpg","image/png",fp.read())
mail.send(msg)
return "sent"
if __name__ == "__main__":
app.run(debug = True)