使用 C 使用 SMTP 时,如何从 AWS SES 获取 MessageID#

How do you get the MessageID from AWS SES when using SMTP using C#

提问人:KeithL 提问时间:8/24/2023 最后编辑:KeithL 更新时间:8/24/2023 访问量:87

问:

我之所以提出这个问题,是因为我花了两天多的时间把答案放在一起来解决这个问题。

我尝试接收分配给电子邮件的 AWS MessageID,以便以后可以使用 SNS/SQS 接收电子邮件反馈。使用 System.Net.SmtpClient 对成功的电子邮件进行响应。您仅在失败时收到异常代码。

AWS 将始终发送响应,但为了获得成功的消息,我需要合并 MailKit nuget 并使用 MessageSent 事件。

resposne 看起来像这样......“OK xxxxx-xxxxxx-xxxxxx-xxxxx”,其中 x 是新分配的 messageID。

C# 网络服务 SMTP 亚马逊 SES 邮件套件

评论


答:

0赞 KeithL 8/24/2023 #1

下面是使用我用来从成功响应中获取 messageID 的方法发送电子邮件的最简单代码。我希望这能为人们节省很多时间!

只需使用 MailKit nuget 和以下代码:

using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;

namespace TestMail
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            await SendMail();
        }

        internal static async Task SendMail()
        {
            using (var mail = new MimeMessage())
            {
                mail.From.Add(MailboxAddress.Parse("[email protected]"));

                mail.To.Add(MailboxAddress.Parse("[email protected]"));

                mail.Subject = "TEST";

                mail.Body = new TextPart(MimeKit.Text.TextFormat.Html) { Text = "<P>Hello!</P>" };

                string goodMessage = "";
                using (var smtp = new SmtpClient())
                {
                    smtp.MessageSent += async (sender, args) =>
                    {
                        goodMessage = args.Response;
                    };
                    
                    await smtp.ConnectAsync("email-smtp.us-east-1.amazonaws.com", 587, SecureSocketOptions.StartTls);

                    await smtp.AuthenticateAsync("user", "password");
                    await smtp.SendAsync(mail);                                    
                }

                Console.WriteLine("This is the messageID: " + goodMessage.Split(' ')[1]);

            }            
        }
    }
}
0赞 jstedfast 8/24/2023 #2

我相信从 MailKit 3.0 开始,Send() 和 SendAsync() 方法现在返回一个字符串值,这样您实际上就不需要监听 MessageSent 事件:

using (var smtp = new SmtpClient())
{
    await smtp.ConnectAsync("email-smtp.us-east-1.amazonaws.com", 587, SecureSocketOptions.StartTls);
    await smtp.AuthenticateAsync("user", "password");

    string response = await smtp.SendAsync(mail);
    string[] tokens = response.Split(' ');
    string id = tokens[1];

    await smtp.DisconnectAsync(true);
}

评论

0赞 KeithL 8/24/2023
当 smtp 在使用中时,您是否需要断开连接?
0赞 jstedfast 9/2/2023
你没有“必须”这样做,但 Dispose() 方法只是关闭套接字,而不是将 QUIT 命令发送到服务器,这被认为是更好的礼仪。