8.邮件发送功能

这篇具有很好参考价值的文章主要介绍了8.邮件发送功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这里想补充下上个文章,感觉有点不太行。因为每次设计新的表结构就要去更新一下,所以,干脆随着我要做的功能去展示我的表结构设计,最终再把所有的表结构包括sql语句统计出来,感觉这样更新会方便很多~

这个文章主要是发送邮件的功能。之前提过,我不是一下子把后端全部完成,然后再一下子搞定后端。所以我前后端是要一起做,然后去完善接口功能。

登录注册这个功能,90%网站都需要。可以不用,但是不能没有。本篇文章主要是实现注册的验证码发放功能(邮件or手机号)。

因为发短信得收费,咳咳,所以这里先做的邮件发送验证码。这个在网络冲浪的时候要注册某些网站账号的时候一般都会遇上把?之前看有的朋友是后台返回一张验证码的图片,这个我后面应该也会做一下,但我觉得意义不是特别大。就跟死验证一样,这样我怎么判定你输入的邮箱是否是正确真实可用的呢?我不想给数据库搞一堆脏数据,麻烦

之前微软是自带一个邮箱发送的库的,现在好像弃用了,虽然还可以用。但是微软推荐了一个新的开源的第三方库MailKit。使用起来相对来说,代码减少了不少,感觉挺好用的,官网也有案例,所以不会细说,官网的很详细,我也不想写博客都是搬运官网的。我的代码会加上自己的注释。哪怕你不看官网,跟着我这个流程走就100%没问题。

正文开始~ 

先展示下,验证码表的数据库结构:注释说明都有应该无需细说了

8.邮件发送功能

 建表SQL

8.邮件发送功能8.邮件发送功能
create table  dbo.AutoCode
(
       Id                INT identity(1, 1) not null  /*编号*/,
       Code              VARCHAR(20) not null  /*验证码*/,
       Phone             VARCHAR(20) null  /*手机号*/,
       Email             VARCHAR(100) null  /*邮箱*/,
       ExpDate           FLOAT not null  /*过期时间*/,
       CreateDate        DATETIME default getdate() null  /*创建日期*/,
       UpdateDate        DATETIME default getdate() null  /*修改日期*/
);
alter  table dbo.AutoCode
       add constraint PK_AutoCode_Id primary key (Id);
EXEC sp_addextendedproperty 'MS_Description', '验证码表', 'user', dbo, 'table', AutoCode, NULL, NULL;
EXEC sp_addextendedproperty 'MS_Description', '编号', 'user', dbo, 'table', AutoCode, 'column', Id;
EXEC sp_addextendedproperty 'MS_Description', '验证码', 'user', dbo, 'table', AutoCode, 'column', Code;
EXEC sp_addextendedproperty 'MS_Description', '手机号', 'user', dbo, 'table', AutoCode, 'column', Phone;
EXEC sp_addextendedproperty 'MS_Description', '邮箱', 'user', dbo, 'table', AutoCode, 'column', Email;
EXEC sp_addextendedproperty 'MS_Description', '过期时间 (当前时间+过期时间)的时间戳', 'user', dbo, 'table', AutoCode, 'column', ExpDate;
EXEC sp_addextendedproperty 'MS_Description', '创建日期 默认为当前时间', 'user', dbo, 'table', AutoCode, 'column', CreateDate;
EXEC sp_addextendedproperty 'MS_Description', '修改日期 默认为当前时间', 'user', dbo, 'table', AutoCode, 'column', UpdateDate;
View Code

 使用SQLsugar生成实体到FastEasy.Model类库中。

这里插一句吧,前面不是用T4模板搞了个生成仓储模式4个类的代码生成吗,我可能目前对于T4还是不是很会,在T4模板使用第三方库的时候会报一个找不到netstand程序集的问题,我目前很疑惑。然后看了下别人的代码生成器,好像通过后台管理系统就可以,那目前可能我弄的这个还不是很好,但是也极大的减少了一些工作量,以后我会再学习下这块儿,也搞个更方便的代码生成器。T4模板确实有一些局限性……

那我是又在base基类添加了一个方法,CreateModels。我这个数据库空空如也,所以选择了全部生成,当然也可以根据条件去筛选生成,甚至重命名,修改字段名,诸如此类的。这是sqlsugar提供的,真的很强大,可以去学习一下。中秋的时候阿妮亚又更新了一个功能,可以把增删改写成一个方法,但我目前还是没看,只是看到了介绍,这个以后再去看一下,nb~

