使用Python emails包出现BadHeaderError的修复咨询
先看看报错日志里的关键信息,一眼就能定位问题:
emails.exc.BadHeaderError: Header values can't contain newlines (got u'Scientist <XXXXXXXXXX\n>' for header u'To')
说白了就是你从email.txt里读出来的邮箱地址带了个换行符\n,邮件头里不允许出现这种字符,所以Linux系统直接报错了。为啥Windows没事?因为Windows文本文件的换行是\r\n,有些读取操作会自动把这个收尾的换行处理掉,但Linux下的换行是单独的\n,直接读就会把它带到邮箱地址里,触发了emails库的格式校验。
具体修复步骤
1. 清理邮箱地址里的换行符
修改读取email.txt的代码,用strip()方法把首尾的空白字符(包括换行、空格、制表符这些)都去掉就行,同时用with语句自动管理文件,避免资源泄漏:
# 替换原来的读取代码 with open('email.txt', 'r') as file: userm = file.read().strip()
2. 清理冗余的邮件发送调用
你的代码里调用了两次message.send(),第一次没配置SMTP参数根本发不出去,还可能干扰后续操作。建议只保留第二次带完整SMTP配置的调用,而且要记得先加附件再发送,不然附件可能不会被包含进去。
修正后的完整代码如下:
import sys import os import shutil import emails # sudo pip install emails from emails.template import JinjaTemplate as T # 安全读取并清理邮箱地址 with open('email.txt', 'r') as file: userm = file.read().strip() print(userm) # 可以先打印确认下地址有没有问题 # 构建邮件内容 message = emails.html( subject=T('Data processing request{{ billno }}'), html=T('<p>Dear {{ name }}! Your genomics data have been processed, download the attached files and look at your genome annotations, please'), mail_from=('Genomics data processor', 'XXXXXXXXXXX') ) # 添加附件(必须在发送前操作) message.attach( data=open('processedfiles.zip', 'rb'), filename='YourGenomeProcessedAnnotations.zip', content_disposition='inline' ) # 发送邮件,只保留这一次完整调用 r = message.send( to=('Scientist', userm), render={'name': 'Scientist', 'billno': '777'}, smtp={'host':'smtp.yandex.com', 'port': 465, 'ssl': True, 'user': 'XXXXXXXXXX', 'password': 'XXXXXXX'} ) assert r.status_code == 250
额外说明
至于为啥之前Linux能运行现在失效?大概率是email.txt文件被修改过(比如在Windows下编辑后传到Linux,带了Windows的换行符,或者手动编辑时不小心多敲了个回车),也可能是emails库更新后对邮件头的校验变严格了。总之,从文件读取用户输入时,一定要做下清理,尤其是涉及邮件、HTTP请求这种对格式要求高的场景,别让空白字符搞砸事儿。
内容的提问来源于stack exchange,提问作者player777

