Как использовать E-Mailrelay для реализации DKIM?

Как использовать E-Mailrelay для реализации DKIM?

Я пытаюсь добавить DKIM к существующему серверу Windows, который в настоящее время использует IIS SMTP для исходящей почты.

Кажется, это можно сделать с помощьюE-Mailrelay. К сожалению, я не смог найти никакой ссылки на то, как именно настроить DKIM в E-Mailrelay.

Может быть, я что-то упустил в документации или, может быть, есть какое-то стороннее руководство, описывающее, как это сделать?

решение1

Здесь: https://sourceforge.net/projects/dkimsigningfilter/files/latest/download — это скомпилированное приложение на основе модифицированного кода выше. Установщик сохраняет домен, селектор и путь ключа в файле config.txt в расположении ./config. Программа действует как фильтр для E-Mailrelay.

решение2

Я реализовал простое приложение командной строки на C# / NET 6, которое будет работать как фильтр в 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);
}
}

Связанный контент