Создайте подписанное сообщение PGP с классом EmailMessage

Я изо всех сил пытаюсь воссоздать сценарий, используя устаревший API электронной почты Python с текущим API. Рабочий код повторяет этот пример :

      from email.message import Message
from email.mime.multipart import MIMEMultipart

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

def send_message(subject, body):
    basemsg = Message()
    basemsg.set_payload(body)
    basemsg.set_charset('utf-8')

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

С новым кодом -

      from email.message import EmailMessage, MIMEPart

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

def send_message(subject, body):
    basemsg = EmailMessage()
    basemsg.set_content(body)
    basemsg.set_charset('utf-8')

    gpg = gnupg.GPG()
    basetext = basemsg.as_string().replace('\n', '\r\n')
    signature = str(gpg.sign(basetext, keyid='xxxxxxxxxxxxxxxx', detach=True))
    if signature:
        signmsg = messageFromSignature(signature)
        msg = basemsg
        msg.make_mixed()
        msg.add_attachment(signmsg)
        msg.replace_header('Content-Type', 'multipart/signed; micalg="pgp-sha512"; protocol="application/pgp-signature";')
    else:
        print('Warning: failed to sign the message!')

signmsgполучает дополнительный набор заголовков при прикреплении к составному сообщению:

      --===============0054553979676888393==
Content-Type: message/rfc822
Content-Transfer-Encoding: 8bit
MIME-Version: 1.0
Content-Disposition: attachment

Content-Type: application/pgp-signature; name="signature.asc"
Content-Transfer-Encoding: 7bit
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iHUEABYKAB0WIQQTeptvPezKETGQAId81GVnkrOh+QUCYqWYUAAKCRB81GVnkrOh
+SJSAQCre0cbhMf6frI9jILwc0XXGkByXUgiBkexcpYnXN/HzAD/WaPZA5hTutMg
5lPOQdZGaeVpsApYDL/fmbH6SniTvAg=
=xuOv
-----END PGP SIGNATURE-----

--===============0054553979676888393==--

Как я могу добавить подпись в качестве части сообщения MIME без создания заголовков (аналогично устаревшемуattachметод), и почему заголовок версии MIME создаетсяadd_attachment, хотя класс MIMEPart не создает этот заголовок, потому что

подразделам не нужны собственные заголовки MIME-Version

по документам ?

Спасибо, Ян

0 ответов

Другие вопросы по тегам