首页 新闻 会员 周边

求救!smtp发送邮件问题

0
悬赏园豆:100 [待解决问题]

同样的smtp发件程序,在win+.net 3.5下运行,显示身份验证失败;
然而到了linux+mono下运行,竟然成功了。

找来找去觉得有个地方特别奇怪,就是现在要通过验证的这个smtp服务器要求的用户名是"xxx@xxx.xx"这种形式(就是邮箱全称),如果换成其他邮箱服务器,一般情况用户名仅仅是“xxx”这种形式,就是没有“@”,仅仅是英文字符和数字等的时候,在.net和mono下都能成功。

现在就有个很奇妙的问题,有没有大侠能告诉我,.net和mono对于这个smtp发件时的验证信息是如何处理的,尤其是带"@"这种字符的,为什么处理结果会不一样。如果我一定要在.net环境下用"xxx@xxx.xx"这种形式的用户名通过验证,应该怎么做?

我尝试过在.net下将这种用户名转码为UTF8、ASCII、甚至Base64,都不行。求救啊。

p.s:别和我说换个邮箱服务器啊,由于特殊原因,我必须要使用这个邮箱服务器。

zzdjk6的主页 zzdjk6 | 初学一级 | 园豆:100
提问于:2011-09-16 22:29
< >
分享
所有回答(2)
0

这个很简单    !我测试过的代码

/// <summary>
    /// 简单的邮件发送    
    /// </summary>
    /// <param name="fromMail">发送人邮箱</param>
    /// <param name="toMail">收件人邮箱</param>
    /// <param name="subJect">标题</param>
    /// <param name="body">邮件内容</param>
    /// <param name="userName">发件人邮箱名(@之前的名称)</param>
    /// <param name="passWord">发送人邮箱密码</param>
    /// <param name="smtpHost">发送人邮箱的smtp服务器地址(如果发件人邮箱是网易的就是smtp.163.com ,腾讯的是:smtp.qq.com)</param>
    private void SendMail(string fromMail, string toMail, string subJect, string body, string userName,string passWord, string smtpHost)
    {           
        //设置邮件信息 发件人地址、收件人地址、标题、邮件内容                   
        MailMessage mail = new MailMessage(fromMail, toMail, subJect, body);
        mail.ReplyTo = new MailAddress(fromMail);
        //设置邮件主题格式            
        mail.BodyEncoding = System.Text.Encoding.UTF8;   
        //设置邮件主体格式是否为 html 格式            
        mail.IsBodyHtml = true;            
            //邮件优先级别            
        mail.Priority = MailPriority.High;              
        //设置发送邮箱的smtp服务器或安全端口            
        SmtpClient client = new SmtpClient(smtpHost);
        //是否请求一起发送            
        client.UseDefaultCredentials = true;     
        //验证邮件服务器的身份            
        NetworkCredential work = new System.Net.NetworkCredential(userName, passWord);            
        client.Credentials = work;                       
        //设置邮件发送格式            
        client.DeliveryMethod = SmtpDeliveryMethod.Network;            
                          
        //安全连接设置           
        client.EnableSsl = false;
        //一定要为false 或者去掉这句 !不然报服务器不支持安全连接 也就是客户端没有开通SSL加密 所以以后都不要管!                    
        try           
        {               
            client.Send(mail);                
            Response.Write("发送成功");            
        }           
        catch (Exception ex)            
        {                
            Response.Write(ex.Message + "  请联系管理员。");
        }              
    }

添加命名空间 

using System.Net.Mail;//添加邮件提醒 
using System.Net;

 

希望对你有所帮助!

黎明&岁月 | 园豆:159 (初学一级) | 2011-09-17 15:20

首先非常感谢你的回复。你的smtp发件方法跟我写的差不多,应付普通的邮件发送场合(比如126邮箱)都能通过,无论是在linux+mono或和是win+.net下。

但是现在的问题并不是这么简单的(至少对我来说),就我们所见,绝大多数smtp验证信息中,用户名都是英文+数字,不会含有@这种字符。但我现在要处理的问题是,发件验证时,我要填的用户名是"xxx@xxx.xx"这种形式,再具体点,是"xxxx@mail.nankai.edu.cn"这种用户名,和别的不一样,不是@前面那一串,而是必须包含@和它后面那一串。

于是就出现了一个很严肃的问题,同样的.exe文件,我在win+.net情况下,无论如何显示我身份验证失败,然而很奇妙的是,linux+mono情况下却可以认证成功进而把邮件发出去。

我怀疑是.net和mono的运行时对身份验证信息的处理不同(似乎都应该转为base64),但是目前不知道是什么情况。

求大牛给解答……

支持(0) 反对(0) zzdjk6 | 园豆:100 (初学一级) | 2011-09-19 00:35

@zzdjk6:

 我无语!不管要不要@前面都可以发送成功的!你那么纠结干嘛呢?不试试怎么知道不行呢!

支持(0) 反对(0) 黎明&岁月 | 园豆:159 (初学一级) | 2011-09-25 18:54
0

登录用户名,不同的邮件服务商要求不一样的,如:QQ企业邮箱就是需要xxx@domain.com这种格式,而163的邮箱则只需要用户名无需@后缀。

所以你说在mono下成功,在.net下失败,你先确定一下你设置的邮箱信息是不是一样的。

在.net下我用带@格式的用户名发过邮件,是可以成功发送的。mono下没有试过。

I,Robot | 园豆:9783 (大侠五级) | 2011-09-19 03:00

你好~谢谢你的回复~

mono和.net下都是同一个.exe文件,测试用的数据(如服务器名、用户名、密码等)是硬编码到程序里面的,所以设置应该是相同的……

于是我很疑惑……

如您所言,在.net下可以发送成功的话,我突然在想会不会是.net framework 版本的区别。

我所使用的是.net framwork 3.5 sp1,或许.net framework 4.0可以,我回去试试。

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