You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python通过Gmail发送邮件时程序卡住问题排查

问题分析与修复方案

核心问题

你的代码存在三个关键问题,导致邮件发送失败(或看似卡住):

1. 邮件消息格式不符合SMTP规范

当前的message是一个包含字符串的元组,且缺少SMTP要求的必要邮件头(From、To、Subject),头与正文之间也没有空行。SMTP服务器需要符合RFC 2822标准的邮件内容,否则会拒绝处理或进入等待状态。

2. 异常处理错误

Python 3中Exception对象没有message属性,导致发生异常时无法打印错误信息,你误以为程序"卡住",实际上是抛出了异常但未正确输出。

3. 非英文主题未编码

如果subject包含波兰语等非ASCII字符,直接拼接会导致格式错误或乱码,需要进行编码处理。

修复后的代码

import smtplib, ssl
from email.mime.text import MIMEText
from email.header import Header

port = 465  # For SSL
password = "valid password"
context = ssl.create_default_context()

def sendEmail(to_email, subject, content):
    from_email = "valid_email@zaliczenie.pl"
    # 构造符合规范的邮件内容,支持非英文主题
    msg = MIMEText(f"Tresc zadania: {content}", 'plain', 'utf-8')
    msg['From'] = from_email
    msg['To'] = to_email
    msg['Subject'] = Header(subject, 'utf-8')
    message = msg.as_string()

    try:
        print("connecting")
        with smtplib.SMTP_SSL("smtp.gmail.com", port, context=context) as server:
            print("connected")
            server.login("tmp_email@gmail.com", password)
            print("logged")
            server.sendmail(
                from_addr=from_email,
                to_addrs=to_email,
                msg=message,
            )
            print("sent")
    except Exception as e:
        # 正确打印异常信息
        print(f"Error: {str(e)}")

额外注意事项

  • Gmail会将发件人地址自动改写为你登录的tmp_email@gmail.com,除非你在Gmail设置中添加了valid_email@zaliczenie.pl作为别名并验证通过。
  • 确保应用密码是针对启用2FA的tmp_email@gmail.com生成的,且选择的应用类别为"邮件"。

内容的提问来源于stack exchange,提问作者Alex Ironside

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:52:37