[工具-008] C#邮件发送系统
邮件发送系统很多,但是我这边给大家展示下我最近开发的一款邮件发送系统,有参照网上的一个兄弟的界面,进行了升级,界面如下。
从界面上我们可以看到了该邮件系统有如下功能:
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
比大多数人的努力程度之低,根本轮不到拼天赋...
宝宝巴士 SD.Team