【问题标题】:TypeError: argument of type 'Mail' is not iterableTypeError:“邮件”类型的参数不可迭代
【发布时间】:2025-12-17 00:35:01
【问题描述】:

我正在使用 Flask 开发这个电子邮件确认应用程序。为此,我正在使用flask_mail(显然),但我收到了这个错误:

TypeError:“邮件”类型的参数不可迭代

@app.route('/email', methods=['GET', 'POST'])
def send_mail():
    getting = request.form.get('mail')
    token = s.dumps(getting, salt='email-confirm')

    msg = Message('Confirm Email', sender='vatsalayvk1434@gmail.com', recipients=[mail])

    link = url_for('confirm_mail', token=token, _externel=True)
    msg.body = f'Your Link is {link}'

    mail.send(msg)
    return render_template('confirm.html', getting=getting, token=token)

这是模板代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="{{ url_for('static',filename='dist/css/bootstrap.min.css') }}">
    <title>Document</title>
</head>
<body>
    <div class="col-lg-12">
        <h2 class="display-4 mb-3">Flask Confirm Message App </h2>
        <div class="col-md-6">
                <form action="/email" method="post" class="mt-3 align-items-center justify-content-center">
                    <input type="text" name="mail" class="form-control form-control-sm">
                    <input type="submit" class="btn btn-outline-primary mt-4 ml-3">
                </form>
            </div>
            <h2>The Mail is  : {{getting}}</h2>
            <h2>The token is : {{token}}</h2>
    </div>

</body>
</html>

【问题讨论】:

    标签: python-3.x flask flask-mail itsdangerous


    【解决方案1】:

    您将错误的值传递给recipients

    这里:

    @app.route('/email', methods=['GET', 'POST'])
    def send_mail():
        getting = request.form.get('mail')
        token = s.dumps(getting, salt='email-confirm')
    
        msg = Message('Confirm Email', sender='vatsalayvk1434@gmail.com', recipients=[mail])
    
        link = url_for('confirm_mail', token=token, _externel=True)
        msg.body = f'Your Link is {link}'
    
        mail.send(msg)
        return render_template('confirm.html', getting=getting, token=token)
    

    您传入了收件人参数,其中包含 ma​​il 变量的列表,而不是您打算将邮件发送到的电子邮件地址列表。我假设您将 Mail 对象传递给收件人。

    我假设您要将电子邮件发送到的地址在 getting 变量中。

    解决方案:

    @app.route('/email', methods=['GET', 'POST'])
    def send_mail():
        getting = request.form.get('mail')
        token = s.dumps(getting, salt='email-confirm')
    
        # msg = Message('Confirm Email', sender='vatsalayvk1434@gmail.com', recipients=[getting])
        # To send the mail to yourself
        msg = Message('Confirm Email', sender='vatsalayvk1434@gmail.com', recipients=['vatsalayvk1434@gmail.com'])
    
        link = url_for('confirm_mail', token=token, _externel=True)
        msg.body = f'Your Link is {link}'
    
        mail.send(msg)
        return render_template('confirm.html', getting=getting, token=token)
    

    【讨论】:

    • 错误消失了,但现在我收到了这个错误:TypeError: 'NoneType' object is not iterable
    • 打印 getting 的值。请注意,作为字符串的电子邮件地址应该在传递给收件人的列表中。
    • 例如:... recipients = ["test@gmail.com"] 其中 test@gmail.com 只是一个例子。
    • @vatsalay 我已经对代码进行了编辑,因此您可以将消息发送到您自己的地址作为测试。
    • 实际上我之前尝试过,这对我有用,但我想从我的模板(表单)中获取收件人值,但我收到此错误:TypeError: 'NoneType' object is not可迭代
    最近更新 更多