PGP-подписывание многостраничных сообщений электронной почты с помощью Python

В настоящее время я пытаюсь добавить поддержку подписи PGP к моему маленькому сценарию отправки электронной почты (который использует Python 3.x и модуль pythongnupg ).

Код, который подписывает сообщение:

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!') 

(Здесь basemsg имеет тип email.message.Message .)

Функция messageFromSignature :

 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 

Затем я добавляю все необходимые заголовки в сообщение ( msg ) и отправляю его.

Это хорошо работает для сообщений без multipart, но не работает, когда basemsg является multipart ( multipart/alternative или multipart/mixed ).

Ручная проверка подписи с соответствующим фрагментом текста работает, но Evolution и Mutt сообщают, что подпись плохая.

Может ли кто-нибудь указать мне на мою ошибку?

2 Solutions collect form web for “PGP-подписывание многостраничных сообщений электронной почты с помощью Python”

Проблема в том, email.generator модуль email.generator Python не добавляет новую email.generator перед частью подписи. Я сообщил, что вверх по течению как http://bugs.python.org/issue14983 .

Что такое MIME-структура basemsg ? Похоже, что в нем слишком много вложенных частей. Если вы экспортируете подписанное сообщение, например, Evolution, вы увидите, что он имеет только две части: тело и подпись.

Вот пример, который генерирует сообщение на stdout, которое может быть прочитано, и подпись проверена как на mutt ( mutt -f test.mbox ), так и на Evolution (File -> Import).

 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'] = "sender@example.com" msg['To'] = "recipient@example.com" print(msg.as_string(unixfrom=True)) # or send else: print('Warning: failed to sign the message!') 

Обратите внимание, что здесь я предполагаю keyring с парольной фразой, но вам это может не понадобиться.

 
Interesting Posts for Van-Lav

Python | Остановка / перезапуск скрипта после user_input

sqlalchemy кэширование некоторых запросов

os.path.basename работает с URL-адресами, почему?

Как я могу получить доступ к переменным, установленным в функции настройки nosetests python

numpy: эффективное чтение большого массива

Передача выражения в качестве аргумента: ключевое слово не может быть выражением

Вопрос Django и SSL

Получение ограниченных координат полигонов из ячеек Вороного

python, запутанный в украшении и закрытии

Обнаружение повторяющегося цикла в последовательности чисел (python)

Как проверить, что virtualenvwrapper установлен для VIRTUALENVWRAPPER_PYTHON = / usr / bin / python и т. Д.

В Java то, что итоматически больше всего похоже на повышение Python ValueError?

Вызов кода C ++ из Python с использованием Cython с использованием подхода distutilis

Избавление от вывода консоли при замораживании программ Python с помощью Pyinstaller

новичок: запись кода на веб-сайте

Python - лучший язык программирования в мире.