1. namespace 99999
  2. {
  3. /// <summary>
  4. /// Common interfaces to connect mail server to process e-mail.
  5. /// </summary>
  6. public static class MailClient
  7. {
  8. /// <summary>
  9. /// Process mail queue in database. Call by web service just for schedule process.
  10. /// </summary>
  11. /// <param name="processId"></param>
  12. public static void ProcessQueue( string processId )
  13. {
  14. try
  15. {
  16. //Lock and fetch all mail items in queue.
  17. StringBuilder sqlText = new StringBuilder()
  18. .AppendFormat("UPDATE dbmail_send_task SET MailFrom = '{0}' WHERE Status=0 AND MailFrom IS NULL ", processId)
  19. .AppendFormat("SELECT * FROM dbmail_send_task WHERE Status=0 AND MailFrom ='{0}'", processId);
  20.  
  21. System.Diagnostics.Debug.WriteLine(sqlText.ToString());
  22.  
  23. DataTable dt = Database.SqlHelper.RunQuery(sqlText.ToString());
  24.  
  25. string mailServer = AppSettings.MailServer;
  26. if (string.IsNullOrEmpty(mailServer))
  27. {
  28. return;
  29. }
  30.  
  31. foreach (DataRow dr in dt.Rows)
  32. {
  33. int taskId = Convert.ToInt32(dr["TaskID"]);
  34.  
  35. System.Diagnostics.Debug.WriteLine(string.Format("Send item:{0}", taskId));
  36.  
  37. try
  38. {
  39. //Send mail item using smtp.
  40. System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();
  41. mail.Subject = Convert.ToString(dr["Title"]);
  42. mail.Body = Convert.ToString(dr["Body"]);
  43.  
  44. //using reply to instead of mail from because of no mail from fields on UI.
  45. string replyTo = Convert.ToString(dr["ReplyTo"]);
  46. if (!string.IsNullOrEmpty(replyTo))
  47. {
  48. mail.Sender = new System.Net.Mail.MailAddress(replyTo);
  49. mail.From = new System.Net.Mail.MailAddress(replyTo);
  50. }
  51. else
  52. {
  53. mail.Sender = new System.Net.Mail.MailAddress(AppSettings.MailDefaultSender);
  54. mail.From = new System.Net.Mail.MailAddress(AppSettings.MailDefaultSender);
  55. }
  56.  
  57. string mailTo = Convert.ToString(dr["MailTo"]);
  58. foreach(string sTemp in mailTo.Split(';'))
  59. {
  60. if (!string.IsNullOrEmpty(sTemp))
  61. {
  62. mail.To.Add(sTemp);
  63. }
  64. }
  65.  
  66. string mailCc = Convert.ToString(dr["MailCc"]);
  67. foreach (string sTemp in mailCc.Split(';'))
  68. {
  69. if (!string.IsNullOrEmpty(sTemp))
  70. {
  71. mail.CC.Add(sTemp);
  72. }
  73. }
  74.  
  75. string mailBcc = Convert.ToString(dr["MailBcc"]);
  76. foreach (string sTemp in mailBcc.Split(';'))
  77. {
  78. if (!string.IsNullOrEmpty(sTemp))
  79. {
  80. mail.Bcc.Add(sTemp);
  81. }
  82. }
  83.  
  84. string attachment = Convert.ToString(dr["Attachments"]);
  85. foreach (string sTemp in attachment.Split(';'))
  86. {
  87. if (!string.IsNullOrEmpty(sTemp))
  88. {
  89. mail.Attachments.Add(new System.Net.Mail.Attachment(sTemp));
  90. }
  91. }
  92.  
  93. mail.IsBodyHtml = true;
  94. mail.DeliveryNotificationOptions = System.Net.Mail.DeliveryNotificationOptions.OnFailure;
  95.  
  96. System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient(mailServer);
  97. smtp.SendCompleted += new System.Net.Mail.SendCompletedEventHandler(smtp_SendCompleted);
  98. smtp.SendAsync(mail, taskId);
  99. }
  100. catch (Exception ex)
  101. {
  102. Logging.LogWriter.Write(ex);
  103.  
  104. string sqlText1 = string.Format("UPDATE dbmail_send_task SET [Status]=-1, Remark=N'{0}', SendTime=GETDATE(), MailFrom='ERROR' WHERE TaskID={1} ",ex.Message,taskId);
  105. System.Diagnostics.Debug.WriteLine(sqlText1.ToString());
  106. Database.SqlHelper.RunCommand(sqlText1);
  107. }
  108. }
  109. }
  110. catch (Exception ex)
  111. {
  112. Logging.LogWriter.Write(ex);
  113. }
  114. }
  115.  
  116. /// <summary>
  117. /// Process failed mail queue in database. Call by web service just for schedule process.
  118. /// </summary>
  119. /// <param name="processId"></param>
  120. public static void ResendFailedMails(string processId)
  121. {
  122. try
  123. {
  124. //Lock and fetch all mail items in queue.
  125. StringBuilder sqlText = new StringBuilder()
  126. .AppendFormat("UPDATE dbmail_send_task SET MailFrom = '{0}' WHERE Status=-1 AND MailFrom<>'{0}' AND MailFrom<>'ERROR' ", processId)
  127. .AppendFormat("SELECT * FROM dbmail_send_task WHERE Status=-1 AND MailFrom='{0}' AND MailFrom<>'ERROR' ", processId);
  128.  
  129. System.Diagnostics.Debug.WriteLine(sqlText.ToString());
  130.  
  131. DataTable dt = Database.SqlHelper.RunQuery(sqlText.ToString());
  132.  
  133. string mailServer = AppSettings.MailServer;
  134. if (string.IsNullOrEmpty(mailServer))
  135. {
  136. return;
  137. }
  138.  
  139. foreach (DataRow dr in dt.Rows)
  140. {
  141. int taskId = Convert.ToInt32(dr["TaskID"]);
  142.  
  143. System.Diagnostics.Debug.WriteLine(string.Format("Resend item:{0}",taskId));
  144.  
  145. try
  146. {
  147. //Send mail item using smtp.
  148. System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();
  149. mail.Subject = Convert.ToString(dr["Title"]);
  150. mail.Body = Convert.ToString(dr["Body"]);
  151.  
  152. //using reply to instead of mail from because of no mail from fields on UI.
  153. string replyTo = Convert.ToString(dr["ReplyTo"]);
  154. if (!string.IsNullOrEmpty(replyTo))
  155. {
  156. mail.Sender = new System.Net.Mail.MailAddress(replyTo);
  157. mail.From = new System.Net.Mail.MailAddress(replyTo);
  158. }
  159. else
  160. {
  161. mail.Sender = new System.Net.Mail.MailAddress(AppSettings.MailDefaultSender);
  162. mail.From = new System.Net.Mail.MailAddress(AppSettings.MailDefaultSender);
  163. }
  164.  
  165. string mailTo = Convert.ToString(dr["MailTo"]);
  166. foreach (string sTemp in mailTo.Split(';'))
  167. {
  168. if (!string.IsNullOrEmpty(sTemp))
  169. {
  170. mail.To.Add(sTemp);
  171. }
  172. }
  173.  
  174. string mailCc = Convert.ToString(dr["MailCc"]);
  175. foreach (string sTemp in mailCc.Split(';'))
  176. {
  177. if (!string.IsNullOrEmpty(sTemp))
  178. {
  179. mail.CC.Add(sTemp);
  180. }
  181. }
  182.  
  183. string mailBcc = Convert.ToString(dr["MailBcc"]);
  184. foreach (string sTemp in mailBcc.Split(';'))
  185. {
  186. if (!string.IsNullOrEmpty(sTemp))
  187. {
  188. mail.Bcc.Add(sTemp);
  189. }
  190. }
  191.  
  192. string attachment = Convert.ToString(dr["Attachments"]);
  193. foreach (string sTemp in attachment.Split(';'))
  194. {
  195. if (!string.IsNullOrEmpty(sTemp))
  196. {
  197. mail.Attachments.Add(new System.Net.Mail.Attachment(sTemp));
  198. }
  199. }
  200.  
  201. mail.IsBodyHtml = true;
  202. mail.DeliveryNotificationOptions = System.Net.Mail.DeliveryNotificationOptions.OnFailure;
  203.  
  204. System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient(mailServer);
  205. smtp.SendCompleted += new System.Net.Mail.SendCompletedEventHandler(smtp_SendCompleted);
  206. smtp.SendAsync(mail, taskId);
  207. }
  208. catch (Exception ex)
  209. {
  210. Logging.LogWriter.Write(ex);
  211.  
  212. string sqlText1 = string.Format("UPDATE dbmail_send_task SET [Status]=-1, Remark=N'{0}', MailFrom='ERROR', SendTime=GETDATE(), MailFrom='ERROR' WHERE TaskID={1} ", ex.Message, taskId);
  213. System.Diagnostics.Debug.WriteLine(sqlText1.ToString());
  214. Database.SqlHelper.RunCommand(sqlText1);
  215. }
  216. }
  217. }
  218. catch (Exception ex)
  219. {
  220. Logging.LogWriter.Write(ex);
  221. }
  222. }
  223.  
  224. static void smtp_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
  225. {
  226. try
  227. {
  228. int taskId = Convert.ToInt32(e.UserState);
  229. if (e.Error != null)
  230. {
  231. string sqlText = string.Format("UPDATE dbmail_send_task SET [Status]=-1, Remark=N'{0}',SendTime=GETDATE(), MailFrom='ERROR' WHERE TaskID={1} ", e.Error.Message, taskId);
  232. System.Diagnostics.Debug.WriteLine(sqlText.ToString());
  233. Database.SqlHelper.RunCommand(sqlText);
  234. }
  235. else
  236. {
  237. string sqlText = string.Format("UPDATE dbmail_send_task SET [Status]=1, SendTime=GETDATE(), Remark=NULL WHERE TaskID={0} ", taskId);
  238. System.Diagnostics.Debug.WriteLine(sqlText.ToString());
  239. Database.SqlHelper.RunCommand(sqlText);
  240. }
  241. }
  242. catch (Exception ex)
  243. {
  244. Logging.LogWriter.Write(ex);
  245. }
  246. }
  247.  
  248. /// <summary>
  249. /// Send out a mail, write log file but no warning returned if any exception
  250. /// </summary>
  251. /// <param name="mailAddress">Include To, CC, BCC mail address</param>
  252. /// <param name="mailContent"></param>
  253. /// <returns></returns>
  254. public static bool SendMessage(MailAddress mailAddress, MailEntity mailContent)
  255. {
  256. string profile = Configuration.AppSettings.MailUserDeliveryProfile;
  257. if (string.IsNullOrEmpty(profile))
  258. {
  259. throw new ArgumentNullException("MailUserDeliveryProfile", "Value of configuration item is required.");
  260. }
  261.  
  262. if (string.IsNullOrEmpty(mailAddress.To))
  263. {
  264. throw new ArgumentNullException("MailAddress.To", "Value of MailTo is required.");
  265. }
  266.  
  267. string sqlText = "sp_HtmlMail_Send @profile=@P0,@mailto=@P1,@mailcc=@P2,@mailbcc=@P3,@replyto=@P4,@title=@P5,@body=@P6,@attachments=@P7,@UserAccountID=@P8,@Remark=@P9";
  268.  
  269. IDataParameter P0 = new SqlParameter("@P0", SqlDbType.VarChar);
  270. P0.Value = profile;
  271. IDataParameter P1 = new SqlParameter("@P1", SqlDbType.VarChar);
  272. P1.Value = mailAddress.To;
  273. IDataParameter P2 = new SqlParameter("@P2", SqlDbType.VarChar);
  274. P2.Value = mailAddress.Cc;
  275. IDataParameter P3 = new SqlParameter("@P3", SqlDbType.VarChar);
  276. P3.Value = mailAddress.Bcc;
  277. IDataParameter P4 = new SqlParameter("@P4", SqlDbType.VarChar);
  278. P4.Value = mailAddress.ReplyTo;
  279. IDataParameter P5 = new SqlParameter("@P5", SqlDbType.NVarChar);
  280. P5.Value = mailContent.Subject;
  281. IDataParameter P6 = new SqlParameter("@P6", SqlDbType.NVarChar);
  282. P6.Value = CleanHtml(mailContent.Body);
  283. IDataParameter P7 = new SqlParameter("@P7", SqlDbType.NVarChar);
  284. P7.Value = mailContent.Attachments;
  285. IDataParameter P8 = new SqlParameter("@P8", SqlDbType.Int);
  286. if (mailAddress.SendBy > )
  287. {
  288. P8.Value = mailAddress.SendBy;
  289. }
  290. else
  291. {
  292. P8.Value = Security.UserAuthentication.GetCurrentOperator();
  293. }
  294. IDataParameter P9 = new SqlParameter("@P9", SqlDbType.NVarChar);
  295. P9.Value = mailContent.Remark;
  296.  
  297. int result = Database.SqlHelper.RunCommand(sqlText, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9);
  298. if (result > )
  299. {
  300. return true;
  301. }
  302. else
  303. {
  304. return false;
  305. }
  306.  
  307. }
  308.  
  309. /// <summary>
  310. /// Clean up html text
  311. /// </summary>
  312. /// <param name="input"></param>
  313. /// <returns></returns>
  314. private static string CleanHtml(string input)
  315. {
  316. string output = string.Empty;
  317. output = input.Replace(@"\r\n", "<br>");
  318. return output;
  319. }
  320.  
  321. ///// <summary>
  322. ///// Encode input string to Unicode
  323. ///// </summary>
  324. ///// <param name="input"></param>
  325. ///// <returns></returns>
  326. //private static string UTF8Str(string input)
  327. //{
  328. // byte[] bs = System.Text.Encoding.Default.GetBytes(input);
  329. // string output = System.Text.Encoding.GetEncoding("UTF-8").GetString(bs);
  330. // return output;
  331. //}
  332.  
  333. //private static string ANSIStr(string input)
  334. //{
  335. // byte[] bs = System.Text.Encoding.Default.GetBytes(input);
  336. // string output = System.Text.Encoding.ASCII.GetString(bs);
  337. // return output;
  338. //}
  339.  
  340. ///// <summary>
  341. ///// Convert ununicode string to unicode string.
  342. ///// </summary>
  343. ///// <param name="str"></param>
  344. ///// <returns></returns>
  345. //private static string ConvertToUnicodeString(string str)
  346. //{
  347. // StringBuilder outStr = new StringBuilder();
  348. // if (!string.IsNullOrEmpty(str))
  349. // {
  350.  
  351. // for (int i = 0; i < str.Length; i++)
  352. // {
  353. // if (str[i] > 0xff)
  354. // {
  355. // outStr.AppendFormat("&#{0}", ((int)str[i]).ToString());
  356. // }
  357. // else
  358. // {
  359. // outStr.Append(str[i]);
  360. // }
  361. // }
  362. // }
  363. // return outStr.ToString();
  364. //}
  365.  
  366. }
  367.  
  368. #region Mail Entity
  369.  
  370. /// <summary>
  371. /// Build mail entity, include subject,body, attachments and options.
  372. /// </summary>
  373. public class MailEntity
  374. {
  375. /// <summary>
  376. /// Build a mail entity with template id, you may use -1 if no template id.
  377. /// </summary>
  378. /// <param name="templateId">template id, you may use -1 if no template id.</param>
  379. public MailEntity(int templateId)
  380. {
  381. if (templateId == -)
  382. {
  383. return;
  384. }
  385. else
  386. {
  387. //Load mail template from database according to special template id
  388. string sqlText = string.Format("select * from tb_MailTemplate where ID={0}", templateId);
  389. DataTable dt = Database.SqlHelper.RunQuery(sqlText);
  390. if (dt != null && dt.Rows.Count > )
  391. {
  392. object o = dt.Rows[]["Content"];
  393. if (o != null)
  394. {
  395. _body = o.ToString();
  396. }
  397.  
  398. object title = dt.Rows[]["Title"];
  399.  
  400. if (title != null)
  401. {
  402. _subject = title.ToString();
  403. }
  404. }
  405. }
  406. }
  407.  
  408. private string _subject = "";
  409.  
  410. /// <summary>
  411. /// Mail title
  412. /// </summary>
  413. public string Subject
  414. {
  415. get { return _subject; }
  416. set { _subject = value; }
  417. }
  418.  
  419. private string _body = "";
  420.  
  421. /// <summary>
  422. /// Mail body, html string
  423. /// </summary>
  424. public string Body
  425. {
  426. get { return _body; }
  427. set { _body = value; }
  428. }
  429.  
  430. private string _attachments = "";
  431.  
  432. /// <summary>
  433. /// Mail attachments, split by "|" if multiple files
  434. /// </summary>
  435. public string Attachments
  436. {
  437. get { return _attachments; }
  438. }
  439.  
  440. private string _attachmentFilePath = "";
  441.  
  442. public string AttachmentFilePath
  443. {
  444. get { return _attachmentFilePath; }
  445. }
  446.  
  447. private string _remark = "";
  448.  
  449. /// <summary>
  450. /// Remark
  451. /// </summary>
  452. public string Remark
  453. {
  454. get { return _remark; }
  455. set { _remark = value; }
  456. }
  457.  
  458. /// <summary>
  459. /// Merge field into template
  460. /// </summary>
  461. /// <param name="fieldName"></param>
  462. /// <param name="fieldValue"></param>
  463. public void MergeField(string fieldName, string fieldValue)
  464. {
  465. if (!string.IsNullOrEmpty(_body))
  466. {
  467. _body = _body.Replace(fieldName, fieldValue);
  468. _subject = _subject.Replace(fieldName, fieldValue);
  469. }
  470.  
  471. }
  472.  
  473. /// <summary>
  474. /// Add file as attachment
  475. /// </summary>
  476. /// <param name="fileName"></param>
  477. public void AttachFile(string fileName)
  478. {
  479. if (string.IsNullOrEmpty(_attachments))
  480. {
  481. _attachments = fileName;
  482. }
  483. else
  484. {
  485. _attachments += "|" + fileName;
  486. }
  487. }
  488.  
  489. }
  490.  
  491. #endregion
  492.  
  493. #region Mail Address
  494.  
  495. /// <summary>
  496. /// Build mail address entity, include To, Cc, Bcc
  497. /// </summary>
  498. [Serializable]
  499. public class MailAddress
  500. {
  501. private string _to = "";
  502.  
  503. /// <summary>
  504. /// Address of mail to
  505. /// </summary>
  506. public string To
  507. {
  508. get { return _to.TrimStart(';'); }
  509. }
  510.  
  511. private string _cc = "";
  512.  
  513. /// <summary>
  514. /// Address of mail cc
  515. /// </summary>
  516. public string Cc
  517. {
  518. get { return _cc.TrimStart(';'); }
  519. set { _cc = value; }
  520. }
  521.  
  522. private string _bcc = "";
  523.  
  524. /// <summary>
  525. /// Address of mail bcc
  526. /// </summary>
  527. public string Bcc
  528. {
  529. get { return _bcc.TrimStart(';'); }
  530. }
  531.  
  532. private string _replyTo = "";
  533.  
  534. /// <summary>
  535. /// Address of mail receiver reply to
  536. /// </summary>
  537. public string ReplyTo
  538. {
  539. get { return _replyTo; }
  540. set { _replyTo = value; }
  541. }
  542.  
  543. private int _sendBy = ;
  544.  
  545. /// <summary>
  546. /// Address of mail send by
  547. /// </summary>
  548. public int SendBy
  549. {
  550. get { return _sendBy; }
  551. set { _sendBy = value; }
  552. }
  553.  
  554. /// <summary>
  555. /// Address of mail sender
  556. /// </summary>
  557. public string From
  558. {
  559. get { return Configuration.AppSettings.MailDeliveryFrom; }
  560. }
  561.  
  562. /// <summary>
  563. /// Add new address to recipients, copy recipients or blind recipients
  564. /// </summary>
  565. /// <param name="address"></param>
  566. /// <param name="addressType"></param>
  567. public void Add(string address, MailAddressType addressType)
  568. {
  569. switch (addressType)
  570. {
  571. case MailAddressType.To:
  572. {
  573. _to = _to + ";" + address;
  574. break;
  575. }
  576. case MailAddressType.Cc:
  577. {
  578. _cc = _cc + ";" + address;
  579. break;
  580. }
  581. case MailAddressType.Bcc:
  582. {
  583. _bcc = _bcc + ";" + address;
  584. break;
  585. }
  586. default: break;
  587. }
  588. }
  589.  
  590. /// <summary>
  591. /// Add new address to recipients, copy recipients or blind recipients
  592. /// </summary>
  593. /// <param name="address"></param>
  594. /// <param name="addressType"></param>
  595. public void Add(string toAddress, string ccAddress, string bccAddress)
  596. {
  597. if (!string.IsNullOrEmpty(toAddress))
  598. {
  599. _to = _to + ";" + toAddress;
  600. }
  601.  
  602. if (!string.IsNullOrEmpty(ccAddress))
  603. {
  604. _cc = _cc + ";" + ccAddress;
  605. }
  606.  
  607. if (!string.IsNullOrEmpty(bccAddress))
  608. {
  609. _bcc = _bcc + ";" + bccAddress;
  610. }
  611. }
  612. }
  613.  
  614. #endregion
  615.  
  616. #region Mail Address Type
  617.  
  618. /// <summary>
  619. /// Mail address type, include To, Cc, Bcc
  620. /// </summary>
  621. public enum MailAddressType
  622. {
  623. To,
  624. Cc,
  625. Bcc
  626. }
  627.  
  628. #endregion
  629.  
  630. }

