首页 新闻 会员 周边 捐助

aspnet邮件发送(用的是163的smtp)本地测试成功,但是部署到服务器上老是发送失败。求大神~!

0
悬赏园豆:60 [已解决问题] 解决于 2014-07-27 01:33

aspnet邮件发送(用的是163的smtp)本地测试成功,但是部署到服务器上老是发送失败。求解~!如下是本地和服务器部署运行结果图~

旋转乾坤的主页 旋转乾坤 | 初学一级 | 园豆:55
提问于:2014-07-25 15:00
< >
分享
最佳答案
0

单从界面只能作出一个很简单的判断,如果你是通过web.config的stmp 来配置发送服务器的话,如果服务端的asp.net 运行环境是medium trust 就会出现发送失败的问题,要将信任级别提升至完全信任才可以避免。

如果以上方法不行,你最好能将代码放上来看看

收获园豆:50
Ray Liang | 菜鸟二级 |园豆:426 | 2014-07-25 15:22
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,那个信任级别也完全不知道是什么东西。代码很简单,贴出来了,望大神赐教。

旋转乾坤 | 园豆:55 (初学一级) | 2014-07-25 16:35

@旋转乾坤:

1.我曾试过与你类似的情况,我当时的办法是避免使用SendAsync 用 Send 基本是可以通过的,你可以先试试用Send。

2. 如果改用Send仍然是不行的话,你可以在web.config中加入

<system.web>
..
<trust level="Full">
..
</system.web>

如果加入trust标记后asp.net 不能运行证明你的 Host 是Medium Trust ,主是代码信任级别,如果是中级那么很多方法是不能被正常调用的,你的发送就有可能是遇到代码权限不足的异常了。

Ray Liang | 园豆:426 (菜鸟二级) | 2014-07-25 18:39

@Ray Liang: 首先感谢你的回答,拜谢!你的2种方法我都试过了。
1、Send同步发送在本地测试也是可以的,但是部署到服务器上就直接soket连接中断,我也不太清楚这是什么原因造成的,难道真的是线程阻塞导致?(顺便说下我的服务器是微软提供的msdn订阅server2012,服务器上是不是还要配置什么相关的?)如下图:

2、加上trust标记后整个站点都不能访问了,小生对服务器代码安全方面知之甚少,还请大神不吝赐教!另外代码权限该如何解决啊~?

旋转乾坤 | 园豆:55 (初学一级) | 2014-07-26 01:27

@Ray Liang: 

旋转乾坤 | 园豆:55 (初学一级) | 2014-07-26 01:30

@旋转乾坤: 很明显你的网站是被强制中等代码信任级别的,这个与godaddy上一样坑爹。中等代码信任级别中 读取smtp 配置节是会引发安全异常的,正常的话下面那哥们教的在web.config上配smtp同样会出错。你只能hardcode. 而线程阻塞不是魔鬼,只是要将前代码执行完成才进入下一行。socket强制被关闭则说明你的代码是没有问题的,你反而可以去看看SMTP server那一端的设置是否允许你使用远程机器发送邮件这一选项。很多SMTP服务器是对其它服务端的发送调用默认禁止的,不禁止就会容易产生垃圾邮件(被黑成垃圾邮件发送器)。

Ray Liang | 园豆:426 (菜鸟二级) | 2014-07-26 15:50

@Ray Liang: SMTP服务器是对其它服务端的发送调用默认设置在哪里呢,找了好久没找到呀~还望前辈能帮我解决这个问题啊~

旋转乾坤 | 园豆:55 (初学一级) | 2014-07-26 18:49

@Ray Liang: 还有我拿到了异常信息是这样的。。

旋转乾坤 | 园豆:55 (初学一级) | 2014-07-26 18:53

@旋转乾坤: 你换一个SMTP服务器或者就在与当前WebServer处于同一域或同一服务器上的SMTP Server发送就可以了,你这个信息就明显我之前所说的对方禁止你通过远程客户端(你的服务端)发送邮件。

Ray Liang | 园豆:426 (菜鸟二级) | 2014-07-26 19:19

@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

旋转乾坤 | 园豆:55 (初学一级) | 2014-07-26 23:52

@旋转乾坤: 对于 163邮件服务器而然你的Web服务器就是一个发送邮件的客户端,且你的服务端在DNS上被识别出为外网服务器不属于一个可信任的服务器,这个可信任的授权是由163的邮件服务器软件的管理策略所设定的你并不能修改,你只能用,不管你是发向哪个收件人都是一样的。否则,谁都通这过种方式来发邮件,那么163就可以变成垃圾邮件发送服务器了,这自然是不请允许的。所以我之前叫你换SMTP服务器。一般部署站内邮件服务器都会在与web服务器同一个域内,因为这样SMTP会默认授信于同一IP上的程序,且这样不会被接收方的邮件服务器认为是垃圾邮件,如果发送客户端与发送服务器不在同一IP上就极容易被误认为是垃圾邮件,即使发送成功也只能被退信或进入垃圾箱中。

