最近在搞邮局。有个很奇怪的问题,就是打开mbox的文件,比如说:
/var/spool/mail/root
里面信件的部分有奇怪的3D字符:
1<table cellpadding=3D"0" cellspacing=3D"0" style=3D"text-align:le=
2ft;color:#454545;background-color:#fff;font-size:14px;border-radius:10px;pa=
注意,中间多了若干个3D,最后也多了=号
这是什么鬼呢?
搜了一圈,原来这是quoted-printable编解码,跟Base64类似,base64和quoted-printable这两种编码都是在电子邮件中常见的编码方式。
基本知识:
- 如果=号出现在一行最后,表示换行,那么: he= llo 意思就是连起来的hello
- 如果中间出现=3D,那就是一个=号的意思 所以style=3D"text"意思就是style=“text”
- 英文字符除了=以外不做处理,其他字符的编码为=加这个字符的两个字节的16进制数。
弄明白了吧。
给一段处理mbox的python程序,可以用来读邮件:
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4import mailbox
5import base64
6import os
7import sys
8import email
9
10import quopri
11
12
13filename = "/var/spool/mail/zrr"
14
15mb = mailbox.mbox(filename)
16nmes = len(mb)
17
18for i in range(len(mb)):
19 print "\n\n\n\n\n"
20 print "-------------------------------------------------------------------------------------------------"
21 print "Email", i
22 print "-------------------------------------------------------------------------------------------------"
23
24 mes = mb.get_message(i)
25 em = email.message_from_string(mes.as_string())
26
27 subject = em.get('Subject')
28 if subject.find('=?') != -1:
29 ll = email.header.decode_header(subject)
30 subject = ""
31 for l in ll:
32 subject = subject + l[0]
33
34 em_from = em.get('From')
35 if em_from.find('=?') != -1:
36 ll = email.header.decode_header(em_from)
37 em_from = ""
38 for l in ll:
39 em_from = em_from + l[0]
40
41 print "From: %s - Subject: %s" %(em_from, subject)
42 print "-------------------------------------------------------------------------------------------------"
43
44 if mes.is_multipart():
45 for part in mes.get_payload():
46 print quopri.decodestring(part.get_payload())
47 else:
48 print quopri.decodestring(mes.get_payload())