如何使用 python 发送 gpg 加密电子邮件(带附件)
How to send gpg encrypted email (with attachment) using python
我有一个脚本,我想通过电子邮件发送给定文件夹中新生成的文件。我已经能够使用 smtplib、email 和 uu 生成和发送电子邮件(未加密) .我还成功地发送了一个没有附件的加密 gpg。
然而,发送带有附件的 gpg 加密电子邮件一直是一个挑战。
我使用 python-gnupg 库为该文件创建了密文,并认为我可以将其作为电子邮件正文发送出去。这与我尝试的方法一致。
from email.mime.text import MIMEText
import gnupg
gpg = gnupg.GPG(gnupghome=GPG_HOME_HOME)
with open(FILE_PATH, "rb") as f:
cipher_text = str(gpg.encrypt(FILE_PATH.read(), RECIPIENT_EMAIL)
msg = MIMEText(cipher_text, "plain")
msg["Subject"] = "***TEST***"
msg["From"] = EMAIL_SENDER
msg["To"] = EMAIL_RECIPIENT
msg_text = msg.as_string()
我也尝试根据自己的需要调整 https://docs.python.org/release/3.5.3/library/email-examples.html 中的示例,但我也没有成功。
我的 gpg 设置正确,我可以 send/receive gpg 加密的电子邮件 thunderbird/enigmail。
谁能告诉我如何发送带附件的 gpg 加密电子邮件?我相信这需要对电子邮件结构进行一些低级操作,但我对此不太熟悉。
谢谢,
这就是我想出的方法来获得一个带附件的可用 gnupg 加密电子邮件。我使用了从 thunderbird 发送的一封电子邮件,使用 enigmail 作为模板。
from email.mime.base import MIMEBase
from email.message import Message
import base64
import mimetypes
import os
import gnupg # python-gnupg
def get_email_string(email_address_recipient, file_path_attachment, email_message=""):
def get_base64_file(file_path):
with open(file_path, "rb") as f:
b_str = base64.b64encode(f.read())
return b_str
def get_mimetype(file_path):
return mimetypes.guess_type(file_path)[0]
def get_file_name(file_path):
return os.path.basename(file_path)
def get_gpg_cipher_text(string, recipient_email_address):
gpg = gnupg.GPG(gnupghome=DIR_GNUPG)
encrypted_str = str(gpg.encrypt(string, recipient_email_address))
return encrypted_str
msg = Message()
msg.add_header(_name="Content-Type", _value="multipart/mixed", protected_headers="v1")
msg["From"] = EMAIL_FROM
msg["To"] = email_address_recipient
msg_text = Message()
msg_text.add_header(_name="Content-Type", _value="multipart/mixed")
msg_text.add_header(_name="Content-Language", _value="en-US")
msg_body = Message()
msg_body.add_header(_name="Content-Type", _value="text/plain", charset="utf-8")
msg_body.add_header(_name="Content-Transfer-Encoding", _value="quoted-printable")
msg_body.set_payload(email_message + 2*"\n")
msg_attachment = Message()
msg_attachment.add_header(_name="Content-Type", _value=get_mimetype(file_path_attachment), name=get_file_name(file_path_attachment))
msg_attachment.add_header(_name="Content-Transfer-Encoding", _value="base64")
msg_attachment.add_header(_name="Content-Disposition", _value="attachment", filename=get_file_name(file_path_attachment))
msg_attachment.set_payload(get_base64_file(file_path_attachment))
msg_text.attach(msg_body)
msg_text.attach(msg_attachment)
msg.attach(msg_text)
pgp_msg = MIMEBase(_maintype="multipart", _subtype="encrypted", protocol="application/pgp-encrypted")
pgp_msg["From"] = EMAIL_FROM
pgp_msg["To"] = email_address_recipient
pgp_msg_part1 = Message()
pgp_msg_part1.add_header(_name="Content-Type", _value="application/pgp-encrypted")
pgp_msg_part1.add_header(_name="Content-Description", _value="PGP/MIME version identification")
pgp_msg_part1.set_payload("Version: 1" + "\n")
pgp_msg_part2 = Message()
pgp_msg_part2.add_header(_name="Content-Type", _value="application/octet-stream", name="encrypted.asc")
pgp_msg_part2.add_header(_name="Content-Description", _value="OpenPGP encrypted message")
pgp_msg_part2.add_header(_name="Content-Disposition", _value="inline", filename="encrypted.asc")
pgp_msg_part2.set_payload(get_gpg_cipher_text(msg.as_string(), email_address_recipient))
pgp_msg.attach(pgp_msg_part1)
pgp_msg.attach(pgp_msg_part2)
return pgp_msg.as_string()
如果您仍在寻找更短的解决方案,您可以查看 envelope 库。
pip3 install envelope
只需几行就可以处理附加和加密。
from envelope import Envelope
e = (Envelope()
.message(email_message)
.from_(EMAIL_FROM)
.to(email_address_recipient)
.attach(path=file_path_attachment)
.encryption())
e.as_message() # returns EmailMessage
e.smtp("localhost").send() # directly sends
我有一个脚本,我想通过电子邮件发送给定文件夹中新生成的文件。我已经能够使用 smtplib、email 和 uu 生成和发送电子邮件(未加密) .我还成功地发送了一个没有附件的加密 gpg。
然而,发送带有附件的 gpg 加密电子邮件一直是一个挑战。
我使用 python-gnupg 库为该文件创建了密文,并认为我可以将其作为电子邮件正文发送出去。这与我尝试的方法一致。
from email.mime.text import MIMEText
import gnupg
gpg = gnupg.GPG(gnupghome=GPG_HOME_HOME)
with open(FILE_PATH, "rb") as f:
cipher_text = str(gpg.encrypt(FILE_PATH.read(), RECIPIENT_EMAIL)
msg = MIMEText(cipher_text, "plain")
msg["Subject"] = "***TEST***"
msg["From"] = EMAIL_SENDER
msg["To"] = EMAIL_RECIPIENT
msg_text = msg.as_string()
我也尝试根据自己的需要调整 https://docs.python.org/release/3.5.3/library/email-examples.html 中的示例,但我也没有成功。
我的 gpg 设置正确,我可以 send/receive gpg 加密的电子邮件 thunderbird/enigmail。
谁能告诉我如何发送带附件的 gpg 加密电子邮件?我相信这需要对电子邮件结构进行一些低级操作,但我对此不太熟悉。
谢谢,
这就是我想出的方法来获得一个带附件的可用 gnupg 加密电子邮件。我使用了从 thunderbird 发送的一封电子邮件,使用 enigmail 作为模板。
from email.mime.base import MIMEBase
from email.message import Message
import base64
import mimetypes
import os
import gnupg # python-gnupg
def get_email_string(email_address_recipient, file_path_attachment, email_message=""):
def get_base64_file(file_path):
with open(file_path, "rb") as f:
b_str = base64.b64encode(f.read())
return b_str
def get_mimetype(file_path):
return mimetypes.guess_type(file_path)[0]
def get_file_name(file_path):
return os.path.basename(file_path)
def get_gpg_cipher_text(string, recipient_email_address):
gpg = gnupg.GPG(gnupghome=DIR_GNUPG)
encrypted_str = str(gpg.encrypt(string, recipient_email_address))
return encrypted_str
msg = Message()
msg.add_header(_name="Content-Type", _value="multipart/mixed", protected_headers="v1")
msg["From"] = EMAIL_FROM
msg["To"] = email_address_recipient
msg_text = Message()
msg_text.add_header(_name="Content-Type", _value="multipart/mixed")
msg_text.add_header(_name="Content-Language", _value="en-US")
msg_body = Message()
msg_body.add_header(_name="Content-Type", _value="text/plain", charset="utf-8")
msg_body.add_header(_name="Content-Transfer-Encoding", _value="quoted-printable")
msg_body.set_payload(email_message + 2*"\n")
msg_attachment = Message()
msg_attachment.add_header(_name="Content-Type", _value=get_mimetype(file_path_attachment), name=get_file_name(file_path_attachment))
msg_attachment.add_header(_name="Content-Transfer-Encoding", _value="base64")
msg_attachment.add_header(_name="Content-Disposition", _value="attachment", filename=get_file_name(file_path_attachment))
msg_attachment.set_payload(get_base64_file(file_path_attachment))
msg_text.attach(msg_body)
msg_text.attach(msg_attachment)
msg.attach(msg_text)
pgp_msg = MIMEBase(_maintype="multipart", _subtype="encrypted", protocol="application/pgp-encrypted")
pgp_msg["From"] = EMAIL_FROM
pgp_msg["To"] = email_address_recipient
pgp_msg_part1 = Message()
pgp_msg_part1.add_header(_name="Content-Type", _value="application/pgp-encrypted")
pgp_msg_part1.add_header(_name="Content-Description", _value="PGP/MIME version identification")
pgp_msg_part1.set_payload("Version: 1" + "\n")
pgp_msg_part2 = Message()
pgp_msg_part2.add_header(_name="Content-Type", _value="application/octet-stream", name="encrypted.asc")
pgp_msg_part2.add_header(_name="Content-Description", _value="OpenPGP encrypted message")
pgp_msg_part2.add_header(_name="Content-Disposition", _value="inline", filename="encrypted.asc")
pgp_msg_part2.set_payload(get_gpg_cipher_text(msg.as_string(), email_address_recipient))
pgp_msg.attach(pgp_msg_part1)
pgp_msg.attach(pgp_msg_part2)
return pgp_msg.as_string()
如果您仍在寻找更短的解决方案,您可以查看 envelope 库。
pip3 install envelope
只需几行就可以处理附加和加密。
from envelope import Envelope
e = (Envelope()
.message(email_message)
.from_(EMAIL_FROM)
.to(email_address_recipient)
.attach(path=file_path_attachment)
.encryption())
e.as_message() # returns EmailMessage
e.smtp("localhost").send() # directly sends