Email 发送的更多相关文章

  1. 配置 SQL Server Email 发送以及 Job 的 Notification通知功能

    配置 SQL Server Email 发送以及 Job 的 Notification通知功能 在与数据库相关的项目中, 比如像数据库维护, 性能警报, 程序出错警报或通知都会使用到在 SQL Ser ...

  2. NodeJs之邮件(email)发送

    NodeJs之邮件(email)发送 一,介绍与需求 1.1,介绍 1,Nodemailer简介 Nodemailer是一个简单易用的Node.js邮件发送插件 github地址 Nodemailer ...

  3. python selenium2示例 - email发送

    前言 在进行日常的自动化测试实践中,我们总是需要将测试过程中的记录.结果等等等相关信息通过自动的手段发送给相关人员.python的smtplib.email模块为我们提供了很好的email发送等功能的 ...

  4. Python Email发送,通知业务完成

    Email 发送 #!/usr/bin/python # -*- coding: UTF-8 -*- import base64 import smtplib from email.mime.text ...

  5. Cognos定时Email发送报表数据功能

    1:进入 IBM Cognos Configuration-Data Access-Notification 2:设置如下(注意一定要是smtp服务,端口25,我这里是用了腾讯邮箱的smtp服务) 当 ...

  6. python使用smtplib和email发送腾讯企业邮箱邮件

    公司每天要发送日报,最近没事搞了一下如何自动发邮件,用的是腾讯企业邮箱,跟大家分享一下我的研究过程吧. 以前弄的发邮件的是用qq邮箱发的,当时在网上查资料最后达到了能发图片,网页,自定义收件人展示,主 ...

  7. 【原创】Talend ETL开发——基于joblet的统一的email发送

    更新 2019/1/16:增加了允许5个附件发送.smtp等配置的字段. 一.背景 在ETL数据整合过程中,肯定会涉及到email的通知,比如ETL的执行情况汇报,执行耗时汇报,关键数据更新情况等信息 ...

  8. java email发送(附件中文的处理)

    这里使用的是commons-email-1.3.2.jar进行的开发,自认为这是简单的邮件发送. package com.yt.base.common; import java.io.Unsuppor ...

  9. Android 调用系统Email发送带多附件的邮件

    转自:http://www.open-open.com/lib/view/open1347005126912.html 众所周知,在Android中调用其他程序进行相关处理,都是使用的Intent.当 ...

  10. SpringBoot配置Email发送功能

    相信使用过Spring的众多开发者都知道Spring提供了非常好用的 JavaMailSender接口实现邮件发送.在Spring Boot的Starter模块中也为此提供了自动化配置.下面通过实例看 ...

