Skip to main content
 首页 » 编程设计

python之电子邮件中的编码问题

2025年05月04日58thcjp

我有一个小的 python 脚本,可以从 POP 邮件地址提取电子邮件并将它们转储到一个文件中(一个文件一个电子邮件)

然后 PHP 脚本运行文件并显示它们。

我遇到了 ISO-8859-1 (Latin-1) 编码电子邮件的问题

这是我得到的文本示例:=?iso-8859-1?Q?G=EDsli_Karlsson?= and Sj=E1um hva=F0 =F3li er kl=E1r J

我提取电子邮件的方式是这段代码。

pop = poplib.POP3(server) 
 
mail_list = pop.list()[1] 
 
for m in mail_list: 
    mno, size = m.split() 
    lines = pop.retr(mno)[1] 
 
    file = StringIO.StringIO("\r\n".join(lines)) 
    msg = rfc822.Message(file) 
 
    body = file.readlines() 
 
    f = open(str(random.randint(1,100)) + ".email", "w") 
    f.write(msg["From"] + "\n") 
    f.write(msg["Subject"] + "\n") 
    f.write(msg["Date"] + "\n") 
 
    for b in body: 
        f.write(b) 

我已经在 python 和 php 中尝试了可能的所有编码/解码组合。

请您参考如下方法:

您可以使用 python 电子邮件库 (python 2.5+) 来避免这些问题:

import email 
import poplib 
import random 
from cStringIO import StringIO 
from email.generator import Generator 
 
pop = poplib.POP3(server) 
 
mail_count = len(pop.list()[1]) 
 
for message_num in xrange(mail_count): 
    message = "\r\n".join(pop.retr(message_num)[1]) 
    message = email.message_from_string(message) 
 
    out_file = StringIO() 
    message_gen = Generator(out_file, mangle_from_=False, maxheaderlen=60) 
    message_gen.flatten(message) 
    message_text = out_file.getvalue() 
 
    filename = "%s.email" % random.randint(1,100) 
    email_file = open(filename, "w") 
    email_file.write(message_text) 
    email_file.close() 

此代码将从您的服务器获取所有消息并将它们转换为 Python 消息对象,然后再次将它们扁平化为字符串以写入文件。通过使用 Python 标准库中的电子邮件包,应该可以为您处理 MIME 编码和解码问题。

免责声明:我没有测试该代码,但它应该可以正常工作。