BugTracker部署好之后,发现增加bug不能mail提醒。于是补上这个功能记录在此,方法是次要的,主要是找到地方。需要3步。吐槽下Asp的代码风格看的真心蛋疼....

一、发送mail(主要是找到位置)

1.在App_Code中加入MailHelper.cs .

  1. using System;
  2. using System.Net.Mail;
  3.  
  4. public class MailHelper
  5. {
  6. /// <summary>
  7. /// 异步发送邮件
  8. /// </summary>
  9. /// <param name="toMails"></param>
  10. /// <param name="subject"></param>
  11. /// <param name="content"></param>
  12. public static void SystemSendMail(string toMails, string subject, string content)
  13. {
  14.  
  15. Action invokeAction = () => WebMailTo(toMails, subject, content);
  16. invokeAction.BeginInvoke(Callback, invokeAction);
  17.  
  18. }
  19.  
  20. private static void Callback(IAsyncResult ar)
  21. {
  22. var action = ar.AsyncState as Action;
  23. if (action != null) action.EndInvoke(ar);
  24. }
  25.  
  26. /// <summary>
  27. /// Webs the mail to.
  28. /// </summary>
  29. /// <param name="toEmails">To emails.</param>
  30. /// <param name="subject">The subject.</param>
  31. /// <param name="emailText">The email text.</param>
  32. /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
  33. public static bool WebMailTo(string toEmails, string subject, string emailText)
  34. {
  35. #region 此处参数使用时根据需要替换成自己的
  36. const string server = "172.17.xxx.95"; //此处代表Mail Server地址
  37. const string formEmail = xxxxx.xxx@xxx.com.cn"; //此处代表系统发邮件的时候的发件人地址
  38. const string formDispayName = "BugTracker"; //系统发件人的显示名称
  39. const string formPassword = "xxxxx"; //此处代表系统发邮件的时候的发件人的密码
  40. const string formDomain = "xxxwj"; //域名
  41. #endregion
  42.  
  43. const string systermtxt = "<br/>该邮件为系统自动发送,请勿回复!详情请点击" + "<a href='http://cnwj6iapc016:84/'>这里~</a>";
  44. var mailMessage = new MailMessage { IsBodyHtml = true };
  45. mailMessage.To.Add(toEmails);
  46. mailMessage.From = new MailAddress(formEmail, formDispayName);
  47. mailMessage.Subject = subject;
  48. mailMessage.Body = emailText + systermtxt;//此处可以传递一个html
  49. mailMessage.Priority = MailPriority.High;
  50. var client = new SmtpClient
  51. {
  52. Host = server,
  53. UseDefaultCredentials = false,
  54. Credentials = new System.Net.NetworkCredential(formEmail, formPassword, formDomain),
  55. DeliveryMethod = SmtpDeliveryMethod.Network,
  56. EnableSsl = false
  57. };
  58. bool isSendOk;
  59. try
  60. {
  61. client.Send(mailMessage);//发送Mail
  62. isSendOk = true;
  63.  
  64. }
  65. catch (Exception)
  66. {
  67.  
  68. isSendOk = false;
  69. }
  70. return isSendOk;
  71. }
  72. }

2.给在App_Code的dbutil.cs加入个功能函数。

  1. public static string GetStringById(int id,StringType stringType)
  2. {
  3. using (SqlConnection conn = get_sqlconnection())
  4. {
  5. var sql = "";
  6. switch (stringType)
  7. {
  8. case StringType.Email:
  9. sql = "select us_email from users where us_id=" + id;
  10. break;
  11. case StringType.ProjectDefaultUserId:
  12. sql = "select pj_default_user from projects where pj_id=" + id;
  13. break;
  14. case StringType.UserName:
  15. sql = "select us_username from users where us_id=" + id;
  16. break;
  17. }
  18. DataSet ds = new DataSet();
  19. SqlDataAdapter da = new SqlDataAdapter(sql, conn);
  20. int c = da.Fill(ds, "table");
  21. DataRow[] dr = ds.Tables[].Select();
  22. conn.Close();
  23. return c != ? dr[][].ToString() : "";
  24. }
  25. }
  26.  
  27. public enum StringType
  28. {
  29. Email,
  30. ProjectDefaultUserId,
  31. UserName
  32. }

