namespace 99999
{
/// <summary>
/// Common interfaces to connect mail server to process e-mail.
/// </summary>
public static class MailClient
{
/// <summary>
/// Process mail queue in database. Call by web service just for schedule process.
/// </summary>
/// <param name="processId"></param>
public static void ProcessQueue( string processId )
{
try
{
//Lock and fetch all mail items in queue.
StringBuilder sqlText = new StringBuilder()
.AppendFormat("UPDATE dbmail_send_task SET MailFrom = '{0}' WHERE Status=0 AND MailFrom IS NULL ", processId)
.AppendFormat("SELECT * FROM dbmail_send_task WHERE Status=0 AND MailFrom ='{0}'", processId); System.Diagnostics.Debug.WriteLine(sqlText.ToString()); DataTable dt = Database.SqlHelper.RunQuery(sqlText.ToString()); string mailServer = AppSettings.MailServer;
if (string.IsNullOrEmpty(mailServer))
{
return;
} foreach (DataRow dr in dt.Rows)
{
int taskId = Convert.ToInt32(dr["TaskID"]); System.Diagnostics.Debug.WriteLine(string.Format("Send item:{0}", taskId)); try
{
//Send mail item using smtp.
System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();
mail.Subject = Convert.ToString(dr["Title"]);
mail.Body = Convert.ToString(dr["Body"]); //using reply to instead of mail from because of no mail from fields on UI.
string replyTo = Convert.ToString(dr["ReplyTo"]);
if (!string.IsNullOrEmpty(replyTo))
{
mail.Sender = new System.Net.Mail.MailAddress(replyTo);
mail.From = new System.Net.Mail.MailAddress(replyTo);
}
else
{
mail.Sender = new System.Net.Mail.MailAddress(AppSettings.MailDefaultSender);
mail.From = new System.Net.Mail.MailAddress(AppSettings.MailDefaultSender);
} string mailTo = Convert.ToString(dr["MailTo"]);
foreach(string sTemp in mailTo.Split(';'))
{
if (!string.IsNullOrEmpty(sTemp))
{
mail.To.Add(sTemp);
}
} string mailCc = Convert.ToString(dr["MailCc"]);
foreach (string sTemp in mailCc.Split(';'))
{
if (!string.IsNullOrEmpty(sTemp))
{
mail.CC.Add(sTemp);
}
} string mailBcc = Convert.ToString(dr["MailBcc"]);
foreach (string sTemp in mailBcc.Split(';'))
{
if (!string.IsNullOrEmpty(sTemp))
{
mail.Bcc.Add(sTemp);
}
} string attachment = Convert.ToString(dr["Attachments"]);
foreach (string sTemp in attachment.Split(';'))
{
if (!string.IsNullOrEmpty(sTemp))
{
mail.Attachments.Add(new System.Net.Mail.Attachment(sTemp));
}
} mail.IsBodyHtml = true;
mail.DeliveryNotificationOptions = System.Net.Mail.DeliveryNotificationOptions.OnFailure; System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient(mailServer);
smtp.SendCompleted += new System.Net.Mail.SendCompletedEventHandler(smtp_SendCompleted);
smtp.SendAsync(mail, taskId);
}
catch (Exception ex)
{
Logging.LogWriter.Write(ex); string sqlText1 = string.Format("UPDATE dbmail_send_task SET [Status]=-1, Remark=N'{0}', SendTime=GETDATE(), MailFrom='ERROR' WHERE TaskID={1} ",ex.Message,taskId);
System.Diagnostics.Debug.WriteLine(sqlText1.ToString());
Database.SqlHelper.RunCommand(sqlText1);
}
}
}
catch (Exception ex)
{
Logging.LogWriter.Write(ex);
}
} /// <summary>
/// Process failed mail queue in database. Call by web service just for schedule process.
/// </summary>
/// <param name="processId"></param>
public static void ResendFailedMails(string processId)
{
try
{
//Lock and fetch all mail items in queue.
StringBuilder sqlText = new StringBuilder()
.AppendFormat("UPDATE dbmail_send_task SET MailFrom = '{0}' WHERE Status=-1 AND MailFrom<>'{0}' AND MailFrom<>'ERROR' ", processId)
.AppendFormat("SELECT * FROM dbmail_send_task WHERE Status=-1 AND MailFrom='{0}' AND MailFrom<>'ERROR' ", processId); System.Diagnostics.Debug.WriteLine(sqlText.ToString()); DataTable dt = Database.SqlHelper.RunQuery(sqlText.ToString()); string mailServer = AppSettings.MailServer;
if (string.IsNullOrEmpty(mailServer))
{
return;
} foreach (DataRow dr in dt.Rows)
{
int taskId = Convert.ToInt32(dr["TaskID"]); System.Diagnostics.Debug.WriteLine(string.Format("Resend item:{0}",taskId)); try
{
//Send mail item using smtp.
System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();
mail.Subject = Convert.ToString(dr["Title"]);
mail.Body = Convert.ToString(dr["Body"]); //using reply to instead of mail from because of no mail from fields on UI.
string replyTo = Convert.ToString(dr["ReplyTo"]);
if (!string.IsNullOrEmpty(replyTo))
{
mail.Sender = new System.Net.Mail.MailAddress(replyTo);
mail.From = new System.Net.Mail.MailAddress(replyTo);
}
else
{
mail.Sender = new System.Net.Mail.MailAddress(AppSettings.MailDefaultSender);
mail.From = new System.Net.Mail.MailAddress(AppSettings.MailDefaultSender);
} string mailTo = Convert.ToString(dr["MailTo"]);
foreach (string sTemp in mailTo.Split(';'))
{
if (!string.IsNullOrEmpty(sTemp))
{
mail.To.Add(sTemp);
}
} string mailCc = Convert.ToString(dr["MailCc"]);
foreach (string sTemp in mailCc.Split(';'))
{
if (!string.IsNullOrEmpty(sTemp))
{
mail.CC.Add(sTemp);
}
} string mailBcc = Convert.ToString(dr["MailBcc"]);
foreach (string sTemp in mailBcc.Split(';'))
{
if (!string.IsNullOrEmpty(sTemp))
{
mail.Bcc.Add(sTemp);
}
} string attachment = Convert.ToString(dr["Attachments"]);
foreach (string sTemp in attachment.Split(';'))
{
if (!string.IsNullOrEmpty(sTemp))
{
mail.Attachments.Add(new System.Net.Mail.Attachment(sTemp));
}
} mail.IsBodyHtml = true;
mail.DeliveryNotificationOptions = System.Net.Mail.DeliveryNotificationOptions.OnFailure; System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient(mailServer);
smtp.SendCompleted += new System.Net.Mail.SendCompletedEventHandler(smtp_SendCompleted);
smtp.SendAsync(mail, taskId);
}
catch (Exception ex)
{
Logging.LogWriter.Write(ex); 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);
System.Diagnostics.Debug.WriteLine(sqlText1.ToString());
Database.SqlHelper.RunCommand(sqlText1);
}
}
}
catch (Exception ex)
{
Logging.LogWriter.Write(ex);
}
} static void smtp_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
try
{
int taskId = Convert.ToInt32(e.UserState);
if (e.Error != null)
{
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);
System.Diagnostics.Debug.WriteLine(sqlText.ToString());
Database.SqlHelper.RunCommand(sqlText);
}
else
{
string sqlText = string.Format("UPDATE dbmail_send_task SET [Status]=1, SendTime=GETDATE(), Remark=NULL WHERE TaskID={0} ", taskId);
System.Diagnostics.Debug.WriteLine(sqlText.ToString());
Database.SqlHelper.RunCommand(sqlText);
}
}
catch (Exception ex)
{
Logging.LogWriter.Write(ex);
}
} /// <summary>
/// Send out a mail, write log file but no warning returned if any exception
/// </summary>
/// <param name="mailAddress">Include To, CC, BCC mail address</param>
/// <param name="mailContent"></param>
/// <returns></returns>
public static bool SendMessage(MailAddress mailAddress, MailEntity mailContent)
{
string profile = Configuration.AppSettings.MailUserDeliveryProfile;
if (string.IsNullOrEmpty(profile))
{
throw new ArgumentNullException("MailUserDeliveryProfile", "Value of configuration item is required.");
} if (string.IsNullOrEmpty(mailAddress.To))
{
throw new ArgumentNullException("MailAddress.To", "Value of MailTo is required.");
} 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"; IDataParameter P0 = new SqlParameter("@P0", SqlDbType.VarChar);
P0.Value = profile;
IDataParameter P1 = new SqlParameter("@P1", SqlDbType.VarChar);
P1.Value = mailAddress.To;
IDataParameter P2 = new SqlParameter("@P2", SqlDbType.VarChar);
P2.Value = mailAddress.Cc;
IDataParameter P3 = new SqlParameter("@P3", SqlDbType.VarChar);
P3.Value = mailAddress.Bcc;
IDataParameter P4 = new SqlParameter("@P4", SqlDbType.VarChar);
P4.Value = mailAddress.ReplyTo;
IDataParameter P5 = new SqlParameter("@P5", SqlDbType.NVarChar);
P5.Value = mailContent.Subject;
IDataParameter P6 = new SqlParameter("@P6", SqlDbType.NVarChar);
P6.Value = CleanHtml(mailContent.Body);
IDataParameter P7 = new SqlParameter("@P7", SqlDbType.NVarChar);
P7.Value = mailContent.Attachments;
IDataParameter P8 = new SqlParameter("@P8", SqlDbType.Int);
if (mailAddress.SendBy > )
{
P8.Value = mailAddress.SendBy;
}
else
{
P8.Value = Security.UserAuthentication.GetCurrentOperator();
}
IDataParameter P9 = new SqlParameter("@P9", SqlDbType.NVarChar);
P9.Value = mailContent.Remark; int result = Database.SqlHelper.RunCommand(sqlText, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9);
if (result > )
{
return true;
}
else
{
return false;
} } /// <summary>
/// Clean up html text
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private static string CleanHtml(string input)
{
string output = string.Empty;
output = input.Replace(@"\r\n", "<br>");
return output;
} ///// <summary>
///// Encode input string to Unicode
///// </summary>
///// <param name="input"></param>
///// <returns></returns>
//private static string UTF8Str(string input)
//{
// byte[] bs = System.Text.Encoding.Default.GetBytes(input);
// string output = System.Text.Encoding.GetEncoding("UTF-8").GetString(bs);
// return output;
//} //private static string ANSIStr(string input)
//{
// byte[] bs = System.Text.Encoding.Default.GetBytes(input);
// string output = System.Text.Encoding.ASCII.GetString(bs);
// return output;
//} ///// <summary>
///// Convert ununicode string to unicode string.
///// </summary>
///// <param name="str"></param>
///// <returns></returns>
//private static string ConvertToUnicodeString(string str)
//{
// StringBuilder outStr = new StringBuilder();
// if (!string.IsNullOrEmpty(str))
// { // for (int i = 0; i < str.Length; i++)
// {
// if (str[i] > 0xff)
// {
// outStr.AppendFormat("&#{0}", ((int)str[i]).ToString());
// }
// else
// {
// outStr.Append(str[i]);
// }
// }
// }
// return outStr.ToString();
//} } #region Mail Entity /// <summary>
/// Build mail entity, include subject,body, attachments and options.
/// </summary>
public class MailEntity
{
/// <summary>
/// Build a mail entity with template id, you may use -1 if no template id.
/// </summary>
/// <param name="templateId">template id, you may use -1 if no template id.</param>
public MailEntity(int templateId)
{
if (templateId == -)
{
return;
}
else
{
//Load mail template from database according to special template id
string sqlText = string.Format("select * from tb_MailTemplate where ID={0}", templateId);
DataTable dt = Database.SqlHelper.RunQuery(sqlText);
if (dt != null && dt.Rows.Count > )
{
object o = dt.Rows[]["Content"];
if (o != null)
{
_body = o.ToString();
} object title = dt.Rows[]["Title"]; if (title != null)
{
_subject = title.ToString();
}
}
}
} private string _subject = ""; /// <summary>
/// Mail title
/// </summary>
public string Subject
{
get { return _subject; }
set { _subject = value; }
} private string _body = ""; /// <summary>
/// Mail body, html string
/// </summary>
public string Body
{
get { return _body; }
set { _body = value; }
} private string _attachments = ""; /// <summary>
/// Mail attachments, split by "|" if multiple files
/// </summary>
public string Attachments
{
get { return _attachments; }
} private string _attachmentFilePath = ""; public string AttachmentFilePath
{
get { return _attachmentFilePath; }
} private string _remark = ""; /// <summary>
/// Remark
/// </summary>
public string Remark
{
get { return _remark; }
set { _remark = value; }
} /// <summary>
/// Merge field into template
/// </summary>
/// <param name="fieldName"></param>
/// <param name="fieldValue"></param>
public void MergeField(string fieldName, string fieldValue)
{
if (!string.IsNullOrEmpty(_body))
{
_body = _body.Replace(fieldName, fieldValue);
_subject = _subject.Replace(fieldName, fieldValue);
} } /// <summary>
/// Add file as attachment
/// </summary>
/// <param name="fileName"></param>
public void AttachFile(string fileName)
{
if (string.IsNullOrEmpty(_attachments))
{
_attachments = fileName;
}
else
{
_attachments += "|" + fileName;
}
} } #endregion #region Mail Address /// <summary>
/// Build mail address entity, include To, Cc, Bcc
/// </summary>
[Serializable]
public class MailAddress
{
private string _to = ""; /// <summary>
/// Address of mail to
/// </summary>
public string To
{
get { return _to.TrimStart(';'); }
} private string _cc = ""; /// <summary>
/// Address of mail cc
/// </summary>
public string Cc
{
get { return _cc.TrimStart(';'); }
set { _cc = value; }
} private string _bcc = ""; /// <summary>
/// Address of mail bcc
/// </summary>
public string Bcc
{
get { return _bcc.TrimStart(';'); }
} private string _replyTo = ""; /// <summary>
/// Address of mail receiver reply to
/// </summary>
public string ReplyTo
{
get { return _replyTo; }
set { _replyTo = value; }
} private int _sendBy = ; /// <summary>
/// Address of mail send by
/// </summary>
public int SendBy
{
get { return _sendBy; }
set { _sendBy = value; }
} /// <summary>
/// Address of mail sender
/// </summary>
public string From
{
get { return Configuration.AppSettings.MailDeliveryFrom; }
} /// <summary>
/// Add new address to recipients, copy recipients or blind recipients
/// </summary>
/// <param name="address"></param>
/// <param name="addressType"></param>
public void Add(string address, MailAddressType addressType)
{
switch (addressType)
{
case MailAddressType.To:
{
_to = _to + ";" + address;
break;
}
case MailAddressType.Cc:
{
_cc = _cc + ";" + address;
break;
}
case MailAddressType.Bcc:
{
_bcc = _bcc + ";" + address;
break;
}
default: break;
}
} /// <summary>
/// Add new address to recipients, copy recipients or blind recipients
/// </summary>
/// <param name="address"></param>
/// <param name="addressType"></param>
public void Add(string toAddress, string ccAddress, string bccAddress)
{
if (!string.IsNullOrEmpty(toAddress))
{
_to = _to + ";" + toAddress;
} if (!string.IsNullOrEmpty(ccAddress))
{
_cc = _cc + ";" + ccAddress;
} if (!string.IsNullOrEmpty(bccAddress))
{
_bcc = _bcc + ";" + bccAddress;
}
}
} #endregion #region Mail Address Type /// <summary>
/// Mail address type, include To, Cc, Bcc
/// </summary>
public enum MailAddressType
{
To,
Cc,
Bcc
} #endregion }

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. MySQL 数据库下载

    地址链接: msi:https://dev.mysql.com/downloads/installer/ zip:https://downloads.mysql.com/archives/commun ...

  2. 【VS开发】Caffelib中出现的问题:强制链接静态库所有符号(包括未被使用的)

    C++程序在链接一个静态库时,如果该静态库里的某些方法没有任何地方调用到,最终这些没有被调用到的方法或变量将会被丢弃掉,不会被链接到目标程序中.这样做大大减小生成二进制文件的体积.但是,某些时候,即使 ...

  3. 【电子电路技术】短波红外InGaAs探测器简析

    核心提示: 红外线是波长介于微波与可见光之间的电磁波,波长在0.75-1000μm之间,其在军事.通讯.探测.医疗等方面有广泛的应用.目前对红外线的分类还没有统一的标准,各个专业根据应用的需要,有着自 ...

  4. Junit4 简单使用

    一.环境搭建 对于习惯使用Eclipse开发平台来说,Junit早已是非常通常的插件,在Eclipse开发平台中,可以非常方便地搭建Junit测试环境. 1.在Eclipse上创建工程,任何Java工 ...

  5. Dubbo基础、高级讲解

    基础 https://blog.csdn.net/hardworking0323/article/category/6148466 高级 https://blog.csdn.net/hardworki ...

  6. ORA-01406:提取的列值被截断 ; SQL Server :将截断字符串或二进制数据

    oracle 数据库可以正常连接,表数据也可以正常读取, 但在程序中相同的位置,有时会报错,有时不会报错,有的电脑会报错,有的不会 报错内容为 ORA-01406:提取的列值被截断 查了网上提供的一些 ...

  7. setter 和 getter 高级 以及内存管理初级

    setter 和 getter 的演变,紧接setter 和 getter 初级 1.@property 和  @synthesize 这两个关键字的出现,就是为了剔除代码中的setter方法和get ...

  8. springboot基于CORS处理跨域问题

    1. 为什么有跨域问题 跨域不一定都会有跨域问题. 因为跨域问题是浏览器对于ajax请求的一种安全限制:一个页面发起的ajax请求,只能是与当前页域名相同的路径,这能有效的阻止跨站攻击. 因此:跨域问 ...

  9. Python自学

    print("\u4e2d\u56fd\") 报错,语法错误 修改,去掉尾部的\,正确 import datetimeprint("now:"+datetime ...

  10. 解决 SQLPlus无法登陆oracle,PLSql可以登陆,报错ORA-12560

    使用Oracle 11g 64位服务器,安装64位.32位客户端,出现SQLPlus无法连接数据库,PLSql可以连接问题. 网上查了很多,都不能解决问题,在下面提供一种. 环境变量 右击计算机属性- ...