近来处理邮件发送问题时发现一个问题,就是国内的邮箱经过smtp第三方客户端发信后,邮箱本身的发件箱一般都有已发送的邮件,也是留痕和历史备份,但是国外的邮箱,例如gmx经过第三方客户端smtp发信后,gmx邮箱中不留存邮件。
经过分析得知,原来是国内做了处理,体验和优化,而gmx这种是原始的没做任何优化的问题。smtp协议本质上来讲只负责发信,所以不会在发件箱中留存。
解决办法,既然这样,那只能使用smtp发信后,紧接着用imap协议将smtp发送的邮件转存到邮件的发件箱中。
其中有个方法就是imap.list()可以imap登录后,列出所有的文件夹,以判断哪个是发件箱。
import imaplib
import ssl
# 配置信息(请替换为你自己的)
IMAP_SERVER = "imap.qq.com" # QQ邮箱:imap.qq.com | 163邮箱:imap.163.com | Gmail:imap.gmail.com
IMAP_PORT = 993 # SSL端口,几乎所有邮箱都是993
EMAIL_ACCOUNT = "your_email@qq.com"
# 注意:多数邮箱需要用「授权码」而非登录密码(比如QQ/163邮箱需在设置中开启IMAP并生成授权码)
EMAIL_PASSWORD = "your_authorization_code"
def list_imap_folders():
"""登录IMAP服务器并列出所有文件夹"""
# 创建SSL上下文(安全连接)
context = ssl.create_default_context()
try:
# 1. 建立IMAP SSL连接
imap = imaplib.IMAP4_SSL(IMAP_SERVER, IMAP_PORT, ssl_context=context)
print("✅ 成功连接到IMAP服务器")
# 2. 登录账号
imap.login(EMAIL_ACCOUNT, EMAIL_PASSWORD)
print("✅ 成功登录邮箱账号")
# 3. 列出所有文件夹(核心方法:list())
# 返回值格式:(状态码, [文件夹原始数据列表])
status, folders = imap.list()
if status == "OK":
print("\n📁 邮箱文件夹列表:")
# 解析原始文件夹数据(原始数据是字节串,需要解码和拆分)
for folder in folders:
# 示例原始数据:b'(\\HasNoChildren) "/" "INBOX"'
# 拆分后提取文件夹名称
folder_info = folder.decode("utf-8").split('"')
folder_name = folder_info[-2] # 取最后一个双引号前的内容
print(f" - {folder_name}")
else:
print(f"❌ 列出文件夹失败,状态码:{status}")
# 4. 登出并关闭连接
imap.logout()
print("\n✅ 已安全登出IMAP服务器")
except imaplib.IMAP4.error as e:
print(f"❌ IMAP登录/操作错误:{e}")
except Exception as e:
print(f"❌ 未知错误:{e}")
if __name__ == "__main__":
list_imap_folders()