2013-11-22 37 views
2

我有一個需要發送電子郵件的ASP.NET應用程序。起初我使用System.Net.Mail,一切都很好。我的應用程序可以發送HTML消息,人們收到他們就好了。用戶以純文本格式收到cdo郵件

但後來我們添加了一個新的Web服務器,並且該Web服務器需要使用不同的smtp服務器發送電子郵件的SSL。所以我不得不使用cdo消息而不是System.Net.Mail。 請參閱How can I send emails through SSL SMTP with the .NET Framework?

現在發生了一些非常奇怪的事情。原始服務器以純文本格式發送電子郵件,而第二臺服務器以html格式發送電子郵件。兩臺服務器都使用完全相同的代碼(在本文結尾處)。唯一的區別是原始服務器不需要用戶名和密碼,而第二個服務器不需要。

另一個區別是第一個服務器運行的是Windows Server 2008 R2,第二個服務器運行的是Windows Server 2012.但是我不認爲cdo在這兩個版本之間發生了變化,對吧?

我不知道如何解決這個問題。問題不在代碼中,因爲第二臺服務器工作正常,並且它不在第一臺服務器使用的smtp服務器中,因爲它在System.Net.Mail中工作正常。任何想法??

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Configuration; 
using System.Net.Configuration; 
using System.Net.Mail; 
using System.Runtime.InteropServices; 

namespace Kernel 
{ 
    public class cdoMessage 
    { 
     public String Host; 
     public String Username; 
     public String Password; 
     public Int32 Port; 
     public Boolean EnableSsl; 
     public String From; 
     public MailAddressCollection To; 
     public Boolean IsBodyHtml; 
     public String Subject; 
     public String Body; 
     public MailAddressCollection Bcc; 

