我有一个需要发送电子邮件的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);
}
}
}
}
答案 0 :(得分:1)
这是一个免费的库,在显式和隐式模式下支持POP3,SMTP,IMAP的SSL \ TLS。显然我没有使用它,但它看起来相当复杂。它绝对值得尝试一下价格。
http://visualstudiogallery.msdn.microsoft.com/28b96cd4-b755-48a0-b686-9abb7d5607a8
答案 1 :(得分:0)
尝试将.HTMLBody
和.TextBody
都设置为您想要的值。理想的纯文本和HTML版本不同。通常,如果没有,那就是html。 Html被认为是大多数读者的“替代”显示文本,至少它是在当天。也许不同的SMTP服务器以不同方式处理丢失的电子邮件字段。
如果这不能解决问题,请在两个字段中发送纯文本,看看两个服务器是否一样对待它。
如果这不起作用,请将服务器B中的电子邮件转发给服务器A,反之亦然,看看会发生什么。即使您只是从电子邮件阅读器手动执行此操作。它可能是默认情况下以纯文本形式发送的第二台SMTP服务器上的设置。
查看从两台服务器收到的邮件中的MIME标头。寻找差异,以便了解实际上的差异。
你最终应该能够确定正在发生的事情和地点。
<强>更新强>
输入您的凭据并尝试一下。它通过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;
}
答案 2 :(得分:0)
我记得这件事发生了奇怪的原因:
如果正文中的行太长,SMTP服务会将邮件作为纯文本发送,即使我们将其作为HTML发送。尝试插入\ n换行符,将邮件正文分解为较短的行。虽然我不能说线条可能有多长。