8.邮件发送功能

代码只有一句:第一个参数是生成的目录路径,第二个是命名空间
    public void CreateModels()
    {
        db.DbFirst.IsCreateAttribute().CreateClassFile(@"D:\FastEasy\API\FastEasy.Model\Models\", "FastEasy.Model.Models");
    }

 如何使用呢。因为是要继承base基类,所以得有个实体,所以我就手动创建了一个空的base类。然后用T4代码生成器分别生成了仓储层和服务层的接口和实现类。主要是避免没有泛型传入,注入的时候报错。然后直接调用这个方法就好了,base类在这里没有作用!只是避免注入解析的时候不报错!

其实应该稍微感觉的出来这样好像有点麻烦……无奈现在手里活不够多,经验欠缺,暂时没有想到别的思路,但我们有代码生成器,终归也麻烦不到哪去,一分钟就搞定了

8.邮件发送功能

 到这里,我们生成了实体,然后通过T4代码生成器,同样根据数据库生成了各自的仓储层和服务层。这里就不得不提一个弊端了。但是这只能说目前的,就是要先生成实体,因为T4模板不需要运行就可以生成,所以没实体的话,依赖注入会找不到实体而报错,这样就没法运行程序生成实体了。除非就是说,咱们搞个控制台程序单独运行下?反正上边也提到了,这个T4我弄的确实不到位,只是最基础的一些功能,还需继续完善呀~~~


 文章来源地址https://www.toymoban.com/news/detail-711804.html

言归正传,这篇文章主要说的是发送邮件!

上面简单提到了,我们使用的是微软推荐的一个第三方库:MailKit+MimeKit。NuGet管理器自行下载。

MailKit是用于向邮箱服务端发送消息的。

MimeKit则是创建邮件实例的(包括并不局限:发送人接收人邮件内容等……)。

再简单点理解就是,通过MailKIt把MimeKit创建的邮件实例发送给邮箱服务端,然后根据你的邮件实例解析发送相应的邮件。似乎我这么说有点绕嘴,但我是这么理解的。甚至一开始我都很好奇,为什么要分成两个包安装呀,或者你内置进去呗?不过他这些个库不仅仅支持你发送邮件,好像还能下载邮件,删除邮件,挺多功能的,确实np,但这些我好像也用不上,有兴趣的同学就自行学习吧~

实现注册发送邮件验证码的功能。其实很简单。首先搞清楚,我们需要的情景是如何的:

  1. 用户填写邮箱
  2. 发送验证码到邮箱
  3. 正则匹配输入的是否正确格式
  4. 生成随机验证码
  5. 新增到数据库
  6. 返回结果给前端成功还是失败

正则也没啥可说的,因为你百度邮箱正则就找到了匹配规则拿过来用就好了。随机验证码这个更没什么可说的Random……当然你可以搞更复杂的,但我觉得我这样应该足够了。

我把这两个方法写在了Common类库中。因为他们不涉及业务逻辑,是可公用的。因此做成静态类方法直接调用就好。

        /// <summary>
        /// 检验是否手机号
        /// </summary>
        /// <param name="number">号码</param>
        /// <returns></returns>
        public static bool IsPhone(string number)
        {
            string phoneRegex = @"^1\d{10}$";
            return Regex.IsMatch(number, phoneRegex);
        }

        /// <summary>
        /// 检验是否邮箱
        /// </summary>
        /// <param name="number">号码</param>
        /// <returns></returns>
        public static bool IsEmail(string number)
        {
            string emailRegex = @"^\S+@\S+\.\S+$";
            return Regex.IsMatch(number, emailRegex);
        }
        /// <summary>
        /// 创建一个4位随机验证码
        /// </summary>
        /// <returns></returns>
        public static string CreateRandomCode()
        {
            int num = 4;
            const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; // 根据需要修改字符集合
            Random random = new();
            char[] code = new char[num];

            for (int i = 0; i < num; i++)
            {
                code[i] = chars[random.Next(chars.Length)];
            }
            return new string(code);
        }

 

包括发送邮件的功能,也理所应当的放在Common类库中。目前因为针对发送邮件的功能,可能封装的方法自由度不高,我贴的代码只做参考,可以根据自己需求完善
邮件实例是用MimeKit中的MimeMessage创建的。里面包含了发送人,接收人,邮件内容等。原本我想传递这个类型的参数,但是官方的这个实例中,发送人和接收人是不能直接赋值的,要Add添加进去。这对我们来说还是有点麻烦的 ,主要是传参太麻烦了。所以自己创建了一个新的实体类型Mime,主要用来传递参数。
using MimeKit;

namespace FastEasy.Common.Extension.Mail
{
    public class Mime
    {
        /// <summary>
        /// 主题
        /// </summary>
        public string Subject { get; set; }

        /// <summary>
        /// 消息内容
        /// </summary>
        public TextPart Body { get; set; }

        /// <summary>
        /// 发送人,默认为“官方”
        /// </summary>
        public MailboxAddress From { get; set; } = new MailboxAddress("神里凌华", "XXXXXX@163.com");

        /// <summary>
        /// 邮箱SMTP授权码
        /// </summary>
        public string Code { get; set; } = "XXXXX";

        /// <summary>
        /// 接收人
        /// </summary>
        public MailboxAddress To { get; set; }

        /// <summary>
        /// 465加密25不加密
        /// </summary>
        public  int Port { get; set; } = 465;
    }
}

 发送邮件方法:通过上面的注释应该都可以看懂,所以不过多解释废话了

        /// <summary>
        /// 发送邮件
        /// </summary>
        /// <param name="mime">邮件消息体</param>
        /// <returns></returns>
        public static async Task<bool> SendMail(Mime mime)
        {
            //邮件实例
            MimeMessage message = new()
            {                
                Subject = mime.Subject,
                Body = mime.Body,
            };
            message.To.Add(mime.To);
            message.From.Add(mime.From);
            try
            {
                using var client = new SmtpClient();
                client.Connect("smtp.163.com", mime.Port, mime.Port == 465);
                client.Authenticate(mime.From.Address, mime.Code);
                await client.SendAsync(message);
                client.Disconnect(true);
            }
            catch
            {
                return false;
            }
            return true;
        }

 

由此看来,该功能并未涉及程序本身的业务逻辑,因此只要在API程序层调用相应的公共方法,然后调用基类的新增方法即可完成。
API程序层代码:
 
        /// <summary>
        /// 发送验证码
        /// </summary>
        /// <param name="user">邮箱或者手机号</param>
        /// <returns></returns>
        [HttpPost]
        [SwaagerRoute(SwaggerVersion.FastEasy, "CreateCode")]
        public async Task<ResultDto> CreateCode(string user)
        {
            var result = new ResultDto();
            var code = RandomCode.CreateRandomCode();

            if (RegexMatch.IsPhone(user))
            {
                result.State = false;
                result.Message = "暂不支持手机号注册";
            }
            else if (RegexMatch.IsEmail(user))
            {
                var mime = new Mime
                {
                    Body = new MimeKit.TextPart()
                    {
                        Text = code
                    },
                    Subject = "验证码",
                    To = new MimeKit.MailboxAddress(user, user),
                };
                var autocode = new AutoCode
                {
                    Code = code,
                    CreateDate = DateTime.Now,
                    Email = user,
                    ExpDate = DateTimeOffset.Now.AddMinutes(10).ToUnixTimeSeconds(),
                    UpdateDate = DateTime.Now
                };
                if (await EmailKit.SendMail(mime) && await service.CreateEntityAsync(autocode))
                {
                    result.State = true;
                    result.Message = "发送成功请查收";
                }
                else
                {
                    result.State = false;
                    result.Message = "发送失败";
                }
            }
            else
            {
                result.State = false;
                result.Message = "请输入正确的注册号码";
            };
            return result;
        }

我承认我废话太多了,我本意想讲的详细点……看效果:

8.邮件发送功能

 掰掰,中秋国庆快乐……我还没买到票……

 
 
 

 

到了这里,关于8.邮件发送功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spring boot 集成邮件发送功能

    一、首先到QQ邮箱申请开启POP3、SMTP协议 二、安装依赖 三、配置文件 四、如果需要发送模板的邮件,则在/templates/目录下建立email.html文件 五、如果需要异常打印信息的话新建自定义异常类BusinessException 六、如果需要发送附件的话,则新建网络文件转流类 七、测试方法

    2024年01月21日
    浏览(41)
  • Spring Email实现邮件发送功能

    (本篇内容是博主在学习“牛客社区”这个项目时的笔记整理,为了方便自己以后查看,希望也能帮助到其他人。若有不恰当的地方还望指正~) 目录 一、邮箱设置 1. 开启POP3/SMTP服务,获取授权码 二、 使用Spring Email 1. 导入jar包  2. 在项目的propertites文件中写入如下配置 三、

    2023年04月25日
    浏览(43)
  • 【Python】Python 实现自动发送邮件功能

    在Python中,我们可以使用smtplib库来发送邮件。Python 是一种高级编程语言,而邮件是我们日常生活和工作中经常使用的通讯方式之一。Python 常用的邮件发送库有 smtplib、email、yagmail 等。它们都能够实现自动化发送邮件。通过这些库,我们可以简单地编写一段代码,实现自动化

    2024年02月11日
    浏览(45)
  • Django-配置邮箱功能(一):使用django自带的发送邮件功能

    以QQ邮箱为例子: 1、进入到设置,找到账户 2、开启POP3等服务,点击管理服务 3、进入管理服务,生成授权码  4、按照要求发送短信就可以了 5、将授权码复制保存,离开界面就看不到了 1、settings.py配置邮箱服务  2、在视图函数给邮箱发送短信  3、调用请求的api,测试是否

    2024年02月13日
    浏览(65)
  • 帝国CMS商城系统实现在线支付后发送订单邮件提醒功能

    本文实例讲述了帝国CMS商城系统实现在线支付后发送订单邮件提醒功能。分享给大家供大家参考,具体如下: 帝国CMS是个强大的内容管理系统,其商城的功能也很强大,当用户下单,支付后我们怎么知道有用户下单了呢?因为我们不能时时刻刻都在网站后台,不断的刷新页面去看

    2023年04月24日
    浏览(56)
  • Spring Schedule:Spring boot整合Spring Schedule实战讲解定时发送邮件的功能

    🎉🎉 欢迎光临,终于等到你啦 🎉🎉 🏅我是 苏泽 ,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏 《Spring 狂野之旅:从入门到入魔》 🚀 本专栏带你从Spring入门到入魔   这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://suzee.blog.

    2024年03月14日
    浏览(112)
  • Go:实现SMTP邮件发送订阅功能(包含163邮箱、163企业邮箱、谷歌gmail邮箱)

    需求很简单,就是用户输入自己的邮箱后,使用官方邮箱给用户发送替邮件模版 邮件模版类似如下图发来的欢迎加入的模版 这里我们使用html格式存储模版,上图源码如下 选择好官方邮箱来开启smtp服务,这里我测试验证了163邮箱、163企业邮箱、谷歌gmail邮箱和腾讯企业邮箱(

    2024年02月08日
    浏览(71)
  • 足够详细的java邮件发送功能(基于QQ邮箱,包含踩过的坑及解决办法!!)

      由于公司最近有业务需求,需要实现批量发送邮件到指定邮箱的功能,就写了一个小的工具类,开发过程中经历了踩坑然后优化,感觉这个功能还是有些细节还是要注意的,值得写文记录一下,有在开发中碰到相同问题的各位朋友可以参考一下,希望对各位能有所帮助!

    2024年02月07日
    浏览(59)
  • 【论坛java项目】第二章 Spring Boot实践,开发社区登录模块:发送邮件、开发注册功能、会话管理、生成验证码、开发登录、退出功能、

    😀如果对你有帮助的话😊 🌺为博主点个赞吧 👍 👍点赞是对博主最大的鼓励😋 💓爱心发射~💓 bofryuzursekbiab——密码 访问邮箱域名 邮箱端口 账号 密码 协议 详细配置 JavaMailSender 是 Spring Email 的核心组件,负责发送邮件 MimeMessage 用于封装邮件的相关信息 MimeMessageHelper 用

    2024年02月06日
    浏览(57)
  • 微信小程序的订阅消息是一个允许开发者向用户发送重要通知的功能。这里为您展示如何实现小程序订阅消息的基本步骤和代码示例

    步骤 1: 获取模板 ID 首先,您需要登录微信公众平台,进入「小程序管理」后台,找到“设置” “开发设置” “订阅消息”,然后选择并配置所需的模板,记录模板 ID。 步骤 2: 小程序前端请求订阅 在小程序的某个页面或组件中,当用户执行某个操作(例如点击按钮)时,可

    2024年02月04日
    浏览(93)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包