随机推荐

  1. heartbeat高可用

    一.基本了解 1.Hearbeat和keepalived区别Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称V ...

  2. python 并发编程 多线程 信号量

    一 信号量 信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行,信号量同一时间可以有5个任务拿到锁去执行 如果说互斥锁是合租房屋的人去抢一个厕所,那么信号量就相当于一群 ...

  3. 7大python 深度学习框架的描述及优缺点绍

    Theano https://github.com/Theano/Theano 描述: Theano 是一个python库, 允许你定义, 优化并且有效地评估涉及到多维数组的数学表达式. 它与GPUs ...

  4. HTTP协议的概念作用和特点

    Web交互的基本流程 请求:客户端根据服务器地址把数据发送给服务器的过程叫请求. 相应:服务器将请求的处理结果发送给浏览器的过程叫响应. 什么是HTTP? 概念:超文本传输协议. HTTP有什么作用? ...

  5. Anaconda配置环境变量+创建虚拟环境+pycharm使用虚拟环境

    Anaconda配置环境变量+创建虚拟环境 配置环境变量 没有添加系统变量,所有系统根本识别不了conda命令,找不到位置,所以添加以下系统变量: 添加对应Anaconda环境变量:(以自己的安装路径 ...

  6. 为什么只有ip地址和端口号需要主机字节序到网络字节序的转换?

    答复是:因为内容是二进制流,不是整数. 整数(int.uint16.uint32)的表达,是需要多字节的,在不同cpu上,字节次序是不同的.因此,从A主机到B主机,如果是异构的,就需要做字节调整.同构 ...

  7. 微信小程序 报错 “对应的服务器无效。控制台输入 showRequestInfo()可以获取更详细信息”

    之前做的项目突然无法读出数据了,一测试发现报这个错误==>对应的服务器无效.控制台输入 showRequestInfo()可以获取更详细信息,后来发现是SSL证书到期了.重新申请了一个证书,免费 ...

  8. py3 base64加密

    import base64 #字符串编码: encodestr = base64.b64encode('abcr34r344r'.encode('utf-8')) print(str(encodest ...

  9. python 单引号、双引号和三引号混用

    单引号: 当单引号中存在单引号时,内部的单引号需要使用转义字符,要不然就会报错: 当单引号中存在双引号时,双引号可以不用加转义字符,默认双引号为普通的字符,反之亦然. 双引号: 当双引号中存在双引号时 ...

  10. 2019-2020-1 20199319《Linux内核原理与分析》第三周作业

    操作系统是如何工作的 基础知识 1.计算机的三个法宝:存储程序计算机.函数调用堆栈机制.中断. 2.堆栈的具体作用:记录函数调用框架.传输函数参数.保存返回值的地址.提供函数内部局部变量的存储空间. ...