API электронной почты Flask, получение информации из тегов формы - PullRequest
0 голосов
/ 23 июня 2018

У меня есть страница контактов, где я хочу, чтобы некоторая информация отправлялась на мою учетную запись электронной почты, когда пользователь отправляет сообщение.На данный момент у меня есть файл send.py, настроенный с помощью конфигурации в качестве теста.

send.py

from flask import Flask
from flask_mail import Mail, Message

app =Flask(__name__)
mail=Mail(app)

app.config.update(
DEBUG=True,
#EMAIL SETTINGS
MAIL_SERVER='smtp.gmail.com',
MAIL_PORT=465,
MAIL_USE_SSL=True,
MAIL_USERNAME = '(myemailaccount)',
MAIL_PASSWORD = '(mypassword)'
)

mail=Mail(app)

@app.route("/")
def index():
    msg = Message(
          'Hello',
       sender='(myemailaccount)',
       recipients=
           ['(myemailaccount('])
    msg.body = "This is the email body"
    mail.send(msg)
    return "Sent"

if __name__ == "__main__":
    app.run()

На моих маршрутах .py , у меня есть страница About , где я отображаю шаблон HTML с некоторыми тегами <form>, которые я хочу отобразить в сообщении электронной почты, как я могу отобразить код HTML в моем send.py .Должен ли я сначала сохранить его в качестве аргументов в моем rout.py ?Я должен добавить свою send.py информацию в мой rout.py ?

1 Ответ

0 голосов
/ 24 июня 2018

Согласно документам для флеш-почты , класс Message также принимает и аргумент html.Все, что вам нужно сделать, это присвоить значение render_template("home.html"), чтобы отправить визуализированную html-страницу в тело письма, предполагая, что home.html является страницей About .Вы также должны убедиться, что home.html находится внутри папки templates , так как Flask отображает все html-шаблоны из этой папки.

Я приведу небольшой пример.Обратите внимание, что я не использовал отдельный send.py , так как хотел вызвать функцию send_message на другом маршруте, поэтому я добавил его в тот же файл rout.py :

Структура проекта:

root
└───templates
    |___ home.html
|___ routes.py

home.html

<!DOCTYPE html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Send Message</title>
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="">
</head>
<body>
    <form class="form-inline" action="/send_message" method="POST">
        <label>Enter name:</label>
        <input type="text" name="name">
        <input type="submit" value="Send Message" class="btn btn-primary">
        <p>{{confirm_msg}}</p>
    </form>
    <script></script>
</body>
</html>

rout.py

from flask import Flask, render_template, request
from flask_mail import Mail, Message

app =Flask(__name__)

app.config.update(
DEBUG=True,
#EMAIL SETTINGS
MAIL_SERVER='smtp.gmail.com',
MAIL_PORT=465,
MAIL_USE_SSL=True,
MAIL_USERNAME = 'myemailaccount',
MAIL_PASSWORD = 'mypassword'
)

mail=Mail(app)

@app.route("/")
def home():
    return render_template("home.html")

@app.route("/send_message", methods=['POST'])
def send_message():
    name = request.form.get('name')
    msg = Message(
       subject='Hello ' + name,
       sender='myemailaccount',
       recipients=
           ['myemailaccount'],
       html=render_template("home.html"))
    mail.send(msg)
    confirm_msg = "Your message has been sent!"
    return render_template("home.html", confirm_msg=confirm_msg)

    if __name__ == "__main__":
        app.run(debug=True, port=5000)

Объяснение:

Страница home.html отображает простую форму, которая принимает name.Это имя отправляется в функцию send_message() с помощью функции request.form.get() Flask.Имя отправляется в строке «Тема» электронного письма.Обратите внимание на аргумент html в классе Message(), который отправляет визуализированную форму в теле письма.Наконец, отображается сообщение, подтверждающее отправку сообщения.Поскольку это запрос POST (отправка электронной почты), мы должны указать метод как в теге <form>, так и в маршруте /send_message.Тег <form> также имеет атрибут action, который вызывает функцию для функции send_message() в маршруте /send_message при отправке формы.

Предупреждения:

Убедитесь, что mail=Mail(app) вызывается после app.config.update(), как показано в коде выше.Это делается для того, чтобы убедиться, что настройки конфигурации были успешно применены до создания объекта mail.Затем вам может потребоваться включить настройку безопасности в вашей учетной записи Gmail, чтобы иметь возможность отправлять электронную почту (я должен был сделать это) в целях тестирования.Это связано с тем, что gmail будет блокировать любые менее безопасные приложения, которые пытаются аутентифицироваться в вашей учетной записи.Подробнее здесь .

Я протестировал приведенный выше код и успешно получил простой HTML form, отображаемый в теле письма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...