使用烧瓶+蓝图发送邮件
Posted
技术标签:
【中文标题】使用烧瓶+蓝图发送邮件【英文标题】:Sending mail using flask + blueprint 【发布时间】:2018-02-27 03:34:13 【问题描述】:我有一个关于蓝图结构的问题
我的烧瓶结构看起来像
app/
main/
__init__.py
mail.py
__init.py
manage.py
config.py
我在 __init__.py 中注册了蓝图,用于app/__init__.py
from flask_mail import Mail
from flask import Flask
mail = Mail()
def create_app(config_name='develop'):
app = Flask(__name__)
from config import cfg # load EMAIL config from config.py
app.config.from_object(cfg[config_name])
cfg[config_name].init_app(app)
from .main import main # register blueprint
app.register_blueprint(main)
mail.init_app(app) # load related mail config???
return app
将配置放入config.py
class Config():
MAIL_SERVER='<My e-mail SMTP>'
MAIL_DEFAULT_SENDER=('TOPIC', 'mailID')
MAIL_USERNAME='<EMail>'
MAIL_PASSWORD='<EMail Password>'
当我在app/main/mail.py
中编写这样的代码时,它返回 smtplib.SMTPSenderRefused 错误
@main.route('/mail')
def sendmail():
receivers = ['<Receiver 1>', '<Receiver 2>']
app = current_app._get_current_object() # <class 'flask.app.Flask>
mail = Mail(app)
with mail.connect() as conn:
for receiver in receivers:
msg = Message(
subject='subject test',
recipients=[receiver],
html='<h1>Hi~~</h1>')
mail.send(msg)
return 'ok'
它会引发 553 错误
smtplib.SMTPSenderRefused: (553, b'Domain name required.', '=?utf-8?q?<TOPIC>?= <mailID>')
我确实在app/__init__.py
中加载了配置,但是为什么我在app/main/mail.py
中找不到 MAIL_SERVER 和相关配置?
但是如果我在app/main/mail.py
重新加载配置,它会成功发送邮件
app.config.update(
MAIL_SERVER='<SMTP>',
MAIL_DEFAULT_SENDER=('<TOPIC>', 'mailID'),
MAIL_USERNAME='<email>',
MAIL_PASSWORD='<PASSWORD>'
)
我不知道为什么我必须做两次
【问题讨论】:
【参考方案1】:你应该像这样使用 app_context():
from flask import current_app
from flask_mail import Message, Mail
with current_app.app_context():
mail = Mail()
mail.send(msg)
更多信息https://flask.palletsprojects.com/en/1.1.x/extensiondev/
【讨论】:
【参考方案2】:以下代码是用于发送邮件正文的渲染 HTML 模板,包括样式或格式化的 HTML。
from <project-module> import mail
token = user.get_reset_token()
msg = Message('Password Reset Request', sender='<sender-mail>', recipients=[user.email])
msg.html = render_template('email_templates/password_reset.html',
home_link=url_for('home.index', _external=True),
reset_link=url_for(
'account.reset_token', token=token, _external=True),
name=user.name,
email=user.email)
mail.send(msg)
正如您在上面提到的代码。我已经两次初始化 Mail 对象,这是不必要的。
@main.route('/mail')
def sendmail():
receivers = ['<Receiver 1>', '<Receiver 2>']
mail = Mail()
with mail.connect() as conn:
for receiver in receivers:
msg = Message(
subject='subject test',
recipients=[receiver],
html='<h1>Hi~~</h1>')
mail.send(msg)
return 'ok'
【讨论】:
【参考方案3】:不是直接回答你的问题,但实际上我认为你不需要初始化邮件两次。
如果您要在app/main/mail.py
中初始化邮件,那么在app/__init__.py
中添加mail.init_app(app)
毫无意义,因为您从未导入过它。
否则,在app/main/mail.py
中,我会在不创建另一封邮件的情况下执行import app.mail
,这样一来您就不会遇到此配置问题。
【讨论】:
以上是关于使用烧瓶+蓝图发送邮件的主要内容,如果未能解决你的问题,请参考以下文章