【发布时间】:2013-12-14 08:12:32
【问题描述】:
我有一个需要发送电子邮件的 ASP.NET 应用程序。起初我使用 System.Net.Mail,一切都很好。我的应用程序可以发送 html 消息,人们收到它们就好了。
但后来我们添加了一个新的 Web 服务器,该 Web 服务器需要 SSL 才能使用不同的 smtp 服务器发送电子邮件。所以我不得不使用 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;,所以除非你明确地将IsBodyHtml属性设置为true,否则正文会被写入TextBody。你能添加使用这个类 cdoMessage 的代码吗?两台机器上也是一样的吗? -
感谢您的回复!我放弃了这个。 IsBodyHtml 在调用 Send 之前设置为 true,两台机器的代码完全相同。一个有效,另一个无效。我有一个疯狂的想法,用 2012 年的那个替换 2008 年服务器中的 dll,看看会发生什么。我会及时通知你。
-
我们可以责怪新的 smtp 服务器吗?它可能会将您的消息转换回纯文本吗?您是否尝试过使用普通客户端通过服务器发送 HTML 电子邮件?
-
在服务器 A 中,使用 System.Net.Mail 时,电子邮件是 HTML 格式,但使用 cdo 时,它们是纯文本格式。
-
为什么不在端口 587 而不是 465 上使用显式 SSL?这由 System.Net.SmtpClient 支持,实际上是标准中实际定义的唯一方法