同样的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:别和我说换个邮箱服务器啊,由于特殊原因,我必须要使用这个邮箱服务器。
这个很简单 !我测试过的代码
/// <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;
希望对你有所帮助!
首先非常感谢你的回复。你的smtp发件方法跟我写的差不多,应付普通的邮件发送场合(比如126邮箱)都能通过,无论是在linux+mono或和是win+.net下。
但是现在的问题并不是这么简单的(至少对我来说),就我们所见,绝大多数smtp验证信息中,用户名都是英文+数字,不会含有@这种字符。但我现在要处理的问题是,发件验证时,我要填的用户名是"xxx@xxx.xx"这种形式,再具体点,是"xxxx@mail.nankai.edu.cn"这种用户名,和别的不一样,不是@前面那一串,而是必须包含@和它后面那一串。
于是就出现了一个很严肃的问题,同样的.exe文件,我在win+.net情况下,无论如何显示我身份验证失败,然而很奇妙的是,linux+mono情况下却可以认证成功进而把邮件发出去。
我怀疑是.net和mono的运行时对身份验证信息的处理不同(似乎都应该转为base64),但是目前不知道是什么情况。
求大牛给解答……
@zzdjk6:
我无语!不管要不要@前面都可以发送成功的!你那么纠结干嘛呢?不试试怎么知道不行呢!
登录用户名,不同的邮件服务商要求不一样的,如:QQ企业邮箱就是需要xxx@domain.com这种格式,而163的邮箱则只需要用户名无需@后缀。
所以你说在mono下成功,在.net下失败,你先确定一下你设置的邮箱信息是不是一样的。
在.net下我用带@格式的用户名发过邮件,是可以成功发送的。mono下没有试过。
你好~谢谢你的回复~
mono和.net下都是同一个.exe文件,测试用的数据(如服务器名、用户名、密码等)是硬编码到程序里面的,所以设置应该是相同的……
于是我很疑惑……
如您所言,在.net下可以发送成功的话,我突然在想会不会是.net framework 版本的区别。
我所使用的是.net framwork 3.5 sp1,或许.net framework 4.0可以,我回去试试。