C#接入SMTP邮件服务

简介: 这两个引用用于C#接入邮件的SMTP服务

引入SMTP服务包


//引入邮件服务包
using System.Net.Mail;
using System.Net;

这两个引用用于C#接入邮件的SMTP服务

控件页面

网络异常,图片无法展示
|

定时器

为了给用户更好的体验,我们使用定时器,给用户看到具体剩余时间

网络异常,图片无法展示
|

开始创建一个功能类

新建一个类MailVeriCodeClass,里面定义好各类功能函数

首先引入必要的命名空间

//发送邮件需要引用的命名空间
using System.Net.Mail;
using System.Net;
//正则验证引用
using System.Text.RegularExpressions;

功能类代码

public class MailVeriCodeClass
    {
        #region  邮箱验证码功能
        /// <summary>
        ///  生成随机验证码
        /// </summary>
        /// <param name="CodeLength">验证码长度</param>
        public static string CreateRandomMailCode(int CodeLength)
        {
            int randNum;
            char code;
            string randomCode = String.Empty;//随机验证码
            //生成一定长度的随机验证码       
            //Random random = new Random();//生成随机数对象
            for (int i = 0; i < CodeLength; i++)
            {
                //利用GUID生成6位随机数      
                byte[] buffer = Guid.NewGuid().ToByteArray();//生成字节数组
                int seed = BitConverter.ToInt32(buffer, 0);//利用BitConvert方法把字节数组转换为整数
                Random random = new Random(seed);//以生成的整数作为随机种子
                randNum = random.Next();
                //randNum = random.Next();                
                if (randNum % 3 == 1)
                {
                    code = (char)('A' + (char)(randNum % 26));//随机大写字母
                }
                else if (randNum % 3 == 2)
                {
                    code = (char)('a' + (char)(randNum % 26));//随机小写字母
                }
                else
                {
                    code = (char)('0' + (char)(randNum % 10));//随机数字
                }
                randomCode += code.ToString();
            }
            return randomCode;
        }
        /// <summary>
        ///  发送邮件验证码
        /// </summary>
        /// <param name="MyEmailAddress">发件人邮箱地址</param>
        /// <param name="RecEmailAddress">收件人邮箱地址</param>
        /// <param name="Subject">邮件主题</param>
        /// <param name="MailContent">邮件内容</param>
        /// <param name="AuthorizationCode">邮箱授权码</param>
        /// <returns></returns>
        public static bool SendMailMessage(string MyEmailAddress, string RecEmailAddress, string Subject, string Body, string AuthorizationCode)
        {
            MailMessage mail = new MailMessage();
            mail.From = new MailAddress(MyEmailAddress);//发件人邮箱地址
            mail.To.Add(new MailAddress(RecEmailAddress));//收件人邮箱地址
            mail.Subject = Subject;//邮件标题
            mail.Body = Body;  //邮件内容  
            mail.Priority = MailPriority.High;//优先级
            SmtpClient client = new SmtpClient();//qq邮箱:smtp.qq.com;126邮箱:smtp.126.com              
            client.Host = "smtp.qq.com";
            client.Port = 587;//SMTP端口465或587
            client.EnableSsl = true;//使用安全加密SSL连接  
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.Credentials = new NetworkCredential(MyEmailAddress, AuthorizationCode);//验证发件人身份(发件人邮箱,邮箱授权码);                   
            try
            {
                client.Send(mail);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "发送失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            return true;
        }
        /// <summary>
        ///  验证QQ邮箱
        /// </summary>
        /// <param name="mail">邮箱</param>
        /// <returns></returns>
        public static bool CheckMail(string mail)
        {
            string str = @"^[1-9][0-9]{4,}@qq.com$";
            Regex mReg = new Regex(str);
            if (mReg.IsMatch(mail))
            {
                return true;
            }
            return false;
        }
        #endregion
    }

功能类已经写好了,每个方法对应有注释,不需要动,除非你要更改smtp服务器,默认QQ邮箱

窗体类代码

首先定义全局

/// <summary>
        ///  定义控件全局
        /// </summary>    
        int seconds1 = 60;//倒计时60s
        int seconds2 = 60 * 2;//验证码有效时间5分钟
        string strMailVeriCode;//验证码

获取验证码后计时事件

/// <summary>
        /// 按钮控件获取验证码后计时事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (seconds1 > 0)
            {
                seconds1--;
                btnMailVeriCode.Text = "剩余" + seconds1.ToString() + "秒";
            }
            else
            {
                timer1.Stop();
                btnMailVeriCode.Text = "获取验证码";
                btnMailVeriCode.Enabled = true;
            }
        }

此事件为第一个timer控件的事件

验证码过期后事件

/// <summary>
        /// 验证码过期事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer2_Tick_1(object sender, EventArgs e)
        {
            if (seconds2 == 0)
            {
                timer2.Stop();
                //旧的验证码过期,生成一个新的验证码
                strMailVeriCode = MailVeriCodeClass.CreateRandomMailCode(6);
            }
        }

此事件为第二个timer控件的事件

点击获取验证码(按钮点击事件)

