zoukankan      html  css  js  c++  java
  • [工具-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("邮件发送失败!" + "
    " + "技术信息:
    " + "请验证,发件邮箱和密码是否正确!" );
                    }
                    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("
    ");
                }
            }
    
            // 换行追加
            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

  • 相关阅读:
    练习
    圆形时钟
    鼠标经过改变颜色
    Java基础知识精华部分(个人总结)
    Java随机数总结
    java 获取随机数字的三种方法
    网站开发人员应该知道的61件事
    人人都该了解的十大算法
    String 字符串
    面向对象 JAVA代码
  • 原文地址:https://www.cnblogs.com/superdo/p/4719135.html
Copyright © 2011-2022 走看看