如何适配flask-mail支持两个SMTP账号
How to adapt flask-mail to support two SMTP accounts
我正在使用 flask-mail to send from one account and it works fine. The unique information about multiple smtp accounts that I found in Google is this old comment。
我有:
MAIL_USERNAME = config.get('mail_service', 'USER')
MAIL_PASSWORD = config.get('mail_service', 'PASSWD')
MAIL_SERVER = config.get('mail_service', 'MAIL_SERVER')
MAIL_PORT = 587
MAIL_USE_TLS = True
mail = Mail()
def create_app(config_name):
app = Flask(__name__)
mail.init_app(app)
...
from flask_mail import Message
@app.route("/")
def index():
msg = Message("Hello", sender="from@example.com", recipients=["to@example.com"])
我不确定什么是最好的方法。可能在发送每封邮件时指定两个已配置的 SMTP 帐户之一?
知道如何实现吗?
您可以使用 config.json
文件来存储两个帐户的配置。然后,自定义函数可以在需要时使用该文件来提取值。以下代码显示了两个帐户的简单设置。关键要求是在每个路由中使用邮件对象 (mail.init_app()
) 初始化应用程序之前 更新应用程序配置。每个 smtp 帐户在其自己的路由中都有其 "message send" 操作。
config.json:
配置两个 SMTP Gmail 帐户
{
"MAIL_SERVER" : "smtp.gmail.com",
"MAIL_PORT" : 587,
"MAIL_USE_TLS": "True",
"MAIL_USERNAME" : ["smtp1@gmail.com", "smtp2@gmail.com"],
"MAIL_PASSWORD" : ["pwd_for_smtp1", "pwd_for_smtp2"]
}
代码:
为了测试此代码,我将测试电子邮件从 smtp1@gmail.com 发送到 smtp2@gmail.com,反之亦然。当您访问本地主机上的路由时,您应该会为每个路由显示相应的消息。
注意:出于安全原因,您应该使用单独的应用程序密码进行身份验证,该密码应为每个 SMTP Gmail 帐户生成。还应在上面的 config.json 中为每个帐户的 MAIL_PASSWORD 密钥更新应用程序密码。更多详情 here.
from flask import Flask
from flask_mail import Mail
from flask_mail import Message
import json
def smtp_config(config_name, smtp=1):
with open(config_name) as f:
config_data = json.load(f)
if smtp not in {1,2}:
raise ValueError("smtp can only be 1 or 2")
if smtp==2:
MAIL_USERNAME = config_data['MAIL_USERNAME'][1]
MAIL_PASSWORD = config_data['MAIL_PASSWORD'][1]
else:
MAIL_USERNAME = config_data['MAIL_USERNAME'][0]
MAIL_PASSWORD = config_data['MAIL_PASSWORD'][0]
MAIL_SERVER = config_data['MAIL_SERVER']
MAIL_PORT = config_data['MAIL_PORT']
MAIL_USE_TLS = bool(config_data['MAIL_USE_TLS'])
return [MAIL_USERNAME, MAIL_PASSWORD, MAIL_SERVER, MAIL_PORT, MAIL_USE_TLS]
app = Flask(__name__)
mail = Mail()
@app.route("/")
def index():
smtp_data = smtp_config('config.json', smtp=1)
app.config.update(dict(
MAIL_SERVER = smtp_data[2],
MAIL_PORT = smtp_data[3],
MAIL_USE_TLS = smtp_data[4],
MAIL_USERNAME = smtp_data[0],
MAIL_PASSWORD = smtp_data[1],
))
mail.init_app(app)
msg = Message("Hello", sender="smtp1@gmail.com", recipients=["smtp2@gmail.com"])
msg.body = "This message was sent from smtp1"
mail.send(msg)
return "The message was sent from smtp1"
@app.route("/smtp2/")
def smtp2():
smtp_data = smtp_config('config.json', smtp=2)
app.config.update(dict(
MAIL_SERVER = smtp_data[2],
MAIL_PORT = smtp_data[3],
MAIL_USE_TLS = smtp_data[4],
MAIL_USERNAME = smtp_data[0],
MAIL_PASSWORD = smtp_data[1],
))
mail.init_app(app)
msg = Message("Hello", sender="smtp2@gmail.com", recipients=["smtp1@gmail.com"])
msg.body = "This message was sent from smtp2"
mail.send(msg)
return "The message was sent from smtp2"
if __name__=='__main__':
app.run(debug=True, port=5000, host='localhost')
smtp_config()
函数接受两个参数:config_name
是 config.json 文件的路径,smtp
对于 smtp1 帐户配置具有默认值 1 .此参数可以是 1 或 2。函数 returns 特定 smtp
的邮件配置所需的值列表。
然后,在每个路由中,只需使用从上述函数接收到的值更新应用程序配置,然后从应用程序设置中初始化邮件设置(mail.init_app()
)。
要添加更多帐户,您可以将 smtp 帐户名称列表传递给 smtp
以进行唯一标识(而不是上面的数字 1 和 2)。当然,您还必须相应地修改 config.json
:
def smtp_config(config_name, smtp=['smtp1@gmail.com', 'smtp2@gmail.com', 'smtp3@gmail.com'....]):
#<---code--->
if x[0]:
MAIL_USERNAME = 'smtp1@gmail.com'
....
elif x[1]:
MAIL_USERNAME = 'smtp2@gmail.com'
....
我正在使用 flask-mail to send from one account and it works fine. The unique information about multiple smtp accounts that I found in Google is this old comment。
我有:
MAIL_USERNAME = config.get('mail_service', 'USER')
MAIL_PASSWORD = config.get('mail_service', 'PASSWD')
MAIL_SERVER = config.get('mail_service', 'MAIL_SERVER')
MAIL_PORT = 587
MAIL_USE_TLS = True
mail = Mail()
def create_app(config_name):
app = Flask(__name__)
mail.init_app(app)
...
from flask_mail import Message
@app.route("/")
def index():
msg = Message("Hello", sender="from@example.com", recipients=["to@example.com"])
我不确定什么是最好的方法。可能在发送每封邮件时指定两个已配置的 SMTP 帐户之一?
知道如何实现吗?
您可以使用 config.json
文件来存储两个帐户的配置。然后,自定义函数可以在需要时使用该文件来提取值。以下代码显示了两个帐户的简单设置。关键要求是在每个路由中使用邮件对象 (mail.init_app()
) 初始化应用程序之前 更新应用程序配置。每个 smtp 帐户在其自己的路由中都有其 "message send" 操作。
config.json:
配置两个 SMTP Gmail 帐户
{
"MAIL_SERVER" : "smtp.gmail.com",
"MAIL_PORT" : 587,
"MAIL_USE_TLS": "True",
"MAIL_USERNAME" : ["smtp1@gmail.com", "smtp2@gmail.com"],
"MAIL_PASSWORD" : ["pwd_for_smtp1", "pwd_for_smtp2"]
}
代码:
为了测试此代码,我将测试电子邮件从 smtp1@gmail.com 发送到 smtp2@gmail.com,反之亦然。当您访问本地主机上的路由时,您应该会为每个路由显示相应的消息。
注意:出于安全原因,您应该使用单独的应用程序密码进行身份验证,该密码应为每个 SMTP Gmail 帐户生成。还应在上面的 config.json 中为每个帐户的 MAIL_PASSWORD 密钥更新应用程序密码。更多详情 here.
from flask import Flask
from flask_mail import Mail
from flask_mail import Message
import json
def smtp_config(config_name, smtp=1):
with open(config_name) as f:
config_data = json.load(f)
if smtp not in {1,2}:
raise ValueError("smtp can only be 1 or 2")
if smtp==2:
MAIL_USERNAME = config_data['MAIL_USERNAME'][1]
MAIL_PASSWORD = config_data['MAIL_PASSWORD'][1]
else:
MAIL_USERNAME = config_data['MAIL_USERNAME'][0]
MAIL_PASSWORD = config_data['MAIL_PASSWORD'][0]
MAIL_SERVER = config_data['MAIL_SERVER']
MAIL_PORT = config_data['MAIL_PORT']
MAIL_USE_TLS = bool(config_data['MAIL_USE_TLS'])
return [MAIL_USERNAME, MAIL_PASSWORD, MAIL_SERVER, MAIL_PORT, MAIL_USE_TLS]
app = Flask(__name__)
mail = Mail()
@app.route("/")
def index():
smtp_data = smtp_config('config.json', smtp=1)
app.config.update(dict(
MAIL_SERVER = smtp_data[2],
MAIL_PORT = smtp_data[3],
MAIL_USE_TLS = smtp_data[4],
MAIL_USERNAME = smtp_data[0],
MAIL_PASSWORD = smtp_data[1],
))
mail.init_app(app)
msg = Message("Hello", sender="smtp1@gmail.com", recipients=["smtp2@gmail.com"])
msg.body = "This message was sent from smtp1"
mail.send(msg)
return "The message was sent from smtp1"
@app.route("/smtp2/")
def smtp2():
smtp_data = smtp_config('config.json', smtp=2)
app.config.update(dict(
MAIL_SERVER = smtp_data[2],
MAIL_PORT = smtp_data[3],
MAIL_USE_TLS = smtp_data[4],
MAIL_USERNAME = smtp_data[0],
MAIL_PASSWORD = smtp_data[1],
))
mail.init_app(app)
msg = Message("Hello", sender="smtp2@gmail.com", recipients=["smtp1@gmail.com"])
msg.body = "This message was sent from smtp2"
mail.send(msg)
return "The message was sent from smtp2"
if __name__=='__main__':
app.run(debug=True, port=5000, host='localhost')
smtp_config()
函数接受两个参数:config_name
是 config.json 文件的路径,smtp
对于 smtp1 帐户配置具有默认值 1 .此参数可以是 1 或 2。函数 returns 特定 smtp
的邮件配置所需的值列表。
然后,在每个路由中,只需使用从上述函数接收到的值更新应用程序配置,然后从应用程序设置中初始化邮件设置(mail.init_app()
)。
要添加更多帐户,您可以将 smtp 帐户名称列表传递给 smtp
以进行唯一标识(而不是上面的数字 1 和 2)。当然,您还必须相应地修改 config.json
:
def smtp_config(config_name, smtp=['smtp1@gmail.com', 'smtp2@gmail.com', 'smtp3@gmail.com'....]):
#<---code--->
if x[0]:
MAIL_USERNAME = 'smtp1@gmail.com'
....
elif x[1]:
MAIL_USERNAME = 'smtp2@gmail.com'
....