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

Python发邮件脚本无报错但未收到邮件,求日志位置及代码问题排查

问题1:Linux Mint 20 中该类邮件发送日志的存储位置

  • 如果你本地没有安装postfix、sendmail等本地邮件传输代理(MTA),你的Python脚本是直接连接Gmail远端SMTP服务器完成发送的,本地系统不会存储邮件传输的相关日志,/var/log/下默认不会生成对应的记录。
  • 如果你安装了本地MTA,相关日志默认存储在/var/log/mail.log,部分关联报错也可以在/var/log/syslog中检索。
  • 这种直连远端SMTP的场景,你可以直接登录Gmail网页端,检查「已发送邮件」「垃圾邮件」「安全活动记录」板块,确认Gmail是否实际触发了投递、是否将邮件判定为异常拦截。

问题2:给出的脚本存在的明确错误

你贴出的代码只完成了SMTP服务器的连接和身份校验,没有实际执行发送邮件的逻辑,这是最核心的问题:

  1. 你拿到有效server对象后,没有调用server.sendmail(sender_email, 收件人地址, 格式化后的邮件内容)方法完成实际投递,自然不会有邮件发出。
  2. 额外注意事项:
    • 你当前使用的是STARTTLS模式,对应的Gmail SMTP端口必须是587,如果配置文件中填的是SSL端口465,需要改用smtplib.SMTP_SSL()初始化连接,不能调用starttls()方法。
    • 目前普通个人Gmail账号已经完全废弃了「允许低安全性应用访问」的设置,即使你开启了该开关也无法直接用账号密码登录,必须先开启账号两步验证,生成专用的应用密码,填入配置的密码字段才能正常登录。
    • 发送的邮件必须包含规范的To、From、Subject头信息,否则Gmail会直接判定为垃圾内容拦截,不会执行投递。
    • 连接使用完成后建议调用server.quit()主动断开SMTP连接。

附完整的连接+发送逻辑参考:

import json
import smtplib
import ssl
from email.mime.text import MIMEText

def get_smtp_server():
    with open("config.json") as config:
        data = json.load(config)                
        smtp_server = data["MAIL"]["SMTP_SERVER"]
        port = data["MAIL"]["SMTP_PORT"]
        sender_email = data["MAIL"]["SMTP_ACCOUNT"]
        password = data["MAIL"]["SMTP_PASSWORD"]
        context = ssl.create_default_context()
        try:
            server = smtplib.SMTP(smtp_server, port)        
            server.ehlo()
            server.starttls(context=context)
            server.ehlo()
            server.login(sender_email, password)                
            return server
        except Exception as e:
            print(e)
            return None

# 实际发送逻辑
if __name__ == "__main__":
    server = get_smtp_server()
    if server:
        # 构造邮件内容
        msg = MIMEText("这是测试邮件内容")
        msg["From"] = "发件人显示名 <yourgmail@gmail.com>"
        msg["To"] = "收件人地址 <xxx@xxx.com>"
        msg["Subject"] = "Python测试邮件"
        try:
            server.sendmail(
                from_addr="yourgmail@gmail.com",
                to_addrs=["xxx@xxx.com"],
                msg=msg.as_string()
            )
            print("邮件发送成功")
        except Exception as e:
            print(f"发送失败:{e}")
        finally:
            server.quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 01:24:01