使用以下代码将S/MIME电子邮件加密和签名:
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import smtplib
from OpenSSL import crypto
def send_signed_email(sender_email, recipient_email, subject, body, attachments, signing_key_file, signing_key_password):
# Set up the message
msg = MIMEMultipart()
msg['From'] = sender_email
msg['To'] = recipient_email
msg['Subject'] = subject
# Add text body
msg.attach(MIMEText(body, 'plain'))
# Add attachments
for attachment in attachments:
with open(attachment['path'], 'rb') as f:
file_data = f.read()
attachment_part = MIMEApplication(file_data, Name=attachment['filename'])
attachment_part['Content-Disposition'] = f'attachment; filename="{attachment["filename"]}"'
msg.attach(attachment_part)
# Sign and encrypt the message
with open(signing_key_file, 'r') as f:
signing_key_data = f.read()
signing_key = crypto.load_privatekey(crypto.FILETYPE_PEM, signing_key_data, signing_key_password)
p7 = crypto.SMIME.PKCS7()
p7.set_flags(crypto.SMIME.PKCS7_DETACHED)
p7.set_data(str(msg))
p7.add_signer(crypto.SMIME.PKCS12.from_file(signing_key_file, signing_key_password).get_certificate(), signing_key, 'sha256')
signed_data = p7.sign()
with open(signing_key_file, 'r') as f:
signing_key_data = f.read()
signing_key = crypto.load_privatekey(crypto.FILETYPE_PEM, signing_key_data, signing_key_password)
p7 = crypto.SMIME.PKCS7()
p7.set_flags(crypto.SMIME.PKCS7_DETACHED)
p7.set_data(signed_data)
p7.add_certificate(crypto.X509.from_cryptography(signing_key.get_certificate()))
p7.add_recipient(crypto.X509.from_cryptography(crypto.X509.from_cryptography(recipient_email)))
encrypted_data = p7.encrypt()
# Send the message
with smtplib.SMTP('smtp.gmail.com', 587) as server:
server.starttls()
server.login(sender_email, 'password')
server.sendmail(sender_email, recipient_email, encrypted_data.as_bytes())
# Example usage
sender_email = 'example@gmail.com'
recipient_email = 'recipient@example.com'
subject = 'Example email'
body = 'Hello,\n\nThis is an example email.\n\nRegards