昨天经过几个小时的研究,把问题搞定了。主要是用邮件Header中的Message-Id来做。
首先在后台用a@company.com发送邮件,在Header中手动增加Message-Id
SmtpClient smtp = new SmtpClient(); MailMessage message = new MailMessage(); message.Body = "test mail Body"; message.From = new MailAddress("a@company.com", "SystemA"); message.Subject = "MailSubject"; message.To.Add(new MailAddress("user@company.com", "User")); message.Headers.Add("Message-Id", String.Format("{0}@{1}", Guid.NewGuid().ToString(), "company.com")); smtp.Send(message);
这样自己生成的Message-Id可以记录到数据库
第一步完成,接下来,用户接收邮件。
我们可以用以下代码来看到用户收到的邮件中,邮件头Header中的Message-Id就是我们在上面增加时候的ID
client.Connect("pop3.company.com", 110, false); client.Authenticate("username", "password"); //得到邮件总数 int MailCount = client.GetMessageCount(); //拿到邮件头 MessageHeader RMailHeader = client.GetMessageHeaders(MailCount); //邮件头中的Message-Id Console.WriteLine(RMailHeader.MessageId); //下载邮件 Message RMessage = client.GetMessage(MailCount); //得到邮件中的附件 List<MessagePart> RMessageAttach = RMessage.FindAllAttachments(); Console.WriteLine(MailCount.ToString()); Console.ReadKey();
第3步,用户回复邮件,回复后,我们用上面同样的代码在接收a@company.com里面的邮件
就会发现,邮件Header中有一个属性:List<string> RAddress = RMailHeader.InReplyTo;
这个InReplyTo就是告诉你,这个邮件是回复的哪封邮件的ID,也就是我们第一步生成的Message-Id
注:第3步中回复的邮件的Message-Id和我们第一步生成的Message-Id是不同的,
第3步中的InReplyTo和第1步中Message-Id是一样,这样我们就能知道这个邮件是回复的哪封邮件
这样我们就可以在系统中做相应的处理了
对于邮件的接收,我之前使用的是第三方的插件来实现的,微软自带的WebClient只有发送邮件的方法。第三方的插件我向你推荐一个Lumisoft.NET和S22.Imap。通过插件接收到邮件后,都能够获得你想要的那些信息,包括发件人,收件人,地址,邮件内容等。
如果两端都是可控的,就用邮件标题和发件人来确认是否同一封邮件,比如OutLook中回复的邮件标题都是原邮件前面加一个前缀。如果有一端不是可控的,那就不知道了,不过我帮你搜到一篇文章: