首页 新闻 会员 周边

smtp邮件问题

0
悬赏园豆:50 [已解决问题] 解决于 2011-11-11 16:14

 smtpClient.Send(mailMessage);同步发送时,如果发送方地址不正确,会抛出异常,而当我采用异步的方法发送时,没有异常发生可以理解,但是在回调函数里面SendCompletedCallback(object sender, AsyncCompletedEventArgs e)

e.Error既然是空的,也就是能正常发送,请问各位有遇到过吗?怎么解决。

问题补充:

我这里强调的是发送方地址不正确,也就是strFrom。

dahaiwuliang的主页 dahaiwuliang | 初学一级 | 园豆:175
提问于:2011-11-08 09:23
< >
分享
最佳答案
0

你应该没有真正理解,采用SMTP发送邮件的过程,一般来说,邮件不是即时发送的,我们的发送过程,实际上只是,发送方SMTP服务器的接收,真正发送,取决于具体的发送方SMTP服务器。上面的SendCompletedCallback(object sender, AsyncCompletedEventArgs e)中如果没有发生错误,只是保证发送方SMTP服务器收到了我们让他发送的邮件。一般来说,发送方SMTP服务器不会保证邮件真正发送到接收方的SMTP服务器,如果发送到接收方SMTP服务器失败,有些可能会尝试给发送地址,发回一个邮件, 但有些就直接Drop掉了,现在大多SMTP服务器只允许特定的与(自己的Pop3对应的)发送地址,(多年以前的很多SMTP服务器是允许任何人使用的,那时候也没有SMTP验证这一说)。总之,根本不能根据上面的e.Error判断发送有没有真正成功。如果不是特定的服务器也是根本无从判断。

可以看一下维基百科

http://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol#Mail_processing_model

收获园豆:40
ChatinCode | 老鸟四级 |园豆:2272 | 2011-11-09 14:40

恩,同步发送的时候它能验证,并能获取异常,那这个验证是怎么来的,他跟异步发送有什么区别。

dahaiwuliang | 园豆:175 (初学一级) | 2011-11-10 09:22
其他回答(2)
0

建议将代码贴出来。

dudu | 园豆:30994 (高人七级) | 2011-11-08 10:18

public bool Sendmail(string title, string content)
        {
            if ("" == title.Trim())
            {
                throw new Exception("请填写主题");
            }
            if ("" == content.Trim())
            {
                throw new Exception("请填写邮件内容");
            }
            SmtpClient smtpClient = new SmtpClient();
            smtpClient.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
            smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;//指定电子邮件发送方式
            smtpClient.Host = _strHost; //指定SMTP服务器
            smtpClient.Credentials = new System.Net.NetworkCredential(_strAccount, _strPwd);//用户名和密码
            
            MailMessage mailMessage = new MailMessage(_strFrom, _strTo);
            mailMessage.Subject = title;//主题
            mailMessage.Body = content;//内容
            mailMessage.BodyEncoding = System.Text.Encoding.UTF8;//正文编码
            mailMessage.IsBodyHtml = true;//设置为HTML格式
            mailMessage.Priority = MailPriority.High;//优先级
            try
            {
                smtpClient.SendAsync(mailMessage, null);
                return true;
            }
            catch
            {
                return false;
            }
        }
        #endregion

        #region 发送返回
        public static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
        {

            if (e.Error != null)
            {
                GetResultdel(e.Error.Message);
            }
            else
            {
                GetResultdel("发送成功");
            }
        }

支持(0) 反对(0) dahaiwuliang | 园豆:175 (初学一级) | 2011-11-08 10:22
-1

这段代码经测试没问题。问题出在其它地方。我测试同步和异步发送信息,_strFrom和_strTo为非邮箱格式时,MailMessage mailMessage = new MailMessage(_strFrom, _strTo);这句时就会出错,这和同步异步没关系。当_strTo为不存在的地址时,这也和同步异步没关系,对于SmtpClient 来说它已经是发送到邮件服务器上去了,所以结果是"发送成功"。

收获园豆:10
LCM | 园豆:6876 (大侠五级) | 2011-11-08 11:32

strFrom是错误的呢?

支持(0) 反对(0) dahaiwuliang | 园豆:175 (初学一级) | 2011-11-08 11:44

我上面说到的,_strFrom错误也是一样的,MailMessage mailMessage = new MailMessage的地方就会报错的。

支持(0) 反对(0) LCM | 园豆:6876 (大侠五级) | 2011-11-08 13:08

@LCM: 这个不对吧,这只是创建一个邮件类,都没发送到服务器,还没检测怎么就报错了呢?

支持(0) 反对(0) dahaiwuliang | 园豆:175 (初学一级) | 2011-11-08 13:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册