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

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

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. vue js手机端滑到某一个位置时固定位置显示

    1.HTML <div id="searchBar"><ul class="items_filter" :class="search ...

  2. Linux之《荒岛余生》(一)准备篇

    xin片之争,已经暴露了中国xin的问题,我等码农束手无策:而在操作系统方面,成果也是乏善可陈:现如今酷炫的Web监控工具,让很多研发丧失了真正处理问题的能力. 越接近底层,就越接近真相,在计算机的世 ...

  3. dp 20190617

    A. Alternative Thinking 这个标的是dp,但是我感觉就只能算思维题,不是特别难, 你仔细想想就知道,你先求出01这样子满足条件的个数,如果要进行改变,最多只可以增加两个,也可以增 ...

  4. CC2530定时器

    一.定时/技术器的基本原理 定时/计数器,是一种能够对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向CPU提出中断处理请求,从而实现定时或者计数功能的外设.         定时/计数 ...

  5. Spring Cloud学习 之 Spring Cloud Ribbon(负载均衡策略)

    文章目录 AbstractLoadBalancerRule: RandomRule: RoundRobinRule: RetryRule: WeightedResponseTimeRule: 定时任务 ...

  6. C# 基础至集合-数组、List<T>、ArrayList、LinkedList、HashMap的一些区别

    1:数组 ]; //赋值 strs[] = "; strs[] = "; //修改 strs[] = "burg"; //删除 没法删除 除非转化为可变数组li ...

  7. 【Scala】什么是隐式转换?它又能用来干嘛?该怎么用

    文章目录 定义 隐式参数 隐式转换 隐式值:给方法提供参数 隐式视图 将Int和Double类型转换为String 狗狗学技能(使用别的类中的方法) 使用规则 定义 隐式参数 隐式参数指在函数或者方法 ...

  8. Day_08【面向对象】扩展案例2_测试旧手机新手机类,并给新手机实现玩游戏功能

    分析以下需求,并用代码实现 1.定义手机类 行为: 打电话,发短信 2.定义接口IPlay 行为: 玩游戏 3.定义旧手机类继承手机类 行为: 继承父类的行为 4.定义新手机继承手机类实现IPlay接 ...

  9. WriteUp_easy_sql_堆叠注入_强网杯2019

    题目描述 随便注 解题过程 查看源码,发现应该不适合sqlmap自动化注入,该题应该是让你手工注入: <!-- sqlmap是没有灵魂的 --> <form method=" ...

  10. 深入理解Java虚拟机第三版,总结笔记【随时更新】

    最近一直在看<深入理解Java虚拟机>第三版,无意中发现了第三版是最近才发行的,听说讲解的JDK版本升级,新增了近50%的内容. 这种神书,看懂了,看进去了,真的看的很快,并没有想象中的晦 ...