3.在App_Code的bug.cs中修改insert_bug 方法。

  1. sql = sql.Replace("$short_desc", short_desc.Replace("'", "''"));
  2. sql = sql.Replace("$tags", tags.Replace("'", "''"));
  3. sql = sql.Replace("$reported_user", Convert.ToString(security.user.usid));
  4. sql = sql.Replace("$project", Convert.ToString(projectid));
  5. sql = sql.Replace("$org", Convert.ToString(orgid));
  6. sql = sql.Replace("$category", Convert.ToString(categoryid));
  7. sql = sql.Replace("$priority", Convert.ToString(priorityid));
  8. sql = sql.Replace("$status", Convert.ToString(statusid));
  9. sql = sql.Replace("$assigned_user", Convert.ToString(assigned_to_userid));
  10. sql = sql.Replace("$udf", Convert.ToString(udfid));
  11. sql = sql.Replace("$pcd1", project_custom_dropdown_value1);
  12. sql = sql.Replace("$pcd2", project_custom_dropdown_value2);
  13. sql = sql.Replace("$pcd3", project_custom_dropdown_value3);
  14.  
  15. // 发送mail 这里才是补充的代码。
  16. var str = string.Format("<div style='padding:20px;border:2px solid green'>{0}维护了与你相关的新的Bug,详细情况请登录Bug管理系统</div>", security.user.username);
  17. var pid = DbUtil.GetStringById(projectid, StringType.ProjectDefaultUserId);
  18. if (pid == "")
  19. {
  20. pid = "";
  21. }
  22. var defaultuserid = Convert.ToInt16(pid);
  23. if (defaultuserid != )
  24. {
  25. MailHelper.SystemSendMail(DbUtil.GetStringById(defaultuserid, StringType.Email), "BugTracker:你有新的bug了", str);
  26. }
  27. if (defaultuserid != assigned_to_userid)
  28. {
  29. MailHelper.SystemSendMail(DbUtil.GetStringById(assigned_to_userid, StringType.Email), "BugTracker:你有新的bug了", str);
  30. }

这样子就ok了。增加不过的时候,会发送给抄送人和工程负责人。

同理,如果要在评论更显得 时候也加入mail通知。评论对应的数据库中的表是bug_posts. 插入的方法在App_Code/bug.cs中的

public static int insert_comment(.....) 方法中。

在return之前加入下面的代码:

  1. sql = sql.Replace("$cc", cc.Replace("'", "''"));
  2. sql = sql.Replace("$internal", btnet.Util.bool_to_string(internal_only));
  3.  
  4. DataRow[] drs = DbUtil.GetBugDataRows(bugid);
  5. if (drs.Count() != )
  6. {
  7. var buguserId = Convert.ToInt16(drs[]["bg_reported_user"]);// 发布bug的人
  8. var bugassigneduserId = Convert.ToInt16(drs[]["bg_assigned_to_user"]);//bug抄送的人
  9. var projectId = Convert.ToInt16(drs[]["bg_project"]);
  10. const string titile = "Bug有新的评论";
  11. var bugdesc = drs[]["bg_short_desc"].ToString();
  12. var content = string.Format("<div style='padding:20px;border:3px solid blueviolet;'>Bug {0}(Id :{1})有新的评论:<br/><p style='color:gray;font-size:small;background: #ffffe0'>{2}</p></div>", bugdesc, bugid, comment_formated.Replace("'", "''"));
  13. if (this_usid != buguserId)//避免是同一人 而重复发送。
  14. {
  15. MailHelper.SystemSendMail(DbUtil.GetStringById(buguserId,StringType.Email),titile,content);
  16. }
  17. if (bugassigneduserId != && this_usid != bugassigneduserId)//避免是同一人 而重复发送。
  18. {
  19. MailHelper.SystemSendMail(DbUtil.GetStringById(bugassigneduserId, StringType.Email), titile, content);
  20. }
  21.  
  22. if (projectId != )
  23. {
  24. var pduid =Convert.ToInt16(DbUtil.GetStringById(projectId, StringType.ProjectDefaultUserId)) ;
  25. if (pduid != && this_usid != pduid && pduid != bugassigneduserId)//避免是同一人 而重复发送。
  26. {
  27. MailHelper.SystemSendMail(DbUtil.GetStringById(pduid, StringType.Email), titile, content);
  28. }
  29. }
  30.  
  31. }

