单从界面只能作出一个很简单的判断,如果你是通过web.config的stmp 来配置发送服务器的话,如果服务端的asp.net 运行环境是medium trust 就会出现发送失败的问题,要将信任级别提升至完全信任才可以避免。
如果以上方法不行,你最好能将代码放上来看看
public void SendEmail() { //string from = "13135692346@163.com"; //发送方邮箱 string from = txtFrom.Text.ToString() + "@163.com"; MailMessage newEmail = new MailMessage(); #region 发送方邮件 newEmail.From = new MailAddress(from, from); #endregion #region 发送对象,可群发 //newEmail.To.Add(new MailAddress("369608497@qq.com")); //接收方邮箱一 //newEmail.To.Add(new MailAddress("13135692346@163.com")); //接收方邮箱二 //newEmail.To.Add(new MailAddress("402852049@qq.com")); //369608497@qq.com;13135692346@163.com;402852049@qq.com string to = txtTo.Text.ToString(); string[]tolist=to.Split(';'); for (int i = 0; i < tolist.Length; i++) { newEmail.To.Add(new MailAddress(tolist[i].ToString())); } #endregion #region Subject newEmail.Subject = txtSub.Text; //标题 #endregion #region Body string strBody = txtContent.Text.ToString(); //html格式,也可以是普通文本格式 newEmail.Body = strBody; //内容 #endregion #region 上传附件 // Attachment MsgAttach = new Attachment(this.FileUpload1.PostedFile.FileName);//可通过一个FileUpload地址获取附件地址 //newEmail.Attachments.Add(MsgAttach); #endregion #region Deployment newEmail.IsBodyHtml = true; //是否支持html newEmail.Priority = MailPriority.High; //优先级 #endregion //发送方服务器信息 SmtpClient smtpClient = new SmtpClient(); smtpClient.UseDefaultCredentials = false; smtpClient.Credentials = new System.Net.NetworkCredential(txtFrom.Text.ToString(), txtPwd.Text.ToString()); smtpClient.Host = "smtp.163.com"; //主机 //smtpClient.Send(newEmail); //同步发送,程序将被阻塞 #region 异步发送, 会进入回调函数SendCompletedCallback,来判断发送是否成功 smtpClient.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);//回调函数 string userState = "测试"; smtpClient.SendAsync(newEmail, userState); #endregion } private void SendCompletedCallback(object sender, System.ComponentModel.AsyncCompletedEventArgs e) { if (e.Cancelled) //邮件发送被取消 { //Console.WriteLine("发送被取消!"); //Lmsg.Text = "发送被取消!"; Response.Write("<script>alert('发送被取消!');</script>"); } if (e.Error != null) //邮件发送失败 { //Console.WriteLine("发送失败!"); //Lmsg.Text = "发送失败!"; Response.Write("<script>alert('发送失败!');</script>"); } else //发送成功 { //Console.WriteLine("发送成功!"); //Lmsg.Text = "发送成功!"; Response.Write("<script>alert('发送成功!');</script>"); } }
我没有用medium trust,那个信任级别也完全不知道是什么东西。代码很简单,贴出来了,望大神赐教。
@旋转乾坤:
1.我曾试过与你类似的情况,我当时的办法是避免使用SendAsync 用 Send 基本是可以通过的,你可以先试试用Send。
2. 如果改用Send仍然是不行的话,你可以在web.config中加入
<system.web> .. <trust level="Full"> .. </system.web>
如果加入trust标记后asp.net 不能运行证明你的 Host 是Medium Trust ,主是代码信任级别,如果是中级那么很多方法是不能被正常调用的,你的发送就有可能是遇到代码权限不足的异常了。
@Ray Liang: 首先感谢你的回答,拜谢!你的2种方法我都试过了。
1、Send同步发送在本地测试也是可以的,但是部署到服务器上就直接soket连接中断,我也不太清楚这是什么原因造成的,难道真的是线程阻塞导致?(顺便说下我的服务器是微软提供的msdn订阅server2012,服务器上是不是还要配置什么相关的?)如下图:
2、加上trust标记后整个站点都不能访问了,小生对服务器代码安全方面知之甚少,还请大神不吝赐教!另外代码权限该如何解决啊~?
@Ray Liang:
@旋转乾坤: 很明显你的网站是被强制中等代码信任级别的,这个与godaddy上一样坑爹。中等代码信任级别中 读取smtp 配置节是会引发安全异常的,正常的话下面那哥们教的在web.config上配smtp同样会出错。你只能hardcode. 而线程阻塞不是魔鬼,只是要将前代码执行完成才进入下一行。socket强制被关闭则说明你的代码是没有问题的,你反而可以去看看SMTP server那一端的设置是否允许你使用远程机器发送邮件这一选项。很多SMTP服务器是对其它服务端的发送调用默认禁止的,不禁止就会容易产生垃圾邮件(被黑成垃圾邮件发送器)。
@Ray Liang: SMTP服务器是对其它服务端的发送调用默认设置在哪里呢,找了好久没找到呀~还望前辈能帮我解决这个问题啊~
@Ray Liang: 还有我拿到了异常信息是这样的。。
@旋转乾坤: 你换一个SMTP服务器或者就在与当前WebServer处于同一域或同一服务器上的SMTP Server发送就可以了,你这个信息就明显我之前所说的对方禁止你通过远程客户端(你的服务端)发送邮件。
@Ray Liang: The server committed a protocol violation The server response was:
这个错误的原因我找到了,是因为如使用smtp.163.com不允许在程序外自己向自己发送邮件,换个不一样的就一切正常,可以给qq、sina、163、hotmail等发送。难道这所谓的协议冲突(protocol violation)就是自己给自己发?不合理啊,你觉得呢?还有啊,你说的对方禁止通过远程客户端(你的服务端)发送邮件,这个可以自己去设置吗?(我没找到,而且我自己测试大部分默认是不禁止的,和你说的有点不一样,能谈谈你的看法吗?)多谢!测试地址:http://markwave.cloudapp.net/mail.aspx
@旋转乾坤: 对于 163邮件服务器而然你的Web服务器就是一个发送邮件的客户端,且你的服务端在DNS上被识别出为外网服务器不属于一个可信任的服务器,这个可信任的授权是由163的邮件服务器软件的管理策略所设定的你并不能修改,你只能用,不管你是发向哪个收件人都是一样的。否则,谁都通这过种方式来发邮件,那么163就可以变成垃圾邮件发送服务器了,这自然是不请允许的。所以我之前叫你换SMTP服务器。一般部署站内邮件服务器都会在与web服务器同一个域内,因为这样SMTP会默认授信于同一IP上的程序,且这样不会被接收方的邮件服务器认为是垃圾邮件,如果发送客户端与发送服务器不在同一IP上就极容易被误认为是垃圾邮件,即使发送成功也只能被退信或进入垃圾箱中。
你是用.net自己的MailMessage发的邮件呢,还是使用了其它如Jmail这种邮件组件呢?
如果是使用了组件,很有可能是服务器上没有装组件导致的。
还有就是你可以在发送邮件的程序这里加一个try catch,然后在catch里写一个日志文件,把错误信息记录下来,这样可以帮助你找到原因。
嗯,这个可以有。
你可以查看你的程序log日志。
没有日志也可以查看系统日志。
没有加程序log日志,系统日志在哪看?如何找到对应的呢?
@旋转乾坤: 一般在 控制面板\所有控制面板项\管理工具\事件查看器\Windows 日志 你查查看,能不能找到一些线索。
你可以在服务器上telnet smtp去看下是否能连接邮件服务器,http://www.cnblogs.com/cocowool/archive/2012/03/14/2395390.html
服务器权限的问题,极有可能是iis帐户没有被赋予这项权限
嗯,权限问题有可能。。可有具体solution?
@旋转乾坤: 查看一下系统日志,看看具体有没有错误提示。实在不行了用windebug调试看下,之前很多人说用这个可以调出很多莫名的错误,但我不太会用。
初步怀疑是smtp配置的问题,看看发送邮件端口有没有被block,其次还有可能是权限问题。
我把防火墙都关了,应该不是端口的问题吧。权限问题倒有可能。。
把SMTP的配置直接写到web.config。不要写代码了
怎样写?
@旋转乾坤:
<system.net> <mailSettings> <smtp deliveryMethod="Network" from="support@ifca.com.cn"> <network host="smtp.163.com" port="25" userName="username" password="password"/> </smtp> </mailSettings> </system.net>
问题解决了吗?我也遇到这问题
你的具体是什么情况?
我也遇到这个问题,邮件发不出去。在本机上是可以的。到了服务器上就不行了。也没报错。就害死发送失败。是不是要在服务器端安装啥子哦?求解!!
把出错信息打出来看看,上面我踩过的坑也可以参考~另外,不同邮件服务器都有相应策略并不断在变的,可以看看这方面的资料。
同样的问题,现在怎么解决一下!
同样的问题, 求姐
线上服务器的25端口开了吗? 如果没有开,你的代码即使一点问题都没有也没法发送出去的。
看看是不是服务器上网络的问题