通过自定义MTA的Python生成DKIM签名

时间:2016-03-16 22:04:31

标签: python email base64 sha256 dkim

好的,所以我不会完全迷失DKIM。我知道使用您的公钥编码和设置DNS记录的一般规则等。我遇到的问题是合并“即时”签署出站电子邮件并注入我的标题,因为我的MTA是自定义的,写在蟒蛇从头开始,没有开箱即用。想知道是否有人有一个小蟒蛇的例子,即使用DKIM发送一封电子邮件,并经历所有动议。就像使用与dns设置中的姐妹(公共)密钥匹配的私钥生成256位加密体一样。

3 个答案:

答案 0 :(得分:2)

这应该有所帮助。

https://launchpad.net/dkimpy

我查看了项目中包含的测试和命令行工具,以了解如何使用它。

这是一个代码片段,可以让您了解如何使用它。对不起,我无法提供更多。

    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发送电子邮件。

可以在此处轻松生成私钥和公钥:

https://www.port25.com/support/domainkeysdkim-wizard/

答案 1 :(得分:1)

我要感谢Georg Zimmer的上述答案。我遇到了一些困难,在Python 3.6.2上运行它作为一些&#34;字节&#34; /&#34;字符串&#34;自2.x版本以来,项目已更改。下面是制作MIMEMultipart(文本/ HTML)并使用DKIM签名的代码。我使用了dkimpy-0.6.2。

我的第一篇StackOverflow帖子。希望它可以帮助你...

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()

答案 2 :(得分:0)

在前两个答案的基础上,我还有一些额外的提示。

  1. 确保您运行
  2. pip install dkimpy
    
    1. 生成私钥。在Unix上:
    2. openssl genrsa -out dkimprivatekey.pem 1024
      1. 产生公众。在Unix上:
      2. openssl rsa -in dkimprivatekey.pem -out public.pem -pubout
        1. 使用选择器&#34;简介&#34;将公钥添加到DNS。 (这就是上面的例子。
        2. 在上面的代码中为您的私钥提供路径和文件名(上面的示例使用C:\dev\python\2048.example.com.priv