using System;
using System.Text;
using System.Net.Mail;
using System.Net;
using System.Linq;
using System.Text.RegularExpressions; namespace Dos.ORM.Common.Helpers
{
/// <summary>
/// 发送邮件帮助类
/// </summary>
public class EmailHelper
{ private readonly SmtpClient _smtp = new SmtpClient();
private Encoding Encoding { get; set; }
private bool IsHtml { get; set; }
private string[] Cc { get; set; }
private string[] Bcc { get; set; } /// <summary>
/// 是否为腾讯企业邮箱
/// </summary>
private readonly bool _isExmailQq; /// <summary>
/// 发件邮箱密码或授权码
/// </summary>
private string Password { get; set; } /// <summary>
/// 获取发送结果,成功则为空
/// </summary>
public string Result { get; private set; } /// <summary>
/// 设置邮件编码类型
/// </summary>
/// <param name="contentEncoding"></param>
public void SetEncoding(Encoding contentEncoding)
{
Encoding = contentEncoding; }
/// <summary>
///设置邮件正文是否为 Html 格式
/// </summary>
/// <param name="isHtml"></param>
public void SetIsHtml(bool isHtml)
{
IsHtml = isHtml;
}
/// <summary>
/// 抄送
/// </summary>
/// <param name="cc"></param>
public void SetCc(params string[] cc)
{
Cc = cc;
} /// <summary>
/// 暗送
/// </summary>
/// <param name="bc"></param>
public void SetBc(params string[] bc)
{
Bcc = bc;
}
/// <summary>
/// 是否ssl加密
/// </summary>
/// <param name="isSsl"></param>
public void SetIsSsl(bool isSsl)
{
_smtp.EnableSsl = isSsl;
} /// <summary>
/// 构造函数
/// </summary>
/// <param name="host">SMTP事务的主机的名称或IP地址</param>
/// <param name="sendUserAccName">发件人邮件账号名称(不包含@及后缀)</param>
/// <param name="sendUserPwd">发件人邮箱密码</param>
/// <param name="isExmailQq">是否为腾讯企业邮箱</param>
/// <param name="port">端口号,默认为25</param>
public EmailHelper(string host, string sendUserAccName, string sendUserPwd, bool isExmailQq = false, int port = )
{
_smtp.Host = host;
Password = sendUserPwd;
_isExmailQq = isExmailQq;
_smtp.Port = port != ? port : 0x19;
_smtp.EnableSsl = false; IsHtml = true;
Encoding = Encoding.UTF8; if (string.IsNullOrEmpty(sendUserAccName) || string.IsNullOrEmpty(sendUserPwd))
{
_smtp.UseDefaultCredentials = false;
}
else
{
_smtp.Credentials = new NetworkCredential(sendUserAccName, sendUserPwd);
}
} /// <summary>
/// 发送邮件
/// </summary>
/// <param name="fromAcc">发件人邮件地址</param>
/// <param name="fromUserNickname">发件人显示名称</param>
/// <param name="toUserAcc">收件人地址</param>
/// <param name="title">邮件标题</param>
/// <param name="body">邮件正文</param>
/// <param name="file">附件地址数组</param>
/// <returns>bool 是否成功 </returns>
public bool Send(string fromAcc, string fromUserNickname, string toUserAcc, string title, string body, params string[] file)
{
return Send(fromAcc, fromUserNickname, new string[] { toUserAcc }, title, body, file);
} /// <summary>
/// 发送邮件
/// </summary>
/// <param name="fromAcc">发件人邮件地址</param>
/// <param name="fromUserNickname">发件人显示名称</param>
/// <param name="toUserAcc">收件人地址</param>
/// <param name="title">邮件标题</param>
/// <param name="body">邮件正文</param>
/// <param name="file">附件地址数组</param>
/// <returns>bool 是否成功 </returns>
public bool Send(string fromAcc, string fromUserNickname, string[] toUserAcc, string title, string body, params string[] file)
{
string mailReg = @"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$";
if (toUserAcc == null)
{
throw new ArgumentNullException("EmailHelper.Send.to");
} if (toUserAcc.Any(oit => !Regex.IsMatch(oit + "", mailReg)))
{
Result = "收件人地址不合法";
return false;
}
if (Bcc != null && Bcc.Length > )
{
if (Bcc.Any(oit => !Regex.IsMatch(oit + "", mailReg)))
{
Result = "暗送人地址不合法";
return false;
}
}
if (Cc != null && Cc.Length > )
{
if (Cc.Any(oit => !Regex.IsMatch(oit + "", mailReg)))
{
Result = "抄送人地址不合法";
return false;
}
} if (_isExmailQq)
{
#region 检查是否为腾讯企业邮箱(注意这里有一个坑,腾旭企业邮箱需要单独进行以下设置)
//此坑可参见:https://www.cnblogs.com/gxivwshjj/p/7562311.html var mail = new System.Web.Mail.MailMessage();
try
{
mail.To = string.Join(";", toUserAcc);
mail.From = fromAcc;
mail.Subject = title;
mail.BodyFormat = System.Web.Mail.MailFormat.Html;
mail.Body = body; //设置基础身份验证为1
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "");
//设置发件邮箱地址
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", fromAcc);
//设置发件邮箱密码
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", Password);
//设置端口号为465
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", );
//设置SSL为true
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", "true"); //发送邮件的附件
foreach (var r in file)
{
var objMailAttachment = new Attachment(r);
mail.Attachments.Add(objMailAttachment);
} System.Web.Mail.SmtpMail.SmtpServer = _smtp.Host;
System.Web.Mail.SmtpMail.Send(mail); return true;
}
catch (Exception ex)
{
Result = ex.Message;
} #endregion
}
else
{
MailMessage message = new MailMessage(); //创建一个附件对象
foreach (var r in file)
{
//发送邮件的附件
var objMailAttachment = new Attachment(r);
message.Attachments.Add(objMailAttachment);
}
message.From = new MailAddress(fromAcc, fromUserNickname);
message.Subject = title;
message.SubjectEncoding = Encoding;
message.Body = body;
message.BodyEncoding = Encoding;
message.IsBodyHtml = IsHtml;
message.Priority = MailPriority.Normal;
foreach (string str in toUserAcc)
{
message.To.Add(str);
}
if (Bcc != null && Bcc.Length > )
{
foreach (string b in Bcc)
{
message.Bcc.Add(b);
}
}
if (Cc != null && Cc.Length > )
{
foreach (string c in Cc)
{
message.CC.Add(c);
}
} try
{
_smtp.Send(message);
return true;
}
catch (Exception ex)
{
Result = ex.Message;
}
} return false;
}
}
}

