接上節(jié)發(fā)送郵件敞贡,這次我們結(jié)合數(shù)據(jù)庫實(shí)現(xiàn)發(fā)送郵件驗(yàn)證碼
我們假設(shè)的是用戶注冊(cè)驗(yàn)證碼:
首先郵箱唯一授滓,其次驗(yàn)證碼有有效期默認(rèn)一天
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{
/// 郵箱驗(yàn)證入庫
///
/// - Parameters:
/// - email: 接受驗(yàn)證碼的郵箱
/// - code: 隨機(jī)驗(yàn)證碼 默認(rèn)6位數(shù)字
/// - expri: 有效期默認(rèn)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 "您的確認(rèn)碼已經(jīng)發(fā)到:\(self.email) 確認(rèn)碼是:\(verfiyCode) 將在\(expri/(24*60*60))天過期"
}
}
extension SKRegistVerfiy: All{}
All是個(gè)組合protocol:typealias All = Migration&Content&Parameter
我們需要在configure.swift中配置:migrations.add(model: SKRegistVerfiy.self, database: .sqlite)
注冊(cè)驗(yàn)證碼發(fā)送
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 {//已經(jīng)存在
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: "注冊(cè)碼確認(rèn)郵件", 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: