Python 如何调整flask mail以支持两个SMTP帐户

Python 如何调整flask mail以支持两个SMTP帐户,python,flask,flask-extensions,Python,Flask,Flask Extensions,我用一个帐户发送,效果很好。我在Google中找到的关于多个smtp帐户的唯一信息就是这么旧的 我所拥有的: 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

我用一个帐户发送,效果很好。我在Google中找到的关于多个smtp帐户的唯一信息就是这么旧的

我所拥有的:

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)
    ...

我不知道什么是最好的办法。可能在发送每封邮件时指定两个已配置的SMTP帐户中的一个


知道如何实现吗?

您可以使用
config.json
文件来存储这两个帐户的配置。然后,自定义函数可以在需要时使用该文件提取值。下面的代码显示了两个帐户的简单设置。关键要求是在每个路由中使用邮件对象(
mail.init_app()
)初始化应用程序之前更新应用程序配置。每个smtp帐户在其自己的路由中都有其“邮件发送”操作

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_密码密钥的应用程序密码。更多细节

smtp_config()
函数接受两个参数:
config_name
是config.json文件的路径,而
smtp
对于smtp1帐户配置,默认值为1。此参数可以是1或2。该函数返回特定的
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'
        ....
def smtp_config(配置名称,smtp=[]smtp1@gmail.com', 'smtp2@gmail.com', 'smtp3@gmail.com'....]):
#
如果x[0]:
邮寄smtp1@gmail.com'
....
以利夫x[1]:
邮寄smtp2@gmail.com'
....
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')  
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'
        ....