将邮件存储到mongodb中
我遇到了一个非常奇怪的bug。
for emailid in item_ids:
resp, data = conn.fetch(emailid, "(RFC822)")
try:
db.emails.insert({'raw': data})
我正在使用oauth2.clients.imap从gmail获取一堆数据。在从gmail获取邮件后,我决定先把它作为“原始”数据存储在我的mongodb里。
然后在我脚本的另一个部分,我做了类似这样的事情:
for i,j in enumerate(db.emails.find()):
raw_s = j['raw'][0][1]
email = email_module.message_from_string(raw_s)
if email.is_multipart():
print get_cleaned_body(email)
注意,我做了一个 import email as email_module
,并且把变量email给覆盖了,因为我想不出一个更好的名字来表示一个邮件实例
现在奇怪的是,我的邮件实例都不是多部分的!
如果我修改我的获取代码为:
for emailid in item_ids:
resp, data = conn.fetch(emailid, "(RFC822)")
try:
#db.emails.insert({'raw': data})
e = email.message_from_string(data[0][1])
print e.is_multipart()
我看到了一些 True
。
我猜这可能的一个解释是,把数据保存到mongodb的时候搞乱了什么,导致邮件无法正确解析?
1 个回答
3
结果是你应该这样做:
oid = db.emails.insert({'raw': bson.binary.Binary(data)})
以二进制格式保存可以确保数据的原始内容不会被改变。