.NET发邮件错误之"Could not access 'CDO.Message' object."
今天,一个.NET的项目中涉及到发送邮件,其实.NET中发邮件是一件很简单的事,如果想发送一个simple的文本邮件只要几行代码就可以搞定。如:
{
MailMessage Message = new MailMessage();
Message.To = toAddr;
Message.From = fromAddr;
Message.Cc = ccAddr;
Message.Bcc = bccAddr;
Message.Subject = subject;
Message.Body = message;
try
{
SmtpMail.SmtpServer = smtpServer;
SmtpMail.Send(Message);
errNum = 0;
errText = "";
}
catch(HttpException ex)
{
errNum = ex.ErrorCode;
errText = ex.Message;
}
}
但就这么一段简单的代码,折腾了我一个上午,原因是总是提示"Could not access 'CDO.Message' object."的错误信息。由于是一个比较大的项目,测试起来比较麻烦,加之用的是公司的smtp server,所以就又写了一个单独的程序测试,结果一切正常。奇怪了,见鬼了?
仔细对比代码,无任何不同之处,只有比较输入了,结果发现输入确实不同。在项目中,Message.Cc和Message.Bcc分别赋值为cc.address@xxx.com和bcc.address@xxx.com,而测试程序中这两项没有赋任何值。也许这就是原因所在,经过再次测试,果然如此。原来当我们把这两项赋值以后,公司的邮件程序会去验证它们的有效性,但如果不赋值,就不会去验证。之所以忽略了这一点,就是因为这两项是optional的,就想当然的随便填了一个值,结果就陷进去了。
由此产生了对Message.From的测试,不过对于这个必填项它倒不去验证了。唉,都是公司的这个邮件服务器惹的祸。当我用localhost发邮件时,它才不管你三七二十一,只管发,什么地址也不验证。
所以大家如果在公司写邮件程序并且打算用公司的smtp server的话,出现这个错误不要奇怪,只要把你的inputs好好理一下就没问题了。
另外就这个错误在网上查了一下,其实有很多原因都可以引发这个错误,比如:
1、smtp server没有设置正确,或它不可用
2、用localhost或"127.0.0.1"作为smtp server,但却没有权限通过IIS SMTP Service来中转。要加入这个权限,打开IIS管理,右键单击SMTP Virtual Server,选择Properties->Access tab->Relay,在Relay Restrictions对话框中,加入127.0.0.1,然后重启IIS即可。
3、最好邮件地址都用有效的,不要用些asdf@asdf.com什么的。