2012-05-27 61 views
6

在.NET中使用SmtpClientMailMessage classes通過本地郵件服務器(hMailServer)發送電子郵件,我當前沒有辦法獲得已發送郵件的Message-ID標頭值。是否可以捕獲通過SmtpClient發送的電子郵件消息的「消息ID」?

背後

我試圖以編程方式跟蹤無法投遞的郵件,所以我必須找到一種方法,從拒絕某個消息目標SMTP服務器識別回覆的想法。

現在我想到了簡單地記住Message-ID SMTP標頭值並解析傳入此郵件的郵件。

我發送郵件後試過檢查Headers collection,但是我沒有找到任何Message-ID

我的問題

是否有可能讓我的SMTP服務器MailMessage實例的發送過程中添加Message-ID頭價值?

更新2012-05-27

this example我已經成功地嘗試了發送前對我自己手動生成一個Message-ID

我所有的例子工作到目前爲止,所以它似乎這是我的問題的解決方案。

+1

我很確定這個id是由SMTP服務器分配的,並且SMTP協議沒有指定將該值返回給客戶端。解決這個問題的方法是將相同的消息發送給您控制的帳戶,並從該消息中提取消息ID ...假設消息標識在初始SMTP服務器上生成一次。另一種可能性是在電子郵件中添加一個自定義「X-tag」。 –

+0

謝謝,@JeremyHolovacs - 我已經嘗試添加一個自定義標籤(不是用「X-」前綴,雖然),看起來這個標籤在轉發或回覆郵件時丟失了。 –

+1

不幸的是,根據http://stackoverflow.com/questions/7095104/how-to-confirm-that-mail-has-been-delivered-or-not沒有一個防彈的方法。 –

回答

2

您的問題的標準解決方案是VERP。閱讀伯恩斯坦的原創文章,瞭解爲什麼Message-Id et al。不可靠。 http://cr.yp.to/proto/verp.txt

+1

試圖找出如何使用GMail進行VERP ...由於GMail會覆蓋已認證帳戶上的電子郵件(即使您的加號地址基於經過認證的電子郵件地址),因此無法使用加號地址進行發送。 – MikeJansen

+1

@MikeJansen:如果你有問題,請發表一個問題。 – tripleee

+1

抱歉,不知道爲什麼我發佈了該評論。從我發現的內容中無法真正使用gmail進行VERP。這篇文章總結了我發現的內容:http://stackoverflow.com/questions/9925392/does-gmail-not-allow-sender-to-set-a-return-path-value-to-receive-bounce-message 。我需要使用另一個SMTP服務器,我自己的或另一個提供商。 – MikeJansen

2

您可以在發送電子郵件之前添加自己的消息ID。我用下面的代碼:

Guid id = Guid.NewGuid(); //Save the id in your database 
mensajeEmail.Headers.Add("Message-Id", String.Format("<{0}@{1}>",id.ToString(),"mail.example.com")); 

注:下載的消息我用OpenPop.Net,我檢查message.Headers.InReplyTo財產,並有sended消息ID。

相關問題