Ray Liang | 园豆:426 (菜鸟二级) | 2014-07-27 00:15
其他回答(12)
0

你是用.net自己的MailMessage发的邮件呢,还是使用了其它如Jmail这种邮件组件呢?

如果是使用了组件,很有可能是服务器上没有装组件导致的。

 

还有就是你可以在发送邮件的程序这里加一个try catch,然后在catch里写一个日志文件,把错误信息记录下来,这样可以帮助你找到原因。

收获园豆:10
Alex_QY1987 | 园豆:1888 (小虾三级) | 2014-07-25 16:10

嗯,这个可以有。

支持(0) 反对(0) 旋转乾坤 | 园豆:55 (初学一级) | 2014-07-25 16:38

 

支持(0) 反对(0) 旋转乾坤 | 园豆:55 (初学一级) | 2014-07-26 18:51
0

你可以查看你的程序log日志。

没有日志也可以查看系统日志。

Albert Fei | 园豆:2102 (老鸟四级) | 2014-07-25 16:23

没有加程序log日志,系统日志在哪看?如何找到对应的呢?

支持(0) 反对(0) 旋转乾坤 | 园豆:55 (初学一级) | 2014-07-25 16:39

@旋转乾坤: 一般在 控制面板\所有控制面板项\管理工具\事件查看器\Windows 日志 你查查看,能不能找到一些线索。

支持(0) 反对(0) Albert Fei | 园豆:2102 (老鸟四级) | 2014-07-25 17:10
0

你可以在服务器上telnet smtp去看下是否能连接邮件服务器,http://www.cnblogs.com/cocowool/archive/2012/03/14/2395390.html 

光明中的黑手 | 园豆:135 (初学一级) | 2014-07-25 16:53
0

服务器权限的问题,极有可能是iis帐户没有被赋予这项权限

空明流光 | 园豆:111 (初学一级) | 2014-07-25 17:17

嗯,权限问题有可能。。可有具体solution?

支持(0) 反对(0) 旋转乾坤 | 园豆:55 (初学一级) | 2014-07-26 01:38

@旋转乾坤: 查看一下系统日志,看看具体有没有错误提示。实在不行了用windebug调试看下,之前很多人说用这个可以调出很多莫名的错误,但我不太会用。

支持(0) 反对(0) 空明流光 | 园豆:111 (初学一级) | 2014-07-28 09:47
0

初步怀疑是smtp配置的问题,看看发送邮件端口有没有被block,其次还有可能是权限问题。

JeffWong | 园豆:2328 (老鸟四级) | 2014-07-25 20:41

我把防火墙都关了,应该不是端口的问题吧。权限问题倒有可能。。

支持(0) 反对(0) 旋转乾坤 | 园豆:55 (初学一级) | 2014-07-26 01:37
0

把SMTP的配置直接写到web.config。不要写代码了

Giant150 | 园豆:1172 (小虾三级) | 2014-07-25 21:48

怎样写?

支持(0) 反对(0) 旋转乾坤 | 园豆:55 (初学一级) | 2014-07-26 01:36

@旋转乾坤: 

    <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>
支持(0) 反对(0) Giant150 | 园豆:1172 (小虾三级) | 2014-07-26 11:40
0

问题解决了吗?我也遇到这问题

杀马特、阿希 | 园豆:204 (菜鸟二级) | 2015-01-06 14:37

你的具体是什么情况?

支持(0) 反对(0) 旋转乾坤 | 园豆:55 (初学一级) | 2015-01-07 22:37
0

我也遇到这个问题,邮件发不出去。在本机上是可以的。到了服务器上就不行了。也没报错。就害死发送失败。是不是要在服务器端安装啥子哦?求解!!

温柔的意外 | 园豆:18 (初学一级) | 2015-10-09 14:16

把出错信息打出来看看,上面我踩过的坑也可以参考~另外,不同邮件服务器都有相应策略并不断在变的,可以看看这方面的资料。

支持(0) 反对(0) 旋转乾坤 | 园豆:55 (初学一级) | 2015-10-09 15:36
0

同样的问题,现在怎么解决一下!

NavyHaijun | 园豆:200 (初学一级) | 2017-09-17 12:32
0

同样的问题, 求姐

LarryWei | 园豆:202 (菜鸟二级) | 2017-12-30 15:46
0

线上服务器的25端口开了吗? 如果没有开,你的代码即使一点问题都没有也没法发送出去的。

Naylor | 园豆:137 (初学一级) | 2018-04-09 12:09
0

看看是不是服务器上网络的问题

步步为莹 | 园豆:209 (菜鸟二级) | 2018-06-04 17:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册