vapor 邮件发送确认码

接上节发送邮件,这次我们结合数据库实现发送邮件验证码
我们假设的是用户注册验证码:

WX20181006-121454@2x.png
WX20181006-121412@2x.png

首先邮箱唯一,其次验证码有有效期默认一天

struct SKRegistVerfiy: SQLiteModel {
    var id: Int?
    var email: String 
    var verfiyCode: String =  VerfiyCodeRender.renderInstance.default
    var create: TimeInterval = Date().timeIntervalSince1970
    var expri: Double = 60 * 60 * 24
}
extension SKRegistVerfiy{
    
    /// 邮箱验证入库
    ///
    /// - Parameters:
    ///   - email: 接受验证码的邮箱
    ///   - code: 随机验证码 默认6位数字
    ///   - expri: 有效期默认1天
    init(email: String, verfiyCode code:String = VerfiyCodeRender.renderInstance.default, expri: Double = 24 * 60 * 60){
        let time = Date().timeIntervalSince1970
        self.init(id: nil,
                  email: email,
                  verfiyCode: code,
                  create: time,
                  expri: expri)
    }
}
extension SKRegistVerfiy{
    var isCodeAvailable: Bool{
        return Date().timeIntervalSince1970 - create <= expri
    }
    
    var message:String{
        return "您的确认码已经发到:\(self.email) 确认码是:\(verfiyCode) 将在\(expri/(24*60*60))天过期"
    }
    
}

extension SKRegistVerfiy: All{}

All是个组合protocol:typealias All = Migration&Content&Parameter

我们需要在configure.swift中配置:migrations.add(model: SKRegistVerfiy.self, database: .sqlite)

注册验证码发送

router.get("email") { req -> EventLoopFuture<String> in
        struct Email: Content {
            var email: String
        }
        let email: Email = try req.query.decode(Email.self)
        
        return    SKRegistVerfiy.query(on: req).filter(\.email, .equal, email.email).first().flatMap({ (verfiy) -> EventLoopFuture<String> in
            
            
            if let v = verfiy {//已经存在
                let result = req.eventLoop.newPromise(String.self)
                
                result.succeed(result: v.emailExistMessage)
                return result.futureResult
                
            }else{
                
                let reg =  SKRegistVerfiy.init(email: email.email)
                return  reg.save(on: req).flatMap({ (skVer) -> EventLoopFuture<String> in
                    
                    let smtp: SMTP = SMTP.init(hostname: "smtp.163.com", email: "lylapp@163.com", password: "301324lee")
                    let fromUser =  Mail.User(name: "注册码确认邮件", email: "lylapp@163.com")
                    let email = skVer.email
                    let toUser = Mail.User.init(email: email)
                    
                    let mail = Mail(from: fromUser
                        , to: [toUser]
                        , cc: [], bcc: []
                        , subject: "欢迎®️"
                        , text: skVer.message
                        , attachments: []
                        , additionalHeaders: [:])
                    let result = req.eventLoop.newPromise(String.self)
                    
                    smtp.send(mail, completion: { (error) in
                        print(error as Any)
                        if let error = error {
                            result.fail(error: error)
                        }else{
                            result.succeed(result: skVer.message)
                        }
                    })
                    return result.futureResult
                })
            }
        })
    }

查询中输出的sql log:

WX20181006-122354@2x.png

整个是为了学习和理清思路,因此我们忽略了安全性:比如邮箱的明文存储

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,215评论 22 257
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,860评论 18 139
  • 已经同步到gitbook,想阅读的请转到gitbook: Django 1.10 中文文档 This tutori...
    leyu阅读 2,725评论 3 13
  • 感恩青旅的小姐姐告诉我苏州的游玩地点。 感恩自己能独自一人走了很远一条路去到博物馆。 感恩排队的时侯天下雨了,前面...
    爱眉小札夏大宝阅读 162评论 0 0
  • 这一课,没有人教过 空茫的眼神浮肿的手 凑近耳朵亲亲额头 就到这里吧! 放下,放下,放下感应的密码 注视,注视,那...
    田下阅读 156评论 0 0