Skip to main content
 首页 » 编程设计

python之解密电子邮件中附加的 gpg 文件 (file.pgp)

2025年05月04日29bluestorm

我正在使用 email.Message 类和 gnupg 库来:

1 - 解析从 Twisted imap4 客户端获取的电子邮件字符串。

2 - 获取附件,一个 .pgp

3 - 解密。

我可以解密典型的邮件内容,如:

-----BEGIN PGP MESSAGE----- 
Version: PGP 9 
(...) 
-----END PGP MESSAGE----- 

但是执着的事情真的让我的生活变得一团糟。

好吧,我尝试了很多不同的方法,但最合乎逻辑的应该是这样的:

message = email.message_from_string(content) 
if message.is_multipart(): 
    attachment = message.get_payload(1) 
    gpg = gnupg.GPG(gnupghome=settings.PGP_PATH) 
    return gpg.decrypt_file(attachment.get_payload(), passphrase=settings.PGP_PASSPH) 

附件 var 的第一行是:

From nobody Mon Oct 15 18:54:12 2012 
Content-type: application/octet-stream;  
 name="No_Norm_AMLT_908_1210201201.txt.pgp" 
Content-Disposition: attachment; filename="No_Norm_AMLT_908_1210201201.txt.pgp" 
Content-Transfer-Encoding: base64 

然后是所有加密的东西。

总之……这真的很奇怪,有些东西我不明白。如果我从普通的邮件客户端软件(即 Thunderbird)下载附件,我会得到一个看起来是二进制的 .pgp 文件(如果我用纯文本编辑器编辑它会出现奇怪的字符),我可以使用 bash 命令解密它:

gpg --decrypt No_Norm_AMLT_908_1210201201.txt.pgp 

我不知道如何使用 email.Message 类和 gnupg 获得相同的结果(文件解密),我试图将附件的有效负载保存到文件中,这与从 Thunderbird 下载的不同,我无法解密它,我也尝试将它放入 StringIO,并用 base64 对其进行编码。

我从 gpg 得到的消息是:

[GNUPG:] NODATA 1 
[GNUPG:] NODATA 2 
gpg: decrypt_message failed: eof 

谢谢!

请您参考如下方法:

好的解决了!我必须:

base64.decodestring(attachment.get_payload()) 

然后使用 gpg 对其进行解密,并且成功了。由于 header ,这可以弄清楚:

Content-Transfer-Encoding: base64 

最终代码为:

message = email.message_from_string(content) 
if message.is_multipart(): 
    attachment = message.get_payload(1) 
    gpg = gnupg.GPG(gnupghome=settings.PGP_PATH) 
    return gpg.decrypt_file(base64.decodestring(attachment.get_payload()), 
                            passphrase=settings.PGP_PASSPH)