def PrepareMail(config, mailobj, sender=None, rcpts=None): if not sender or not rcpts: tree = mailobj.get_message_tree() sender = sender or tree['headers_lc']['from'] if not rcpts: rcpts = ExtractEmails(tree['headers_lc'].get('to', '')) rcpts += ExtractEmails(tree['headers_lc'].get('cc', '')) rcpts += ExtractEmails(tree['headers_lc'].get('bcc', '')) if not rcpts: raise NoRecipientError() rcpts += [sender] # Cleanup... sender = ExtractEmails(sender)[0] sender_keyid = None if config.prefs.openpgp_header: try: gnupg = GnuPG() seckeys = dict([(x["email"], y["fingerprint"]) for y in gnupg.list_secret_keys().values() for x in y["uids"]]) sender_keyid = seckeys[sender] except: pass rcpts, rr = [sender], rcpts for r in rr: for e in ExtractEmails(r): if e not in rcpts: rcpts.append(e) msg = copy.deepcopy(mailobj.get_msg()) # Remove headers we don't want to expose for bcc in ('bcc', 'Bcc', 'BCc', 'BCC'): if bcc in msg: del msg[bcc] if 'date' not in msg: msg['Date'] = email.utils.formatdate() if sender_keyid and config.prefs.openpgp_header: msg["OpenPGP"] = "id=%s; preference=%s" % (sender_keyid, config.prefs.openpgp_header) # Sign and encrypt signatureopt = bool(int(tree['headers_lc'].get('do_sign', 0))) encryptopt = bool(int(tree['headers_lc'].get('do_encrypt', 0))) gnupg = GnuPG() if signatureopt: signingstring = MessageAsString(msg) signature = gnupg.sign(signingstring, fromkey=sender, armor=True) # FIXME: Create attachment, attach signature. if signature[0] == 0: # sigblock = MIMEMultipart(_subtype="signed", # protocol="application/pgp-signature") # sigblock.attach(msg) msg.set_type("multipart/signed") msg.set_param("micalg", "pgp-sha1") # need to find this! msg.set_param("protocol", "application/pgp-signature") sigblock = MIMEText(str(signature[1]), _charset=None) sigblock.set_type("application/pgp-signature") sigblock.set_param("name", "signature.asc") sigblock.add_header("Content-Description", "OpenPGP digital signature") sigblock.add_header("Content-Disposition", "attachment; filename=\"signature.asc\"") msg.attach(sigblock) else: # Raise stink about signing having failed. pass #print signature #if encryptopt: # encrypt_to = tree['headers_lc'].get('encrypt_to') # newmsg = gnupg.encrypt(msg.as_string(), encrypt_to) # # TODO: Replace unencrypted message # When a mail has been signed or encrypted, it should be saved as such. del(msg["do_sign"]) del(msg["do_encrypt"]) del(msg["encrypt_to"]) return (sender, set(rcpts), msg)
def PrepareMail(mailobj, sender=None, rcpts=None): if not sender or not rcpts: tree = mailobj.get_message_tree() sender = sender or tree['headers_lc']['from'] if not rcpts: rcpts = ExtractEmails(tree['headers_lc'].get('to', '')) rcpts += ExtractEmails(tree['headers_lc'].get('cc', '')) rcpts += ExtractEmails(tree['headers_lc'].get('bcc', '')) if not rcpts: raise NoRecipientError() rcpts += [sender] # Cleanup... sender = ExtractEmails(sender)[0] rcpts, rr = [sender], rcpts for r in rr: for e in ExtractEmails(r): if e not in rcpts: rcpts.append(e) msg = copy.deepcopy(mailobj.get_msg()) # Remove headers we don't want to expose for bcc in ('bcc', 'Bcc', 'BCc', 'BCC'): if bcc in msg: del msg[bcc] if 'date' not in msg: msg['Date'] = email.utils.formatdate() # Sign and encrypt signatureopt = bool(int(tree['headers_lc'].get('do_sign', 0))) encryptopt = bool(int(tree['headers_lc'].get('do_encrypt', 0))) gnupg = GnuPG() if signatureopt: signingstring = re.sub("[\r]{1}[\n]{0}", "\r\n", msg.get_payload()[0].as_string()) # print ">>>%s<<<" % signingstring.replace("\r", "<CR>").replace("\n", "<LF>") signature = gnupg.sign(signingstring, fromkey=sender, armor=True) # TODO: Create attachment, attach signature. if signature[0] == 0: # sigblock = MIMEMultipart(_subtype="signed", protocol="application/pgp-signature") # sigblock.attach(msg) msg.set_type("multipart/signed") msg.set_param("micalg", "pgp-sha1") # need to find this! msg.set_param("protocol", "application/pgp-signature") sigblock = MIMEText(str(signature[1]), _charset=None) sigblock.set_type("application/pgp-signature") sigblock.set_param("name", "signature.asc") sigblock.add_header("Content-Description", "OpenPGP digital signature") sigblock.add_header("Content-Disposition", "attachment; filename=\"signature.asc\"") msg.attach(sigblock) else: # Raise stink about signing having failed. pass #print signature #if encryptopt: # encrypt_to = tree['headers_lc'].get('encrypt_to') # newmsg = gnupg.encrypt(msg.as_string(), encrypt_to) # # TODO: Replace unencrypted message # When a mail has been signed or encrypted, it should be saved as such. del(msg["do_sign"]) del(msg["do_encrypt"]) del(msg["encrypt_to"]) return (sender, set(rcpts), msg)