将邮件存储到mongodb中

2 投票
1 回答
1740 浏览
提问于 2025-04-17 05:51

我遇到了一个非常奇怪的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)})

以二进制格式保存可以确保数据的原始内容不会被改变。

撰写回答