2012-05-08 20 views
8

Tôi hiện đang cố gắng thêm hỗ trợ ký PGP vào my small e-mail sending script (sử dụng mô-đun Python 3.x và python-gnupg).e-mail nhiều PGP ký với Python

Các mã ký thông điệp là:

gpg = gnupg.GPG() 
basetext = basemsg.as_string().replace('\n', '\r\n') 
signature = str(gpg.sign(basetext, detach=True)) 
if signature: 
    signmsg = messageFromSignature(signature) 
    msg = MIMEMultipart(_subtype="signed", micalg="pgp-sha1", 
    protocol="application/pgp-signature") 
    msg.attach(basemsg) 
    msg.attach(signmsg) 
else: 
    print('Warning: failed to sign the message!') 

(Ở đây basemsgemail.message.Message loại.)

messageFromSignature chức năng là:

def messageFromSignature(signature): 
    message = Message() 
    message['Content-Type'] = 'application/pgp-signature; name="signature.asc"' 
    message['Content-Description'] = 'OpenPGP digital signature' 
    message.set_payload(signature) 
    return message 

Sau đó, tôi thêm tất cả các tiêu đề cần thiết gửi tin nhắn (msg) và gửi tin nhắn.

Tính năng này hoạt động tốt đối với các thư không phải đa phần, nhưng không thành công khi basemsg là nhiều phần (multipart/alternative hoặc multipart/mixed).

Xác minh chữ ký theo cách thủ công đối với phần văn bản tương ứng, nhưng Evolution và Mutt báo cáo chữ ký là xấu.

Ai có thể vui lòng cho tôi biết nhầm lẫn của tôi không?

Trả lời

5

Vấn đề là mô-đun email.generator của Python không thêm dòng mới trước phần chữ ký. Tôi đã báo cáo rằng ngược dòng là http://bugs.python.org/issue14983.

+0

Bạn đã sửa chữa nó như thế nào? Có một nơi để thêm một dòng mới một cách dễ dàng, hoặc bạn đã phải monkeypatch email.generator? Tôi đang gặp vấn đề tương tự. – micah

+0

@MicahLee Tôi đã không tìm thấy bất kỳ cách nào ngoài (khỉ-) vá 'email.generator'. –

2

Cấu trúc MIME của basemsg là gì? Có vẻ như nó có quá nhiều phần lồng nhau trong đó. Nếu bạn xuất một tin nhắn đã ký từ ví dụ: Tiến hóa, bạn sẽ thấy rằng nó chỉ có hai phần: phần thân và chữ ký.

Dưới đây là ví dụ tạo thông báo trên thiết bị xuất chuẩn có thể đọc và chữ ký được xác minh trên cả hai mutt (mutt -f test.mbox) và Evolution (Tệp -> Nhập).

import gnupg 
from email.message import Message 
from email.mime.text import MIMEText 
from email.mime.multipart import MIMEMultipart 

body = """ 
This is the original message text. 

:) 
""" 

gpg_passphrase = "xxxx" 

basemsg = MIMEText(body) 

def messageFromSignature(signature): 
    message = Message() 
    message['Content-Type'] = 'application/pgp-signature; name="signature.asc"' 
    message['Content-Description'] = 'OpenPGP digital signature' 
    message.set_payload(signature) 
    return message 

gpg = gnupg.GPG() 
basetext = basemsg.as_string().replace('\n', '\r\n') 
signature = str(gpg.sign(basetext, detach=True, passphrase=gpg_passphrase)) 
if signature: 
    signmsg = messageFromSignature(signature) 
    msg = MIMEMultipart(_subtype="signed", micalg="pgp-sha1", 
    protocol="application/pgp-signature") 
    msg.attach(basemsg) 
    msg.attach(signmsg) 
    msg['Subject'] = "Test message" 
    msg['From'] = "[email protected]" 
    msg['To'] = "[email protected]" 
    print(msg.as_string(unixfrom=True)) # or send 
else: 
    print('Warning: failed to sign the message!') 

Lưu ý rằng ở đây, tôi giả định một keyring có cụm mật khẩu nhưng bạn không cần điều đó.

+0

Câu hỏi của tôi là cách đăng ký ** nhiều ** e-mail. Trong trường hợp của bạn, 'basemsg' là một tin nhắn MIMEText đơn giản, không phải là thông điệp nhiều phần. Tôi đã tìm thấy thư mục gốc của sự cố của mình - điều này xảy ra vì 'email.generator' trong Python không nối thêm dòng mới sau ranh giới kết thúc. Tôi không hoàn toàn chắc chắn về điều đó; khi tôi chắc chắn tôi sẽ đăng câu trả lời mô tả cách khắc phục điều đó. –

+0

Dmitry Shachnev: Ah, tôi không nhìn kỹ đủ. Hy vọng rằng lỗi sẽ được khắc phục sớm! –