Flask接收表单数据后无法发送至Gmail邮箱问题求助
Flask表单数据无法发送至Gmail的排查与解决
问题描述
已获取Google应用专用密码,单独测试邮件发送代码功能正常,用户名和密码无误,且能成功接收HTML表单提交的数据,但邮件始终无法送达目标Gmail邮箱。
相关代码
Flask邮件发送函数
def send_email(name, email, phone, message): smtp_server = 'smtp.gmail.com' smtp_port = 587 smtp_username = 'sara@gmail.com' smtp_password = 'password' from_email = 'sara@gmail.com' to_email = 'sara@gmail.com' subject = 'Hello!' body = f'Name: {name}\nEmail: {email}\nPhone: {phone}\nMessage:{message}' message = f'Subject: {subject}\n\n{body}' with smtplib.SMTP(smtp_server, smtp_port) as smtp: smtp.starttls() smtp.login(smtp_username, smtp_password) smtp.sendmail(from_email, to_email, message)
contact.html模板代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" /> <meta name="description" content="" /> <meta name="author" content="" /> <title>Clean Blog - Start Bootstrap Theme</title> <link rel="icon" type="image/x-icon" href="{{ url_for('static',filename='assets/favicon.ico') }}" /> <!-- Font Awesome icons (free version)--> <script src="https://use.fontawesome.com/releases/v5.15.4/js/all.js" crossorigin="anonymous"></script> <!-- Google fonts--> <link href="https://fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic" rel="stylesheet" type="text/css" /> <link href="https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" rel="stylesheet" type="text/css" /> <!-- Core theme CSS (includes Bootstrap)--> <link href="{{ url_for('static', filename='css/styles.css') }}" rel="stylesheet" /> </head> <body> {% include "header.html" %} <!-- Page Header--> <header class="masthead" style="background-image: url('../static/assets/img/contact-bg.jpg')" > <div class="container position-relative px-4 px-lg-5"> <div class="row gx-4 gx-lg-5 justify-content-center"> <div class="col-md-10 col-lg-8 col-xl-7"> <div class="page-heading"> {% if msg_sent %} <h1>Successfully sent your message</h1> {% else: %} <h1>Contact Me</h1> {% endif %} <span class="subheading">Have questions? I have answers.</span> </div> </div> </div> </div> </header> <!-- Main Content--> <main class="mb-4"> <div class="container px-4 px-lg-5"> <div class="row gx-4 gx-lg-5 justify-content-center"> <div class="col-md-10 col-lg-8 col-xl-7"> <p> Want to get in touch? Fill out the form below to send me a message and I will get back to you as soon as possible! </p> <div class="my-5"> <!-- * * * * * * * * * * * * * * *--> <!-- * * Simplified SB Contact Form for the Tutorial* *--> <!-- Solution: change url for the action to 'contact'--> <form id="contactForm" name="sentMessage" action="{{ url_for('contact') }}" method="post" > <div class="form-floating"> <input class="form-control" id="name" name="name" type="text" placeholder="Enter your name..." required /> <label for="name">Name</label> </div> <div class="form-floating"> <input class="form-control" id="email" name="email" type="email" placeholder="Enter your email..." required /> <label for="email">Email address</label> </div> <div class="form-floating"> <input class="form-control" id="phone" name="phone" type="tel" placeholder="Enter your phone number..." required /> <label for="phone">Phone Number</label> </div> <div class="form-floating"> <textarea class="form-control" id="message" name="message" placeholder="Enter your message here..." required style="height: 12rem" ></textarea> <label for="message">Message</label> </div> <br /> <button class="btn btn-primary text-uppercase" id="submitButton" type="submit" > Send </button> </form> </div> </div> </div> </div> </main> {% include "footer.html" %} <!-- Bootstrap core JS--> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script> <script src="{{ url_for('static',filename='js/scripts.js') }}"></script> <script src="https://cdn.startbootstrap.com/sb-forms-latest.js"></script> </body> </html>
运行日志
127.0.0.1 - - [30/Jan/2024 23:34:01] "GET / HTTP/1.1" 200 - 127.0.0.1 - - [30/Jan/2024 23:34:01] "GET /static/css/styles.css HTTP/1.1" 304 - 127.0.0.1 - - [30/Jan/2024 23:34:01] "GET /static/js/scripts.js HTTP/1.1" 304 - 127.0.0.1 - - [30/Jan/2024 23:34:01] "GET /static/assets/img/home-bg.jpg HTTP/1.1" 304 - 127.0.0.1 - - [30/Jan/2024 23:34:05] "GET /contact HTTP/1.1" 200 - 127.0.0.1 - - [30/Jan/2024 23:34:05] "GET /static/css/styles.css HTTP/1.1" 304 - 127.0.0.1 - - [30/Jan/2024 23:34:05] "GET /static/js/scripts.js HTTP/1.1" 304 - 127.0.0.1 - - [30/Jan/2024 23:34:05] "GET /static/assets/img/contact-bg.jpg HTTP/1.1" 304 - 127.0.0.1 - - [30/Jan/2024 23:34:11] "POST /contact HTTP/1.1" 200 - Sara sara@gmail.com 03456789 cv 127.0.0.1 - - [30/Jan/2024 23:34:11] "GET /static/css/styles.css HTTP/1.1" 304 - 127.0.0.1 - - [30/Jan/2024 23:34:11] "GET /static/js/scripts.js HTTP/1.1" 304 - 127.0.0.1 - - [30/Jan/2024 23:34:11] "GET /static/assets/img/contact-bg.jpg HTTP/1.1" 304 -
排查与解决步骤
1. 确认send_email函数是否被调用
从日志可见表单数据已被打印,但无任何邮件发送相关日志,大概率是Flask的contact路由在处理POST请求时,没有调用send_email函数。检查你的路由代码,确保在获取表单数据后执行了send_email(name, email, phone, message)。
2. 添加错误捕获与日志输出
原代码无异常处理逻辑,即使邮件发送失败也不会输出错误信息,无法定位问题。修改send_email函数,添加SMTP异常捕获:
import smtplib from smtplib import SMTPException def send_email(name, email, phone, message): smtp_server = 'smtp.gmail.com' smtp_port = 587 smtp_username = 'sara@gmail.com' smtp_password = 'password' # 替换为你的应用专用密码 from_email = 'sara@gmail.com' to_email = 'sara@gmail.com' subject = 'Hello!' body = f'Name: {name}\nEmail: {email}\nPhone: {phone}\nMessage:{message}' message = f'Subject: {subject}\n\n{body}' try: with smtplib.SMTP(smtp_server, smtp_port) as smtp: smtp.starttls() smtp.login(smtp_username, smtp_password) smtp.sendmail(from_email, to_email, message) print("邮件发送成功") except SMTPException as e: print(f"邮件发送失败: {str(e)}")
3. 检查垃圾邮件文件夹
Gmail可能会将自动发送的邮件标记为垃圾邮件,登录目标邮箱查看垃圾邮件目录,确认邮件是否被误判。
4. 使用标准邮件格式构建邮件
手动拼接的邮件格式可能不符合规范,被邮件服务商拒收。改用email模块构建MIME格式的邮件:
from email.mime.text import MIMEText from email.header import Header import smtplib from smtplib import SMTPException def send_email(name, email, phone, message): smtp_server = 'smtp.gmail.com' smtp_port = 587 smtp_username = 'sara@gmail.com' smtp_password = 'password' from_email = 'sara@gmail.com' to_email = 'sara@gmail.com' subject = 'Hello!' body = f'Name: {name}\nEmail: {email}\nPhone: {phone}\nMessage:{message}' # 构建规范的MIME邮件 msg = MIMEText(body, 'plain', 'utf-8') msg['From'] = Header(from_email, 'utf-8') msg['To'] = Header(to_email, 'utf-8') msg['Subject'] = Header(subject, 'utf-8') try: with smtplib.SMTP(smtp_server, smtp_port) as smtp: smtp.starttls() smtp.login(smtp_username, smtp_password) smtp.sendmail(from_email, to_email, msg.as_string()) print("邮件发送成功") except SMTPException as e: print(f"邮件发送失败: {str(e)}")
内容的提问来源于stack exchange,提问作者luna28blue
相关产品推荐
相关产品推荐

