Python3.7.3带附件发邮件脚本提示发送成功但未实际发信问题求助
Python3 邮件发送失败排查方案
- 补全缺失导入与语法错误
你的代码缺少必要模块导入,且MIMEText初始化行存在语法错误(缺少字符串闭合标记和右括号),先在代码开头补充导入逻辑:
同时修正正文定义行的语法:import smtplib import os from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders from smtplib import SMTPExceptionbody = MIMEText("""Please find the updated data in attached csv""") - 修正SMTP交互逻辑
这是Python2迁移到Python3后发信失败的核心原因,修改发信段代码如下:try: server = smtplib.SMTP('localhost',11) # 开启调试模式可打印与SMTP服务器的完整交互日志,后续定位问题可打开 # server.set_debuglevel(1) # 手动触发EHLO握手,部分SMTP服务器会拒绝未握手的发信请求 server.ehlo() # 如果你的SMTP服务要求TLS加密,取消下一行注释 # server.starttls() # 收信人参数必须传列表格式:Python3中若传入纯字符串,smtplib会将每个字符识别为独立收件人,导致投递地址完全无效 server.sendmail(sender, [receivers], msg.as_string()) # 用quit()替代close(),符合SMTP协议正常退出流程,避免邮件被服务器判定为异常请求丢弃 server.quit() print('Email Sent') # 扩大异常捕获范围,打印具体错误,避免非SMTP类异常被忽略 except Exception as e: print(f'Something went wrong: {str(e)}') - 端口与服务规则校验
11端口默认属于systat服务,虽然你telnet返回了SMTP响应,请确认Exim服务确实配置为监听11端口,且未限制本地发信IP、发件人地址白名单,开启调试模式后可通过服务器返回的状态码确认拦截原因。 - 编码兼容校验
你当前附件用rb模式读取的逻辑符合Python3的二进制数据处理要求,不需要额外调整。
内容的提问来源于stack exchange,提问作者atulgupta
相关产品推荐
相关产品推荐

