为自定义 MTA 生成 DKIM 签名 VIA Python
Generating DKIM signatures VIA Python for Custom MTA
好的,所以我并没有完全迷失 DKIM。我知道使用 public 密钥等编码和设置 DNS 记录的一般规则。我遇到的问题是合并出站电子邮件的 "on the fly" 签名并注入我的 header 因为我的 MTA 是自定义的,从头开始用 python 编写,而不是开箱即用。想知道是否有人有 python 使用 DKIM 发送一封电子邮件并完成所有动作的小示例。就像使用与 dns 设置中的姊妹 (public) 密钥匹配的私钥生成 256 位加密 body。
这应该有所帮助。
我查看了项目中包含的测试和命令行工具以了解如何使用它。
这是一个代码片段,可以让您了解如何使用它。对不起,我不能提供更多。
self.dkim_private = open(os.path.join(settings.PROJECT_DIR, 'private_key.pem')).read()
... snip ...
msg = MIMEMultipart('alternative')
msg['From'] = "{0} <{1}>".format(self.sendfrom_name, self.sendfrom)
msg['To'] = self.sendto
msg['Date'] = formatdate(localtime=True)
msg['Message-ID'] = self.message_id
msg['Subject'] = self.subject
msg.attach(MIMEText(unicodedata.normalize('NFKD', self.body_text), 'plain'))
msg.attach(MIMEText(self.body, 'html'))
sig = dkim.sign(msg.as_string(), 'myselector',
from_domain, self.dkim_private,
include_headers=['from', 'to', 'subject', 'message-id'])
msg['DKIM-Signature'] = sig[len("DKIM-Signature: "):]
然后你可以使用 smtplib 来发送邮件。
可以在此处轻松生成私钥和 public 密钥:
感谢 Georg Zimmer 的上述回答。我 运行 在 Python 3.6.2 上遇到了一些困难 运行,因为一些 "byte" / "string" 项目自 2.x 版本以来发生了变化。下面是制作 MIMEMultipart (text/HTML) 并使用 DKIM 签名的代码。我用的是 dkimpy-0.6.2.
我的第一个 Whosebug post。希望对你有帮助...
import smtplib, dkim, time, os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
print('Content-Type: text/plain')
print('')
msg = MIMEMultipart('alternative')
msg['From'] = 'test@example.com'
msg['To'] = 'person@anotherexample.com'
msg['Subject'] = ' Test Subject'
msg['Message-ID'] = "<" + str(time.time()) + "-1234567890@example.com" + ">"
# Create the body of the message (a plain-text and an HTML version).
text = """\
Test email displayed as text only
"""
html = """\
<!doctype html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
<head>
<title>Test DKMI Email</title>
</head>
<body>
HTML Body of Test DKIM
</body>
</html>
"""
# Record the MIME types of both parts - text/plain and text/html.
part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')
msg.attach(part1)
msg.attach(part2)
# DKIM Private Key for example.com RSA-2048bit
privateKey = open(os.path.join('C:\dev\python\', '2048.example.com.priv')).read()
# Specify headers in "byte" form
headers=[b'from', b'to', b'subject', b'message-id']
# Generate message signature
sig = dkim.sign(msg.as_bytes(), b'introduction', b'example.com', privateKey.encode(), include_headers=headers)
sig = sig.decode()
# Add the DKIM-Signature
msg['DKIM-Signature'] = sig[len("DKIM-Signature: "):]
# Send the message via local SMTP server.
s = smtplib.SMTP('localhost')
# sendmail function takes 3 arguments: sender's address, recipient's address
# and message to send - here it is sent as one string.
s.sendmail(msg['From'], msg['To'], msg.as_string())
s.quit()
在前两个答案的基础上,我有一些额外的提示。
- 确定你 运行
pip install dkimpy
- 生成私钥。在 Unix 上:
openssl genrsa -out dkimprivatekey.pem 1024
- 生成 public。在 Unix 上:
openssl rsa -in dkimprivatekey.pem -out public.pem -pubout
- 使用选择器 "introduction" 将 public 键添加到您的 DNS(上面的示例使用的就是这个。
- 在上面的代码中提供您的私钥的路径和文件名(上面的示例使用
C:\dev\python\
和 2048.example.com.priv
)
好的,所以我并没有完全迷失 DKIM。我知道使用 public 密钥等编码和设置 DNS 记录的一般规则。我遇到的问题是合并出站电子邮件的 "on the fly" 签名并注入我的 header 因为我的 MTA 是自定义的,从头开始用 python 编写,而不是开箱即用。想知道是否有人有 python 使用 DKIM 发送一封电子邮件并完成所有动作的小示例。就像使用与 dns 设置中的姊妹 (public) 密钥匹配的私钥生成 256 位加密 body。
这应该有所帮助。
我查看了项目中包含的测试和命令行工具以了解如何使用它。
这是一个代码片段,可以让您了解如何使用它。对不起,我不能提供更多。
self.dkim_private = open(os.path.join(settings.PROJECT_DIR, 'private_key.pem')).read()
... snip ...
msg = MIMEMultipart('alternative')
msg['From'] = "{0} <{1}>".format(self.sendfrom_name, self.sendfrom)
msg['To'] = self.sendto
msg['Date'] = formatdate(localtime=True)
msg['Message-ID'] = self.message_id
msg['Subject'] = self.subject
msg.attach(MIMEText(unicodedata.normalize('NFKD', self.body_text), 'plain'))
msg.attach(MIMEText(self.body, 'html'))
sig = dkim.sign(msg.as_string(), 'myselector',
from_domain, self.dkim_private,
include_headers=['from', 'to', 'subject', 'message-id'])
msg['DKIM-Signature'] = sig[len("DKIM-Signature: "):]
然后你可以使用 smtplib 来发送邮件。
可以在此处轻松生成私钥和 public 密钥:
感谢 Georg Zimmer 的上述回答。我 运行 在 Python 3.6.2 上遇到了一些困难 运行,因为一些 "byte" / "string" 项目自 2.x 版本以来发生了变化。下面是制作 MIMEMultipart (text/HTML) 并使用 DKIM 签名的代码。我用的是 dkimpy-0.6.2.
我的第一个 Whosebug post。希望对你有帮助...
import smtplib, dkim, time, os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
print('Content-Type: text/plain')
print('')
msg = MIMEMultipart('alternative')
msg['From'] = 'test@example.com'
msg['To'] = 'person@anotherexample.com'
msg['Subject'] = ' Test Subject'
msg['Message-ID'] = "<" + str(time.time()) + "-1234567890@example.com" + ">"
# Create the body of the message (a plain-text and an HTML version).
text = """\
Test email displayed as text only
"""
html = """\
<!doctype html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
<head>
<title>Test DKMI Email</title>
</head>
<body>
HTML Body of Test DKIM
</body>
</html>
"""
# Record the MIME types of both parts - text/plain and text/html.
part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')
msg.attach(part1)
msg.attach(part2)
# DKIM Private Key for example.com RSA-2048bit
privateKey = open(os.path.join('C:\dev\python\', '2048.example.com.priv')).read()
# Specify headers in "byte" form
headers=[b'from', b'to', b'subject', b'message-id']
# Generate message signature
sig = dkim.sign(msg.as_bytes(), b'introduction', b'example.com', privateKey.encode(), include_headers=headers)
sig = sig.decode()
# Add the DKIM-Signature
msg['DKIM-Signature'] = sig[len("DKIM-Signature: "):]
# Send the message via local SMTP server.
s = smtplib.SMTP('localhost')
# sendmail function takes 3 arguments: sender's address, recipient's address
# and message to send - here it is sent as one string.
s.sendmail(msg['From'], msg['To'], msg.as_string())
s.quit()
在前两个答案的基础上,我有一些额外的提示。
- 确定你 运行
pip install dkimpy
- 生成私钥。在 Unix 上:
openssl genrsa -out dkimprivatekey.pem 1024
- 生成 public。在 Unix 上:
openssl rsa -in dkimprivatekey.pem -out public.pem -pubout
- 使用选择器 "introduction" 将 public 键添加到您的 DNS(上面的示例使用的就是这个。
- 在上面的代码中提供您的私钥的路径和文件名(上面的示例使用
C:\dev\python\
和2048.example.com.priv
)