Score:1

How can I use E-Mailrelay to implement DKIM?

tr flag

I am trying to add DKIM to an existing windows server which is currently using IIS SMTP for outgoing mail.

It seems like this could be done by using E-Mailrelay. Unfortunately I could not find any reference on how exactly to configure DKIM in E-Mailrelay.

Is there something I missed in the docs or perhaps some third party tutorial that describes how to do this?

djdomi avatar
za flag
did you add the ips to the SPF records?
tr flag
Yes, but how is this related to my question?
Score:1
io flag

Here: https://sourceforge.net/projects/dkimsigningfilter/files/latest/download is an compiled app based on the modified code above. The installer saves the domain, selector, and key path to the config.txt file at the location ./config. The program acts as a filter for E-Mailrelay.

tr flag
The site seems to be down. Could you perhaps upload it to Github or Sourceforge?
Wojtek Kowalski avatar
io flag
Uploaded to Sourceforge: https://sourceforge.net/projects/dkimsigningfilter/files/latest/download
Score:0
tr flag

I implemented a simple command line app with C# / NET 6 to act as a filter in E-MailRelay:

using System.IO;
using System.Text;
using MimeKit;
using MimeKit.Cryptography;

namespace E_MailRelay.DKIM.Filter;

/// <summary>
/// Reads an e-mail message, adds a Hardcoded DKIM signature and and writes 
the updated message back to disk
/// Note that this requires the installation MailKit to work. 
/// </summary>


internal class Program
{
private const string DKIMSelector = "ENTER_YOUR_DKIM_SELECTOR_HERE";
private const string _DKIMDomain = "ENTER_YOUR_DOMAIN_NAME_HERE";
private const string DKIMPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n"
                                      + @"ENTER_YOUR_PRIVATE_KEY_HERE"
                                      + "\r\n-----END RSA PRIVATE KEY-----";

private static int Main(string[] args)
{
    LoadSignAndRewriteMail(args);
    return 102;
}

private static void LoadSignAndRewriteMail(string[] args)
{
    var emailMessage = MimeMessage.Load(args[0]);
    if (!emailMessage.Headers.Contains(HeaderId.DkimSignature)
        && !emailMessage.Headers.Contains(HeaderId.DomainKeySignature))
    {
        SignMail(emailMessage);
    }

    emailMessage.WriteTo(args[0]);
}


private static void SignMail(MimeMessage emailMessage)
{
    var pk = DKIMPrivateKey;
    MemoryStream stream = new(Encoding.UTF8.GetBytes(pk));
    {
        stream.Position = 0;
    }



    var dkimSigner = new DkimSigner(stream, _DKIMDomain, DKIMSelector);


    HeaderId[] dkimSignHeaders =
    {
        HeaderId.To, HeaderId.Cc, HeaderId.Subject, HeaderId.From, HeaderId.Date, HeaderId.MessageId, HeaderId.Body,
        HeaderId.Date, HeaderId.MimeVersion, HeaderId.Sender, HeaderId.ReplyTo, HeaderId.ContentTransferEncoding,
        HeaderId.ContentId, HeaderId.ContentDescription, HeaderId.ResentDate, HeaderId.ResentFrom,
        HeaderId.ResentSender, HeaderId.ResentTo, HeaderId.ResentCc, HeaderId.ResentMessageId, HeaderId.InReplyTo,
        HeaderId.References
    };

    dkimSigner.Sign(FormatOptions.Default, emailMessage, dkimSignHeaders);
}
}
mangohost

Post an answer

Most people don’t grasp that asking a lot of questions unlocks learning and improves interpersonal bonding. In Alison’s studies, for example, though people could accurately recall how many questions had been asked in their conversations, they didn’t intuit the link between questions and liking. Across four studies, in which participants were engaged in conversations themselves or read transcripts of others’ conversations, people tended not to realize that question asking would influence—or had influenced—the level of amity between the conversationalists.