现在的位置: 首页 > 综合 > 正文

.NET发邮件错误之”Could not access ‘CDO.Message’ object.”

2013年04月21日 ⁄ 综合 ⁄ 共 1512字 ⁄ 字号 评论关闭

  今天,一个.NET的项目中涉及到发送邮件,其实.NET中发邮件是一件很简单的事,如果想发送一个simple的文本邮件只要几行代码就可以搞定。如:

public void SendEmail(string smtpServer, string fromAddr, string toAddr, string ccAddr, string bccAddr, string subject, string message, out int errNum, out string errText )
{
    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.combcc.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什么的。

抱歉!评论已关闭.