另外需要在dbutil.cs中加入一些方法

  1. public static string GetStringById(int id,StringType stringType)
  2. {
  3. using (SqlConnection conn = get_sqlconnection())
  4. {
  5. var sql = "";
  6. switch (stringType)
  7. {
  8. case StringType.Email:
  9. sql = "select us_email from users where us_id=" + id;
  10. break;
  11. case StringType.ProjectDefaultUserId:
  12. sql = "select pj_default_user from projects where pj_id=" + id;
  13. break;
  14. case StringType.BugUserId:
  15. sql = "select bg_reported_user from bugs where bg_id=" + id;
  16. break;
  17. }
  18. var ds = new DataSet();
  19. var da = new SqlDataAdapter(sql, conn);
  20. var c = da.Fill(ds, "table");
  21. var dr = ds.Tables[].Select();
  22. conn.Close();
  23. return c != ? dr[][].ToString() : "";
  24. }
  25. }
  26.  
  27. public static DataRow[] GetBugDataRows(int bugId)
  28. {
  29. using (SqlConnection conn = get_sqlconnection())
  30. {
  31. var sql = "select * from bugs where bg_id=" + bugId;
  32. var ds = new DataSet();
  33. var da = new SqlDataAdapter(sql, conn);
  34. da.Fill(ds, "table");
  35. var drs=ds.Tables[].Select();
  36. conn.Close();
  37. return drs;
  38. }
  39. }

最后效果:

二、自动登录

自动登录也要改改,每次都要点一次。刚开始以为在login打头的文件中,试了几次登录函数是在default.aspx 页面中。

1、在Page_Load中的 if (username_cookie != null) 中加入最后三句,就是判断下cookie。asp中的控件赋值比较神器.... input元素直接可以点出value。

  1. if (username_cookie != null)
  2. {
  3. // Set the user name from the last logon.
  4. user.Value = username_cookie["name"];
  5. var pcookie = Request.Cookies["pwd"];
  6. if (pcookie != null && pcookie.Value!="")
  7. {
  8. pw.Value = pcookie.Value;
  9. on_logon();
  10. }
  11. }

2、再在下面的on_logon() 中的 if (authenticated) 中加入下面的代码。 初始的时候加上cookie

  1. var httpCookie = Response.Cookies["pwd"];
  2. if (httpCookie == null)
  3. {
  4. var currentCookie = new HttpCookie("pwd") {Value = pw.Value, Expires = DateTime.Now.AddDays()};
  5. Response.Cookies.Add(currentCookie);
  6. }
  7. else
  8. {
  9. httpCookie.Value = pw.Value;
  10. }

3、处理退出,不然的话人家登录了很难切换用户。

用户点击右上角的logoff的时候,其实是先跳转到了logoff.aspx页面。在页面跳转到defau.aspx之前,清空cookie的值。

  1. var httpCookie = Response.Cookies["pwd"];
  2. if (httpCookie != null)
  3. {
  4. httpCookie.Value = null;
  5. }
  6.  
  7. Response.Redirect("default.aspx?msg=logged+off");

感觉下次就会用上。

