如何使用 Office 365 电子邮件服务器在 .NET Core 中进行 DKIM 签名和发送电子邮件?

问题描述 投票:0回答:1

在我们公司,我们与大学合作,帮助他们寻找并联系校友。我们有一个托管在 Azure 中的 .Net Core Web 应用程序,允许合作大学向其校友发送电子邮件。我们的一项重要要求是能够使用我们的 Office 365 电子邮件服务器作为合作伙伴的域发送电子邮件。为了实现这一目标,我们与我们的合作伙伴之一北卡罗来纳州立大学 (NCSU) 合作。

这就是我们所做的:

  1. 使用在线 DKIM 记录生成器创建 DKIM 密钥对 https://easydmarc.com/tools/dkim-record-generator。域名是:ncsu.edu;选择器是:edvision;密钥长度为:2048。

  2. 请求 NCSU 使用生成的 DKIM 公钥在其域 DNS 中发布 DKIM 记录。可以在此处查找 DKIM 记录:https://mxtoolbox.com/SuperTool.aspx?action=dkim%3ancsu.edu%3aedvision&run=toolpage

  3. 在内部保存私钥以用于签名消息。

  4. 创建了一个 API,用于使用 MimeKit 和适用于 .NET 的 MailKit 库发送带有 DKIM 签名的电子邮件。 API 代码如下:

public async Task<IActionResult> SendDkimWithMimeKit()
{
            try
            {
                string toAddress = HttpContext.Request.Form["toAddress"];
                string subject = "Test DKIM Email Integration";
                var message = new MimeMessage();
                message.To.Add(new MailboxAddress("Test Mailbox", toAddress));
                message.From.Add(new MailboxAddress("Test NCSU Mailbox", "[email protected]"));
                message.Subject = subject;
                // Sign the message with DKIM signature
                string domain = "ncsu.edu"; // partner domain
                string selector = "edvision"; // selector
                var headers = new HeaderId[] { HeaderId.From, HeaderId.Subject, HeaderId.To };
                var signer = new MimeKit.Cryptography.DkimSigner(Path.Combine(_env.WebRootPath, "static/dkimkey.txt"),
                    domain, selector, DkimSignatureAlgorithm.RsaSha1)
                {
                    HeaderCanonicalizationAlgorithm = MimeKit.Cryptography.DkimCanonicalizationAlgorithm.Relaxed,
                    BodyCanonicalizationAlgorithm = MimeKit.Cryptography.DkimCanonicalizationAlgorithm.Relaxed,
                    AgentOrUserIdentifier = "@ncsu.edu",
                    QueryMethod = "dns/txt",
                };
                var builder = new BodyBuilder();
                builder.TextBody = "Test DKIM";
                builder.HtmlBody = "<p>Test DKIM</p>";
                message.Body = builder.ToMessageBody();
                // Prepare the message and sign
                message.Prepare(EncodingConstraint.SevenBit);
                signer.Sign(message, headers);
                // Send the email
                using (var client = new MailKit.Net.Smtp.SmtpClient())
                {
                    await client.ConnectAsync("edvision-ai.mail.protection.outlook.com", 25);
                    await client.SendAsync(message);
                    client.Disconnect(true);
                }
                return Ok();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return Ok(ex.Message);
            }
}

预期结果:

当我们的合作伙伴使用我们的网络应用程序向任何有效的电子邮件地址发送电子邮件时,收件人应该收到来自我们合作伙伴的域的电子邮件。例如,拥有 [email protected] 电子邮件地址的 NCSU 用户登录我们的网站 edvision.ai,撰写电子邮件并将其发送至应用程序中的 [email protected],然后发送至 [email protected] 的所有者 应收到来自 [电子邮件受保护] 的电子邮件。

发生了什么:

我们的合作伙伴无法发送电子邮件,而是收到以下错误:

"5.7.64 TenantAttribution; Relay Access Denied [ValidationStatus of '' is EmptyCertificate] [DS1PEPF00017095.namprd03.prod.outlook.com 2024-02-29T16:12:55.562Z 08DC376E7A2E7644]"

有趣的是,我们的合作伙伴能够向 usf.edu 电子邮件地址发送电子邮件。我们认为我们的合作伙伴之所以可以将 DKIM 电子邮件发送到 USF 电子邮件地址,是因为 USF 使用与我们相同的电子邮件托管服务,即 Office 365。

目前,我们不确定问题是否出在 DKIM 签名过程或 Microsoft 365 中的任何错误配置。

到目前为止我们已经尝试过:

  • 我们已验证我们的私钥与 DKIM 记录中的公钥匹配。
  • 我们尝试了不同的 .NET 库来将 DKIM 签名添加到电子邮件中,包括免费和付费库。
  • 我们在 Exchange 管理中心添加了连接器,以确保从我们的 IP 地址发送的电子邮件可以通过。
  • 我们已经测试了我们的代码,允许另一台电子邮件服务器使用我们的域 (edvision.ai) 发送电子邮件,方法是在我们的域 DNS 中发布 DKIM 记录,并使用私钥使用其他服务器发送 DKIM 电子邮件,并且它有效。
.net-core office365 asp.net-core-webapi smtpclient dkim
1个回答
0
投票

来自 SMTP 的错误消息是这样的:

5.7.64 TenantAttribution; Relay Access Denied ...

查看您的代码,您正在尝试将邮件中继到 edvision-ai.mail.protection.outlook.com”,端口 25。

这就是问题所在。此错误与 DKIM 无关。

您可能需要连接到 smtp-mail.outlook.com 端口 587 并进行身份验证才能发送邮件。

© www.soinside.com 2019 - 2024. All rights reserved.