.Net Email操作类的更多相关文章

  1. C# 字符串操作类

    using System; using System.Collections.Generic; using System.Text; using System.Collections; using S ...

  2. [C#]exchange发送,收件箱操作类

    最近项目中需要用到exchange的操作,就参照msdn弄了一个简单的操作类.目前先实现了,发送邮件和拉取收件箱的功能,其他的以后在慢慢的添加. using Microsoft.Exchange.We ...

  3. ecshop数据库操作类

    ECShop v2.7.2没有使用一些开源的数据库操作类,比如adodb或者PEAR,而是封装了自己的实现. 好处:实现非常轻量,只有一个文件,27Kb,大大减小了分发包的文件大小. 当网站需要做me ...

  4. ECShop - 数据库操作类

    ECShop v2.7.2没有使用一些开源的数据库操作类,比如adodb或者PEAR,而是封装了自己的实现.这样做的好处是实现非常轻量,只有一个文件,27Kb,大大减小了分发包的文件大小.另外,当网站 ...

  5. XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)

    XML序列化   #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...

  6. FTP操作类的使用

    FTP(文件传输协议) FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序 ...

  7. 【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~

    最近用php做了点小东东,用上了ezSQL,感觉真的很ez,所以拿来跟大家分享一下~ ezSQL是一个非常好用的PHP数据库操作类.著名的开源博客WordPress的数据库操作就使用了ezSQL的My ...

  8. JQuery操作类数组的工具方法

    JQuery学习之操作类数组的工具方法 在很多时候,JQuery的$()函数都返回一个类似数据的JQuery对象,例如$('div')将返回div里面的所有div元素包装的JQuery对象.在这中情况 ...

  9. Util应用程序框架公共操作类(十二):Lambda表达式公共操作类(三)

    今天在开发一个简单查询时,发现我的Lambda操作类的GetValue方法无法正确获取枚举类型值,以至查询结果错误. 我增加了几个单元测试来捕获错误,代码如下. /// <summary> ...

随机推荐

  1. BlueHost主机建站方案怎样选择?

    BlueHost是知名美国主机商,近年来BlueHost不断加强中国市场客户的用户体验,提供多种主机租用方案,基本能够满足各类网站建设需求.下面就和大家介绍一下建站应该怎样选择主机. 1.中小型网站 ...

  2. Java 学习 时间格式化(SimpleDateFormat)与历法类(Calendar)用法详解

    基于Android一些时间创建的基本概念 获取当前时间 方式一: Date date = new Date(); Log.e(TAG, "当前时间="+date); 结果: E/T ...

  3. The Battle of Chibi

    The Battle of Chibi 给出一段长度为n的序列\(\{a_i\}\),求其中长度为m的严格上升子序列个数\(mod\ 10^9+7\),\(n\leq 10^3\). 解 不难想到设\ ...

  4. LeetCode第二题—— Add Two Numbers(模拟两数相加)

    Description: You are given two non-empty linked lists representing two non-negative integers. The di ...

  5. Image 释放

    你是用 Image.FromFile取的图片吧,这个方法会锁定图片文件. 有几种方法解决:一:System.Drawing.Image img = System.Drawing.Image.FromF ...

  6. Windows 10 连接服务器

    { windows + r    input mstsc } { //mstsc D:\TOOL\Servers.rdp /v 127.0.0.1:9998 }

  7. 【转载】OpenCL实现矩阵相乘

    矩阵相乘其实就是前一个矩阵的每一行乘以后一个矩阵的每一列,然后将乘后的每一个数字相加,得到结果矩阵的指定位置的数值.具体算法回顾一下线性代数即可.但是这种行列相乘其实都是独立的,如果是CPU计算必须串 ...

  8. thinkphp 获取内容

    如果需要获取渲染模板的输出内容而不是直接输出,可以使用fetch方法. fetch方法的用法和display基本一致(只是不需要指定输出编码和输出类型): 大理石平台规格 fetch('模板文件') ...

  9. 「题解」:$e$

    问题 B: $e$ 时间限制: 2 Sec  内存限制: 512 MB 题面 题面谢绝公开. 题解 话说一天考两个主席树这回事…… 正解可以叫树上主席树??(脸哥说也叫主席树上树???) 对于树上的每 ...

  10. System.Configuration.ConfigurationManager.cs

    ylbtech-System.Configuration.ConfigurationManager.cs 1.程序集 System.Configuration, Version=4.0.0.0, Cu ...