Python发送邮件时加入public_ip后异常的问题排查
问题分析与解决方案
你的代码核心问题是邮件消息格式不符合SMTP协议要求:smtplib的sendmail方法要求msg参数必须包含标准邮件头(如From、To、Subject),之后空一行再写正文内容。之前未加入public_ip时,邮件服务器可能宽松处理了非法格式,但加入后触发了格式校验,导致邮件发送失败。
另外还有两个小问题需要修正:
os.getenv('os')无法获取系统信息,这个环境变量不存在,建议改用platform.platform()来获取完整系统版本,或者os.name获取系统类型。- 代码中调用了
get_internal_ip()但未给出定义,需确保该函数已正确实现(如果未实现,可参考补充示例)。
修正后的代码
def send_email(): import os import smtplib, ssl import requests import platform # 新增导入获取系统信息 # 实现内部IP获取函数(如果之前未定义) def get_internal_ip(): import socket try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("8.8.8.8", 80)) internal_ip = s.getsockname()[0] s.close() return internal_ip except: return "无法获取内部IP" login = os.getlogin() sys_info = platform.platform() # 替换os.getenv('os') ip = get_internal_ip() public_ip = requests.get('http://icanhazip.com').text.strip() # strip()默认会去掉换行和空白 port = 465 # For SSL email = input('Type your email and press enter: ') password = input("Type your password and press enter: ") # 构造符合SMTP标准的邮件内容 subject = "系统信息报告" body = f'{login} | {sys_info} | {ip} | {public_ip}' # 邮件头+正文,注意空行分隔 msg = f"From: {email}\nTo: {email}\nSubject: {subject}\n\n{body}" # Create a secure SSL context context = ssl.create_default_context() with smtplib.SMTP_SSL("smtp.gmail.com", port, context=context) as server: server.login(email, password) server.sendmail(from_addr=email, to_addrs=email, msg=msg) send_email()
关键说明
- 邮件格式修正:新增了
From、To、Subject头信息,并用空行分隔头和正文,完全符合SMTP协议要求,无论是否包含public_ip都能正常发送。 - 系统信息获取:改用
platform.platform()能正确获取如Windows-10-10.0.19045-SP0或Linux-5.15.0-78-generic-x86_64-with-glibc2.35这类完整系统信息。 - public_ip处理:
strip()默认会去除所有首尾空白字符(包括换行),比strip('\n')更稳妥。
内容的提问来源于stack exchange,提问作者Arcade Luke
相关产品推荐
相关产品推荐

