我有一個需要發送電子郵件的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);
}
}
}
}
我看到'IsBodyHtml = FALSE;'所以身體被寫入除非的TextBody您明確設置'IsBodyHtml'屬性爲true。你可以添加使用這個類cdoMessage的代碼嗎?這兩臺機器也一樣嗎? – flup
感謝您的迴應!我放棄了這個。 在調用Send之前,IsBodyHtml設置爲true,並且代碼在兩臺機器中完全相同。一個工作,另一個不工作。 我有一個瘋狂的想法,用2008年的服務器替換2008年的服務器,看看會發生什麼。我會及時向大家發佈。 – BCartolo
我們可以責怪新的smtp服務器嗎?它可能會將您的消息轉換回純文本?您是否嘗試過使用普通客戶端通過服務器發送HTML電子郵件? – flup