BugTracker 加入发Mail的功能的更多相关文章

  1. django自带的django.core.mail模块实现发邮件的功能

    django自带了一个模块,可以实现发邮件的功能.如果项目开发遇到需要发邮件进行验证的时候可以用到. 1.先要准备发件人 发邮件需要使用SMTP.SMTP是什么呢? 简单邮件传输协议(Simple M ...

  2. Post方法调用公司发Mail的接口

    调用公司发Mail的接口. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...

  3. MOSS程序中如何发Mail?

    我们使用.NET类库中的API发Mail的时候,我们要配置他的SMTP Server等,但是在Sharepoint里,已经提供了相关的封装的方法: SPUtility.SendEmail(SPWeb, ...

  4. 用JS实现发邮件的功能 完美解决

    怎样用JS实现发邮件的功能? 我想用JS实现把页面文本框中的内容直接通过邮件的方式发送到一个指定的邮箱.fengxq给出的答案是<script language=javascript>if ...

  5. 客户注册功能,发短信功能分离 通过ActiveMQ实现

    客户注册功能,发短信功能分离 通过ActiveMQ 配置链接工厂, 配置session缓存工厂(引入链接工厂) 2.配置模板对象JmsTemplate 引入缓存工厂    指定消息模式(队列,发布和订 ...

  6. 项目一:在线下单(补充) activeMQ使用(重点) 重构客户注册功能,发短信功能分离

    1 课程计划 1.在线下单(补充) 2.activeMQ使用(重点) n 简介和安装 n activeMQ入门案例 n spring整合activeMQ应用 3.重构客户注册功能,发短信功能分离 n  ...

  7. html5开发手机打电话发短信功能

    原文:http://www.open-open.com/code/view/1449843459332 在很多的手机网站上,有打电话和发短信的功能,对于这些功能是如何实现的呢.其实不难,今天我们就用h ...

  8. html5开发手机打电话发短信功能,html5的高级开发,html5开发大全,html手机电话短信功能具体解释

    在非常多的手机站点上,有打电话和发短信的功能,对于这些功能是怎样实现的呢.事实上不难,今天我们就用html5来实现他们. 简单的让你大开眼界.HTML5 非常easy写,但创建网页时,您常常须要反复做 ...

  9. java实现发短信功能---腾讯云短信

    目录 java实现发短信功能 前言 开发环境 腾讯云 ---短信 代码 效果 结束语 java实现发短信功能 前言 如今发短信功能已经成为互联网公司的标配,本篇文章将一步步实现java发送短信 考察了 ...

随机推荐

  1. SBT 构建scala eclipse开发

    scala eclipse sbt 应用程序开发 搭建Eclipse开发Scala应用程序的一般步骤 一.环境准备: 1.Scala : http://www.scala-lang.org/ 2.Sc ...

  2. C++之jsoncpp学习

    最新由于客户端要用到jsoncpp,所以自己也跟着项目的需求学了一下jsoncpp.以前没用过xml,但是感觉接触json后,还蛮好用的. 参考地址 http://jsoncpp.sourceforg ...

  3. 1-9 TCP/IP参考模型

    ISO/OSI参考模型与TCP/IP模型对比 一.网络访问层 功能:包括IP地址与物理硬件地址的映射以及将IP地址封装成帧. 基于不同类型的网络接口,网路访问层定义了和物理介质的连接 网路访问层包含了 ...

  4. 编程范式 epesode7,8 stack存放指针类型and heap,register

    这一节从后往前写. ____stack and heap ___stack由 汇编语言操控管理,数据先入后出. 栈是存放局部变量,函数调用子函数时,该函数在栈中占用的空间会增大,用于存放子函数的局部变 ...

  5. python sort和sorted的区别以及使用方法

    iteralbe指的是能够一次返回它的一个成员的对象.iterable主要包括3类: 第一类是所有的序列类型,比如list(列表).str(字符串).tuple(元组). 第二类是一些非序列类型,比如 ...

  6. 《Linux内核设计与实现》读书笔记 第一章 Linux内核简介

    一.相关历史 1. Unix内核的特点 简洁:仅提供系统调用并有一个非常明确的设计目的 抽象:几乎所有东西都被当做文件 可移植性:使用C语言编写,使得其在各种硬件体系架构面前都具备令人惊异的移植能力 ...

  7. HTML DOM appendChild() 方法

    <!DOCTYPE html> <html> <body> <ul id="myList"> <li>Coffee< ...

  8. nginx反向代理编译异常

    cc1: warnings being treated as errors /root/nginx_tcp_proxy_module/ngx_tcp.c: 在函数‘ngx_tcp_add_addrs’ ...

  9. ajax头像上传

    html代码: <input id="fileinput" type="file" /><br /> <br /> < ...

  10. abap常用函数

    1.读取生产订单状态函数 call function 'STATUS_READ'           exporting             client           = sy-mandt ...