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. sleep()与wait()的区别

    ①sleep()实现线程阻塞的方法,我们称之为“线程睡眠”,方式是超时等待,怎么理解?就是sleep()通过传入“睡眠时间”作为方法的参数,时间一到就从“睡眠”中“醒来”: ②wait()方法实现线程 ...

  2. Android开发 retrofit下载与上传

    前言 此博客只讲解retrofit下载与上传的使用,其实与其说是retrofit的下载与上传还不如说,依然是Okhttp的下载与上传.如果你需要了解retrofit入门请查看这篇博客(此博客不在详细讲 ...

  3. Java 基础 - public、private、protected区别

    ref: https://www.cnblogs.com/pengfeiliu/p/3745934.html 类中的数据成员和成员函数据具有的访问权限包括:public.private.protect ...

  4. 【JZOJ6277】矩阵游戏

    description analysis 设所有操作之后,\(f[i]\)表示\(i\)行乘的数,\(g[j]\)表示\(j\)列乘的数,那么 \[Answer=\sum^{n}_{i=1}\sum^ ...

  5. 阿里云图数据库GraphDB上线,助力图数据处理

    GraphDB简介 GraphDB图数据库适用于存储,管理,查询复杂并且高度连接的数据,图库的结构特别适合发现大数据集下数据之间的共性和特性,特别善于释放蕴含在数据关系之间的巨大价值.GraphDB引 ...

  6. thinkphp扩展配置

    扩展配置可以支持自动加载额外的自定义配置文件,并且配置格式和项目配置一样. 设置扩展配置的方式如下(多个文件用逗号分隔): // 加载扩展配置文件 'LOAD_EXT_CONFIG' => 'u ...

  7. 使用C++网络库libcurl

    libcurl使用问题记录 libcurl库的初始化和关闭 curl_global_init()和curl_global_cleanup().这两个函数并不是线程安全的.所以只能在主线程中进行一次的初 ...

  8. 請問各位大大,我要將listview顯示的縮圖加入到listview2,請問該如何做呢

    請問各位大大,我要將listview顯示的縮圖加入到listview2,請問該如何做呢?下面的function可以將listview的縮圖加到listview2但是全都顯示listview1第一張的圖 ...

  9. hexo next主题深度优化(十),博文加密,不需要插件,极简模式,相对安全,融合pjax。

    文章目录 效果: 代码: 注意: 背景: 思路: https://www.jianshu.com/p/90c0a15c6f36 http://zhailiange.com/2017/07/06/hex ...

  10. POJ-1502-MPI Maelstrom-dijkstra+输入处理

    BIT has recently taken delivery of their new supercomputer, a 32 processor Apollo Odyssey distribute ...