Как настроить флеш-почту для поддержки двух учетных записей SMTP - PullRequest
0 голосов
/ 28 января 2019

Я использую flask-mail для отправки с одного аккаунта, и он работает нормально.Уникальная информация о нескольких учетных записях smtp, которую я нашел в Google, это старый комментарий .

Что у меня есть:

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?

Есть идеи, как это реализовать?

1 Ответ

0 голосов
/ 29 января 2019

Вы можете использовать файл 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_PASSWORD для каждой учетной записи.Подробнее здесь .

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 - значение по умолчанию1 для конфигурации учетной записи smtp1.Этот параметр может быть 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'
        ....
...