Flask API中使用email包解析原始邮件返回空值问题求助
解决Flask中email包解析原始邮件返回空字符串的思路
问题分析
你的代码直接调用e.get_payload()获取内容,但忽略了邮件编码、多部分结构以及请求数据格式问题,这是导致返回空字符串的核心原因。
具体解决步骤
1. 校验请求获取的邮件内容格式
首先确认request.form['Content']拿到的是完整且格式正确的原始邮件:
- 在
emails()函数中添加打印,输出new_email的实际内容,检查换行符是否为\n而非转义后的\\n - 如果存在转义问题,先做替换处理:
new_email = request.form['Content'].replace('\\n', '\n') - 如果邮件字符串带有首尾单引号(如示例中的
'Message-ID: ...'),需先去除:new_email = request.form['Content'].strip("'")
2. 完善邮件解析逻辑
修改get_content函数,加入编码解码处理和多部分邮件判断:
def get_content(message): e = email.message_from_string(message) content = [] # 处理多部分邮件 if e.is_multipart(): for part in e.walk(): # 仅提取纯文本内容 if part.get_content_type() == 'text/plain': # 获取字符编码,默认用us-ascii charset = part.get_content_charset() or 'us-ascii' # 解码payload payload = part.get_payload(decode=True) if payload: content.append(payload.decode(charset)) return '\n'.join(content) else: # 单部分纯文本邮件 charset = e.get_content_charset() or 'us-ascii' payload = e.get_payload(decode=True) return payload.decode(charset) if payload else ""
3. 调试定位问题节点
在解析过程中添加调试打印,快速定位异常:
def get_content(message): print("原始输入片段:", message[:200]) e = email.message_from_string(message) print("邮件Content-Type:", e.get('Content-Type')) print("是否为多部分邮件:", e.is_multipart()) print("原始payload片段:", e.get_payload()[:200]) # 后续解析逻辑...
内容的提问来源于stack exchange,提问作者WhoAmI
相关产品推荐
相关产品推荐