     public cdoMessage() 
     { 
      SmtpSection settings = (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp"); 

      Host = settings.Network.Host; 

      Username = settings.Network.UserName; 

      Password = settings.Network.Password; 

      Port = settings.Network.Port; 

      EnableSsl = settings.Network.EnableSsl; 

      From = settings.From; 

      To = new MailAddressCollection();    

      IsBodyHtml = false; 

      Bcc = new MailAddressCollection(); 
     } 

     String s(String e) 
     { 
      return "http://schemas.microsoft.com/cdo/configuration/" + e; 
     } 

     public void Send() 
     { 

      CDO.Message message = new CDO.Message(); 

      try 
      { 
       message.Configuration.Fields[s("smtpserver")].Value = Host; 

       message.Configuration.Fields[s("smtpserverport")].Value = Port; 

       message.Configuration.Fields[s("sendusing")].Value = CDO.CdoSendUsing.cdoSendUsingPort; 

       if (Username == null && Password == null) 
       { 
        message.Configuration.Fields[s("smtpauthenticate")].Value = CDO.CdoProtocolsAuthentication.cdoAnonymous; 
       } 
       else 
       { 
        message.Configuration.Fields[s("smtpauthenticate")].Value = CDO.CdoProtocolsAuthentication.cdoBasic; 

        message.Configuration.Fields[s("sendusername")].Value = Username; 

        message.Configuration.Fields[s("sendpassword")].Value = Password; 
       } 

       if (EnableSsl) 
       { 
        message.Configuration.Fields[s("smtpusessl")].Value = "true"; 
       } 

       message.Configuration.Fields.Update(); 

       message.From = From; 

       // ToString works just fine. 
       message.To = To.ToString(); 

       message.BCC = Bcc.ToString(); 

       message.Subject = Subject; 

       if (IsBodyHtml) 
       { 
        message.HTMLBody = Body; 
       } 
       else 
       { 
        message.TextBody = Body; 
       } 

       message.Send(); 
      } 
      finally 
      { 
       Marshal.ReleaseComObject(message); 
      } 
     } 
    } 
} 
+1

我看到'IsBodyHtml = FALSE;'所以身體被寫入除非的TextBody您明確設置'IsBodyHtml'屬性爲true。你可以添加使用這個類cdoMessage的代碼嗎?這兩臺機器也一樣嗎? – flup

+0

感謝您的迴應!我放棄了這個。 在調用Send之前,IsBodyHtml設置爲true,並且代碼在兩臺機器中完全相同。一個工作,另一個不工作。 我有一個瘋狂的想法,用2008年的服務器替換2008年的服務器,看看會發生什麼。我會及時向大家發佈。 – BCartolo

+0

我們可以責怪新的smtp服務器嗎?它可能會將您的消息轉換回純文本?您是否嘗試過使用普通客戶端通過服務器發送HTML電子郵件? – flup

回答

0

嘗試都.HTMLBody.TextBody設置爲你想要的值。純文本和html的理想版本不同。通常,如果有人缺席,那就是html。 Html被認爲是大多數讀者的「替代」顯示文本,至少它在當天回來了。也許不同的SMTP服務器處理丟失的電子郵件字段的方式不同

如果這樣不能解決問題,請在兩個字段中發送純文本,並查看兩個服務器是否將它們視爲相同。

如果這不起作用,從服務器B通過服務器A轉發電子郵件,反之亦然,看看會發生什麼。即使你只是從你的電子郵件閱讀器手動執行它。它很可能是默認情況下以純文本形式發送的第二臺SMTP服務器上的設置。

查看從兩臺服務器收到的消息中的MIME頭。尋找差異,讓你知道實際上有什麼不同。

你應該最終能夠確定發生了什麼以及在哪裏。

UPDATE

把你的憑據,讓這個嘗試。它通過SSL將郵件發送到我的Gmail地址。嘗試發送到您的舊服務器。

public bool SendMail() { 
     var client = new SmtpClient("smtp.gmail.com", 587) { 
      Credentials = new NetworkCredential("your email", "password"), 
      EnableSsl = true 
     }; 

     MailMessage message = new MailMessage(
      new MailAddress("from email address"), 
      new MailAddress("to email address")) { 
       Body = "This is a test e-mail message sent using SSL ", 
       Subject = "Test email with SSL and Credentials" 
      }; 

     try { 
      client.Send(message); 
     } catch (Exception ex) { 
      Console.WriteLine("Exception is:" + ex.ToString()); 
     } 

     return false; 
    } 
+0

謝謝!我會嘗試你的建議和看看。在發佈問題之前,我確實查看了好的和不好的服務器的標題。 壞服務器剝離html標籤並以純文本形式發送消息: Content-Type:text/plain;字符集= 「ISO-8859-1」 X-MimeOLE:公司生產的微軟MimeOLE V6.1.7601.17609 純文本 雖然好的服務器: 的Content-Type:multipart/alternative的;邊界= 「---- = _ NextPart_000_0000_01CEF687.3EEA8DA0」 X-MimeOLE:公司生產的微軟MimeOLE V6.3.9600.16384 純文本 ------ = _ NextPart_000_0000_01CEF687.3EEA8DA0 的Content-Type:text/html的 格式化文本 – BCartolo

+0

因此,我將.TextBody設置爲

A

,然後與.HTMLBody相同,並將電子郵件中的html標記視爲字符,而不是呈現。 不幸的是,服務器在防火牆後面,所以我不能交叉測試 – BCartolo

+0

html版本是否通過了MIME內容?換句話說,文本和html版本都會通過,而讀者會顯示錯誤的版本?如果是這樣,您是否使用相同的電子郵件閱讀器查看來自兩臺服務器的電子郵件?如果這不是問題,你是否託管你自己的電子郵件服務器或由供應商維護?如果供應商聯繫他們並解釋問題,如果不是,則需要系統管理員的幫助。如果MIME內容相同,則是您的讀者。如果它們不同,它就是郵件服務器。 – drankin2112

0

我想起這件事情發生有奇怪的原因:

如果車身線條太長SMTP服務將發送郵件,因爲即使我們發送它作爲HTML純文本。嘗試通過插入\ n換行符將郵件正文分解爲較短的行。雖然我不能說這些線路可能有多長。

+0

謝謝!這可能是問題所在。我會測試並看到。 – BCartolo

+0

這沒有奏效。我試了一封電子郵件

A

,但它仍然顯示爲純文本。 – BCartolo

相關問題