邮件发送系统很多,但是我这边给大家展示下我最近开发的一款邮件发送系统,有参照网上的一个兄弟的界面,进行了升级,界面如下。

从界面上我们可以看到了该邮件系统有如下功能:

1)服务器的设置

2)发件人的设置

3)收件人的设置

4)主题编写

5)附件添加管理

6)日志输出

7)窗口关闭的时候会自动保存服务器,收件人信息。

整体的实现代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;
using SendEmail.util;
using System.Collections;
using System.Net.Mail;
using System.Net;
using System.Net.Mime; namespace SendEmail
{
public partial class Form1 : Form
{
#region 常量定义
// 服务器备份地址
private const string SERVER_BACK_UP_PATH = "server.txt";
// 收件人备份地址
private const string EmailFrom_BACK_UP_PATH = "emailaddress.txt";
#endregion #region 变量定义
// 服务器存放
private Dictionary<string, int> serverMap = new Dictionary<string,int>();
private ArrayList serverList = new ArrayList();
// 收件人存放
private ArrayList emailFroms = new ArrayList();
#endregion #region 构造函数
public Form1()
{
InitializeComponent();
// 初始化服务器
initComServer();
// 初始化收件人
initGrdEmail();
}
#endregion #region 服务器地址
// 初始化设备列表(从txt中读取设备信息)
private void initComServer()
{
// 假如数据文件存在
if (File.Exists(SERVER_BACK_UP_PATH))
{
ArrayList datas = FileUtil.readFile(SERVER_BACK_UP_PATH);
// 数据存在
if (datas != null && datas.Count > 0)
{
// 清空数据
serverMap.Clear();
serverList.Clear();
// 遍历
foreach (string s in datas)
{
string[] splitArray = s.Split(',');
// 1.服务器名称 2.端口
if (splitArray != null && splitArray.Length == 2)
{
serverList.Add(splitArray[0]);
serverMap.Add(splitArray[0], int.Parse(splitArray[1]));
}
}
bindComServer();
}
}
} // 绑定下拉框
private void bindComServer()
{
comServer.Items.Clear();
comdelServer.Items.Clear();
foreach (string s in serverList)
{
comServer.Items.Add(s);
comdelServer.Items.Add(s);
}
comServer.SelectedIndex = 0;
comdelServer.SelectedIndex = 0;
} // 添加服务
private void button1_Click(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(this.txtServer.Text.Trim()))
{
MessageBox.Show("请填写服务器地址!!!", "友情提示");
return;
}
serverList.Add(this.txtServer.Text.Trim());
serverMap.Add(this.txtServer.Text.Trim(), int.Parse(this.numport.Value+""));
bindComServer();
MessageBox.Show("添加成功!!!", "友情提示");
} // 删除服务
private void button2_Click(object sender, EventArgs e)
{
if (MessageBox.Show("确定要删除服务吗?", "删除前确认", MessageBoxButtons.YesNo) == DialogResult.No)
{
return;
}
string delserver = comdelServer.Text.Trim();
if (serverList.Contains(delserver))
{
serverList.Remove(delserver);
serverMap.Remove(delserver);
}
bindComServer();
} // 保存服务列表(保存到txt中)
private void saveServerCmb()
{
ArrayList dataList = new ArrayList();
if (this.serverMap != null && this.serverMap.Count > 0)
{
foreach (string s in this.serverMap.Keys)
{
string appendtext = s + "," + serverMap[s];
dataList.Add(appendtext);
}
FileUtil.saveFile(SERVER_BACK_UP_PATH, dataList);
}
}
#endregion #region 收件邮箱地址
private void initGrdEmail()
{
// 假如数据文件存在
if (File.Exists(EmailFrom_BACK_UP_PATH))
{
ArrayList datas = FileUtil.readFile(EmailFrom_BACK_UP_PATH);
// 数据存在
if (datas != null && datas.Count > 0)
{
// 清空数据
emailFroms.Clear();
// 遍历
foreach (string s in datas)
{
emailFroms.Add(s.Trim());
int vRownumber = this.grdEmails.Rows.Add();
this.grdEmails.Rows[vRownumber].Cells[0].Value = s.Trim();
}
}
}
} // 邮箱地址添加到GridView中
private void btnEmailAdd_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(this.txtEamilTo.Text.Trim()))
{
if (this.txtEamilTo.ForeColor == Color.Red)
{
MessageBox.Show("输入的收件箱格式不正确!");
}
else
{
emailFroms.Add(this.txtEamilTo.Text.Trim());
int vRownumber = this.grdEmails.Rows.Add();
this.grdEmails.Rows[vRownumber].Cells[0].Value = this.txtEamilTo.Text.Trim();
this.txtEamilTo.Text = string.Empty;
}
}
} // 邮箱地址 删除
private void btnRemove_Click(object sender, EventArgs e)
{
if (this.grdEmails.Rows.Count > 0)
{
// 只可选中一条,进行删除
// int vCurrentIndex = this.grdEmails.CurrentRow.Index;
// this.grdEmails.Rows.RemoveAt(vCurrentIndex);
// 支持多选删除
foreach (DataGridViewRow vrow in grdEmails.SelectedRows)
{
int vIndex = vrow.Index;
this.grdEmails.Rows.RemoveAt(vIndex);
emailFroms.RemoveAt(vIndex);
}
}
} // 邮箱地址 清空
private void btnClear_Click(object sender, EventArgs e)
{
this.grdEmails.Rows.Clear();
emailFroms.Clear();
} // 保存邮箱到txt
private void saveGrdEmail()
{
ArrayList dataList = new ArrayList();
if (this.emailFroms != null && this.emailFroms.Count > 0)
{
foreach (string s in this.emailFroms)
{
dataList.Add(s);
}
FileUtil.saveFile(EmailFrom_BACK_UP_PATH, dataList);
}
}
#endregion #region 验证邮箱输入是否正确,不正确是,字体显示为红色
// 验证 发件邮箱是否正确
private void txtEmailTo_Leave(object sender, EventArgs e)
{ if (!string.IsNullOrEmpty(this.txtEamilTo.Text.Trim()))
{
bool a = IsEmail(this.txtEamilTo.Text);
// 如果不为 邮箱,字体变为红色
if (IsEmail(this.txtEamilTo.Text.Trim()) == false)
{
this.txtEamilTo.ForeColor = Color.Red;
}
else
{
this.txtEamilTo.ForeColor = Color.Black;
}
}
} private bool IsEmail(string vEmail)
{
return System.Text.RegularExpressions.Regex.IsMatch(vEmail, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
} // 验证 收件箱邮箱是否正确
private void txtEamilFrom_Leave(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(this.txtEamilFrom.Text.Trim()))
{
bool a = IsEmail(this.txtEamilFrom.Text);
// 如果不为 邮箱,字体变为红色
if (IsEmail(this.txtEamilFrom.Text.Trim()) == false)
{
this.txtEamilFrom.ForeColor = Color.Red;
}
else
{
this.txtEamilFrom.ForeColor = Color.Black;
}
}
}
#endregion #region 参数
// 保存 附件文件路径
private ArrayList Files = new ArrayList();
// 设置SMTP协议
private SmtpClient vSmtpClient = null;
// 设置发件人地址,需要密码
private MailAddress vMailAddressFrom = null;
// 设置收件人地址,不需要密码
private MailAddress vMailAddressTo = null;
// 附件文件流vMailAddressFrom
private FileStream vFileStream = null;
private MailMessage vMailMessage = null;
#endregion #region 附件操作(支持多选,可以同时上传多个附件)
private void btnFileSelect_Click(object sender, EventArgs e)
{
OpenFileDialog vOpenSelectFile = new OpenFileDialog();
vOpenSelectFile.Multiselect = true;
vOpenSelectFile.Filter = "全部文件|*.*|Excel文件|*.xlsx;*.xls|Csv文件|*.csv";
vOpenSelectFile.FilterIndex = 2;
vOpenSelectFile.RestoreDirectory = true;
if (vOpenSelectFile.ShowDialog() == DialogResult.OK)
{
string message = "";
for (int i = 0; i < vOpenSelectFile.FileNames.Length; i++)
{
if (Check_File(vOpenSelectFile.FileNames[i].ToString(), out message))
{
Files.Add(vOpenSelectFile.FileNames[i].ToString());
int vRownumber = this.grdAttach.Rows.Add();
this.grdAttach.Rows[vRownumber].Cells[0].Value = vOpenSelectFile.FileNames[i].ToString();
}
else
{
appendLogLn(message);
}
}
}
} // 附件 清空
private void btnClearAttach_Click(object sender, EventArgs e)
{
this.grdAttach.Rows.Clear();
Files.Clear();
} // 附件 删除
private void btnDelattach_Click(object sender, EventArgs e)
{
if (this.grdAttach.Rows.Count > 0)
{
// 只可选中一条,进行删除
// int vCurrentIndex = this.grdEmails.CurrentRow.Index;
// this.grdEmails.Rows.RemoveAt(vCurrentIndex);
// 支持多选删除
foreach (DataGridViewRow vrow in grdAttach.SelectedRows)
{
int vIndex = vrow.Index;
this.grdAttach.Rows.RemoveAt(vIndex);
Files.RemoveAt(vIndex);
}
}
}
#endregion #region 验证页面必填项是否已经完善
private bool CheckPage()
{
if (string.IsNullOrEmpty(this.comServer.Text))
{
MessageBox.Show("请输入SMTP服务器名称", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return false;
}
else if (string.IsNullOrEmpty(this.txtEamilFrom.Text))
{
MessageBox.Show("请输入发件人邮箱地址", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return false;
}
else if (string.IsNullOrEmpty(this.txtformPwd.Text))
{
MessageBox.Show("请输入发件人邮箱密码", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return false;
}
else if (this.grdEmails.Rows.Count < 1)
{
MessageBox.Show("请输入收件人邮箱地址", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return false;
}
else if (string.IsNullOrEmpty(this.txtEmailtitle.Text))
{
MessageBox.Show("请输入邮件标题", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return false;
}
return true;
}
#endregion #region 邮件发送
// 设置SMTP服务器信息
private void SetSmtpClient(string vServerHost)
{
vSmtpClient = new SmtpClient();
// SMTP服务器的名称
vSmtpClient.Host = vServerHost;
// 指定端口号
vSmtpClient.Port = serverMap[vServerHost];
// 超时时间
vSmtpClient.Timeout = 0;
} // 验证发件人信息
private void SetAddressForm(string vMailAddress, string vMailPwd)
{
// 创建服务器认证
NetworkCredential vNetwork = new NetworkCredential(vMailAddress, vMailPwd);
// 实例化 发件人地址
vMailAddressFrom = new MailAddress(vMailAddress, "");
// 指定发件人信息,包括邮箱地址和邮箱密码
vSmtpClient.Credentials = new NetworkCredential(vMailAddressFrom.Address, vMailPwd);
} // 检测附件大小
private bool Check_File(string vFilePath, out string vInfo)
{
try
{
vFileStream = new FileStream(vFilePath, FileMode.Open);
}
catch (Exception e)
{
vInfo = "文件名为:" + vFilePath + "的文件被占用或者不能打开。";
return false;
}
string vFileName = vFileStream.Name;
int vSize = Convert.ToInt32(vFileStream.Length / 1024 / 1024);
vFileStream.Close();
if (vSize > 15)
{
vInfo = "文件名为:" + vFileName + "的文件大小大于15M,不允许上传。";
return false;
}
vInfo = string.Empty;
return true;
} // 发送
private void btnSaveTo_Click(object sender, EventArgs e)
{
// 必填项验证通过
if (CheckPage())
{
// 初始化Smtp服务器信息
SetSmtpClient(this.comServer.Text.Trim());
// 验证发件邮箱地址和密码
SetAddressForm(this.txtEamilFrom.Text.Trim(), this.txtformPwd.Text.Trim());
vMailMessage = new MailMessage();
// 添加收件人邮箱地址
foreach (DataGridViewRow vRow in grdEmails.Rows)
{
vMailAddressTo = new MailAddress(vRow.Cells[0].Value.ToString().Trim());
vMailMessage.To.Add(vMailAddressTo);
}
// 发件人邮箱
vMailMessage.From = vMailAddressFrom;
// 邮件主题
vMailMessage.Subject = this.txtEmailtitle.Text.Trim();
vMailMessage.SubjectEncoding = System.Text.Encoding.UTF8;//字体使用的编码
// 邮件正文
vMailMessage.Body = this.txtEmailBody.Text.Trim();
vMailMessage.BodyEncoding = System.Text.Encoding.UTF8;
// 清空历史附件,以防附件重复发送
vMailMessage.Attachments.Clear();
// 添加附件
for (int i = 0; i < Files.Count; i++)
{
vMailMessage.Attachments.Add(new Attachment(Files[i].ToString().Trim(), MediaTypeNames.Application.Octet));
} // 注册邮件发送完毕后的处理事件
vSmtpClient.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
appendLogLn("发送中...");
// 开始发送邮件
vSmtpClient.SendAsync(vMailMessage, "000000000");
}
} // 发送邮件后所处理的函数
private void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
{
try
{
if (e.Cancelled)
{
appendLogLn("发送已取消!");
}
if (e.Error != null)
{
appendLogLn("邮件发送失败!" + "\n" + "技术信息:\n" + "请验证,发件邮箱和密码是否正确!" );
}
else
{
appendLogLn("恭喜邮件成功发出!");
}
}
catch (Exception Ex)
{
appendLogLn("邮件发送失败");
}
}
#endregion #region 日志操作 // 清空日志
private void btnClearLog_Click(object sender, EventArgs e)
{
this.txtlog.Clear();
} // 不换行追加
public void appendLog(string message)
{
this.txtlog.AppendText(message);
} // 指定加完空几行
public void appendLogLastLn(string message, int linenum)
{
appendLog(message);
if (linenum == 0) return;
for (int i = 0; i < linenum; i++)
{
appendLog("\n");
}
} // 换行追加
public void appendLogLn(string message)
{
appendLogLastLn(message, 1);
}
#endregion private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// 保存服务器地址
saveServerCmb();
// 保存邮箱
saveGrdEmail();
}
}
}

以上就是我实现的邮件发送系统的源码,本次实现未考虑是否会被归于垃圾箱和发送限制,有想法和建议的同学们,欢迎评论。

结语

  • 受益,掌握了C#邮件发送

本站文章为宝宝巴士 SD.Team原创,转载务必在明显处注明:(作者官方网站:宝宝巴士)

转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4719135.html

[工具-008] C#邮件发送系统的更多相关文章

  1. Smtp邮件发送系统公用代码整理—总结

    1.前言 a.在软件开发中,我们经常能够遇到给用户或者客户推送邮件,推送邮件也分为很多方式,比如:推送一句话,推送一个网页等等.那么在系统开发中我们一般在什么情况下会使用邮件发送呢?下面我简单总结了一 ...

  2. C# 邮件发送系统

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. 利用工具MailUtils实现邮件的发送,遇到的大坑,高能预警!!

    java实现邮件的发送依赖的jar包有两个:mail.jar和activation.jar,我也找到了一个工具包:itcast-tools-1.4.jar,实现原理大家可以查看源码,先放出资源链接 h ...

  4. 第三章 持续集成jenkins工具使用之邮件配置

    1   Email Extension Plugin插件安装 持续集成很重要的一环就是及时将构建结果通知到对应的责任人,如:构建失败了,至少需要下发通知给造成本次构建失败的开发人员,如果包含自动化测试 ...

  5. UIPath工具来取得邮件里面的添付文件及邮件内容

    下图是得到Outlook邮件附件的示意图 下面的图是对UIPath的属性的设定.最重要的是两个文件夹要保持一致.

  6. 周报?谁还写周报啊?不都用Python小工具: 发个周报邮件给老板就行还写周报啊?不都用Python小工具: 发个周报邮件给老板就行

    缘起: 新跳槽到一家公司, 没想到第一个挑战居然是每周都要发周报. 告诉老板这周都干了些什么和下周准备干什么. 我记性不好, 常常忘事儿.所以很多时候周报都会忘记发送. 于是, 就决定写一个小工具好了 ...

  7. 【Java EE 学习 21 下】【使用java实现邮件发送、邮件验证】

    一.邮件发送 1.邮件发送使用SMTP协议或者IMAP协议,这里使用SMTP协议演示. SMTP协议使用的端口号:25 rfc821详细记载了该协议的相关信息 (1)使用telnet发送邮件(使用12 ...

  8. EDM营销算法:python自动批量发邮件

    EDM营销:全称Email Direct Marketing,即电子邮件营销.企业可以通过使用EDM软件向目标客户发送EDM邮件,建立同目标顾客的沟通渠道,向其直接传达相关信息,用来促进销售.EDM软 ...

  9. [工具开发] Perl 爬虫脚本--从美国国家漏洞数据库抓取实时信息

    一.简介 美国国家漏洞数据库收集了操作系统,应用软件的大量漏洞信息,当有新的漏洞出现时,它也会及时发布出来. 由于信息量巨大,用户每次都需要到它的网站进行搜索,比较麻烦.如果能有个工具,每天自动分析它 ...

随机推荐

  1. Codeforce 1251C. Minimize The Integer

    C. Minimize The Integer time limit per test2 seconds memory limit per test256 megabytes inputstandar ...

  2. 9) drf JWT 认证 签发与校验token 多方式登陆 自定义认证规则反爬 admin密文显示

    一 .认证方法比较 1.认证规则图 django 前后端不分离 csrf认证 drf 前后端分离 禁用csrf 2. 认证规则演变图 数据库session认证:低效 缓存认证:高效 jwt认证:高效 ...

  3. 24-Java-Spring框架(二)

    Spring框架的了解.SpringIOC的部分内容请阅读23-Java-Spring框架(二) 三.Spring Web MVC(Model View Controller) 1.SpringMVC ...

  4. AntDesignPro的权限控制和动态路由

    最近看了AntDesignPro关于权限控制的官方文档以及自己框架里权限控制的实现,总结一下. 先贴一下官网上关于权限控制的图有利于理解 步骤如下: 判断是否有 AccessToken 如果没有则跳转 ...

  5. 关于tablayout+viewpager+fragment配合使用的一点记录

    最近在写项目的时候遇到要求使用tablayout和fragment,遇到了这里记录一下大致思路. tablayout是头部可以左右切换的头部控制栏控件,配合viewpager使用,fragment是碎 ...

  6. python语法学习第十天--类与对象相关的BIF、魔法方法

    一些相关的BIF: issubclass(class,classInfo)#判断是否为子类,classInfo可以为多个类的元组,其中一个是,返回true,一个类也被认为是自己的子类,object是所 ...

  7. 关于redis,你需要了解的几点!

    一.关于 redis key: 1.是二进制安全的,也就是说,你可以使用任何形式的二进制序列来作为key,比如一个string,或者一个jpg图片的数据,需要说明的是,空字符串也是一个有效的key. ...

  8. Unity直接调用Android Toast

    Unity直接调用Android Toast 这两天在搭一套UI框架,想把Android的Toast直接集成上去,有不想直接打jar包,所有写了个C#直接调用,废话不多说,直接干货: using Un ...

  9. 200万年薪请不到!清华姚班到底有多牛X?

    前几天,清华大学自动化系2020年大一新生的C++作业因为太难而上了热搜,该话题在知乎上的热度一度高达 1300+ 万.  在该帖子下方,有很多关于这件事的讨论,其中很多不禁赞叹"清华太牛 ...

  10. Python-控制台实现简单的名片管理系统

    通过Python开发一个基于控制台的名片管理系统,具体看下图以及相关代码. cards_main.py文件中提供程序的入口 import cards_toolslx while True: # TOD ...