Search code examples
pythonencryptionsmtpdkim

how to send encrypted and dkim signed mail using python?


having some web application I need to send emails using python. i want to send messages both content encrypted and signed with DKIM. I‌ have no idea how to do this in python or using which library.

BTW i have my own smtp server using postfix.


Solution

  • Try this:

    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'] = '"Ur Name" <name@urdomain.com>'
    msg['To'] = 'test@gmail.com'
    msg['Subject'] = ' Test Subject'
    
    # 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 DKIM/TLS 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( 'your_key.pem')).read()
    
    # Specify headers in "byte" form
    headers=[b'from', b'to', b'subject']
    
    # Generate message signature
    sig = dkim.sign(msg.as_string(), b'key1', b'urdomain.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()
    

    you can read more here.