通过电子邮件附加解密的gpg文件(file.pgp)

时间:2012-10-15 17:06:25

标签: python email-attachments gnupg

我正在使用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

谢谢!

1 个答案:

答案 0 :(得分:0)

好的解决了!我必须:

base64.decodestring(attachment.get_payload())

然后使用gpg解密它,并且工作。这可以通过标题来解决:

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)
相关问题