/// <summary>
        /// 获取验证码点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnMailVeriCode_Click_1(object sender, EventArgs e)
        {
            string recEMailAddress = txtMail.Text.Trim();//收件人邮箱             
            strMailVeriCode = MailVeriCodeClass.CreateRandomMailCode(6);
            string strBody = "验证码:" + strMailVeriCode + ",2分钟内有效,请勿泄漏于他人。如非本人操作,请忽略。系统邮件请勿回复。";//邮件内容            
            string strSubject = "【极简科技】注册验证";//邮件标题
            string strMyEmailAddress = "747945307@qq.com";//发件人邮箱
            string strAuthorizationCode = "klxtvclkyfu*****";//邮箱授权码
            if (string.IsNullOrEmpty(recEMailAddress))//判断是否输入了邮箱
            {
                MessageBox.Show("请输入邮箱!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txtMail.Focus();
            }
            else if (MailVeriCodeClass.CheckMail(recEMailAddress) == false)//判断邮箱格式是否正确
            {
                MessageBox.Show("您输入的QQ邮箱有误,请重新输入!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                txtMail.Focus();
                return;
            }
            else//发送验证码
            {
                //发送
                if (MailVeriCodeClass.SendMailMessage(strMyEmailAddress, recEMailAddress, strSubject, strBody, strAuthorizationCode) == true)
                {
                    btnMailVeriCode.Enabled = false;
                    //计时器初始化              
                    timer1.Interval = 1000;
                    timer1.Start();
                    timer2.Interval = 1000;
                    timer2.Start();
                }
                else
                {
                    txtMail.Focus();
                }
            }
        }

在这三句代码配置好SMTP服务

string strSubject = "【极简科技】注册验证";//邮件标题
            string strMyEmailAddress = "747945307@qq.com";//发件人邮箱
            string strAuthorizationCode = "klxtvclkyfu*****";//邮箱授权码

但是注意,这里的邮箱授权码不是邮箱密码,而是SMTP授权码!

SMTP开启并获取授权码

网络异常,图片无法展示
|

到这然后往下看

网络异常,图片无法展示
|

  • 以QQ邮箱为例,首先开启上面箭头所指的SMTP服务,随便开一个都可以
  • 然后点击下面箭头指向的生成授权码,这个就是你的SMTP授权码

验证验证码是否正确

/// <summary>
        /// 验证码确认按钮点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnConfirm_Click_1(object sender, EventArgs e)
        {
            string mailVeriCode = txtMailVeriCode.Text.Trim();//邮箱验证码  
            //判断验证码
            if (string.IsNullOrEmpty(mailVeriCode) == true)
            {
                MessageBox.Show("请输入验证码", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txtMailVeriCode.Focus();
            }
            else if (mailVeriCode.ToLower() != strMailVeriCode.ToLower())//判断邮箱验证码是否输入正确;不区分字母大小写
            {
                MessageBox.Show("您输入的验证码有误!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                txtMailVeriCode.Focus();
                return;
            }
            else
            {
                MessageBox.Show("验证成功!");
            }
        }

这里是确认按钮的点击事件,判断验证码是否准确无误

运行实例

到这就完成了,看看效果

网络异常,图片无法展示
|

相关文章
|
6月前
|
C#
C# WinForm发送Email邮件
C# WinForm发送Email邮件
C# WinForm发送Email邮件
|
6月前
|
网络协议 关系型数据库 Shell
gitlab-设置邮件SMTP以及GitLab收不到邮件的问题
gitlab-设置邮件SMTP以及GitLab收不到邮件的问题
481 1
|
17天前
|
C# 数据安全/隐私保护
C#使用 MailKit 收发邮件
【10月更文挑战第15天】在C#中使用MailKit库可轻松实现邮件的发送与接收。首先需通过NuGet包管理器安装MailKit,并编写代码设置发件人、收件人、邮件主题及正文,连接邮件服务器并认证后即可发送邮件。接收邮件时,同样需连接服务器并认证,然后打开收件箱遍历读取邮件信息。整个过程需根据实际邮件服务器配置相应参数。
|
4月前
|
监控 网络协议 网络安全
SMTP操作使用详解并通过python进行smtp邮件发送示例
SMTP操作使用详解并通过python进行smtp邮件发送示例
109 3
|
4月前
|
监控 数据安全/隐私保护
Smtp邮件发送失败情况汇总
Smtp邮件发送失败情况汇总
193 0
|
5月前
【简洁】三步开启QQ邮箱SMTP服务并获取授权码
【简洁】三步开启QQ邮箱SMTP服务并获取授权码
818 0
|
5月前
|
前端开发 Java 网络安全
基于Java Socket实现的SMTP邮件客户端 - 全面支持SSL, TLS
基于Java Socket实现的SMTP邮件客户端 - 全面支持SSL, TLS
53 0
|
6月前
|
API 网络安全 数据安全/隐私保护
SMTP邮件邮箱API发送邮件的方法和步骤
使用SMTP邮件邮箱API(如AokSend)发送邮件涉及6个步骤:获取SMTP服务器地址和端口,进行身份验证,构建邮件内容,连接到服务器,发送邮件及处理结果。例如,Gmail的SMTP服务器地址是smtp.gmail.com,端口587。此方法适用于程序化发送邮件,确保安全并支持大规模发信服务。
|
6月前
|
存储 安全 API
IMAP/SMTP服务之间的区别和联系
IMAP与SMTP是电子邮件协议,前者用于接收和管理邮件,支持多设备同步,后者专注于发送邮件。两者协同工作,涉及邮件服务器间的通信,旨在提升效率和安全性。正确配置邮件客户端的IMAP和SMTP设置(如服务器地址、端口和安全选项)是关键。同时,使用安全连接和定期更换密码能保障邮件安全。AokSend提供触发式SMTP/API接口,高触达发信服务,强调独立IP和服务器的安全性。
|
人工智能
邮件开发:一些常见邮箱的POP3及SMTP服务器地址
邮件开发:一些常见邮箱的POP3及SMTP服务器地址
331 0