vapor smtp发送邮件provider

2019-07-04 11:03:11 浏览数 (1)

最经几天一直在拜读Vapor中service的源码,连续几天上班途中和下班之后都是在翻看源码,从刚开始感觉云山雾绕到逐渐清晰

)

而最终内部的所有被注册的server都会通过下面来进行实例化注册到系统中来使用

看了这么久我们根据最新发送邮件的需求自己写个service,在此我们通过Provider来实现(基于IBM开源的邮件发送服务:https://github.com/IBM-Swift/Swift-SMTP)

在此我们分为**SKSmtpProvider**和**SKSmtpConfig**两部分,其中SKSmtpConfig为SMTP的信息配置项而SKSmtpProvider为真实的Server实现部分

先上Provider的代码

```

class SKSmtpProvider: Provider {

func register(_ services: inout Services) throws {

services.register { (container) -> SKSmtp in

let config = try container.make(SKSmtpConfig.self)

assert(config != nil, "选注册SKSmtpConfig实例,才能使用SKSmtp")

return SKSmtp.init(config: config)

}

}

func didBoot(_ container: Container) throws -> EventLoopFuture<Void> {

let result = container.eventLoop.newPromise(Void.self)

result.succeed()

return result.futureResult

}

}

```

对于使用Provider来实现service则必须实现```Provider 协议```

![Provider官方注释]

然后是我们SMTP的server实现,对于service协议,就只是一个类型声明:```public protocol Service {}```

```

class SKSmtp : Service {

fileprivate var smtp: SMTP?

init(config: SKSmtpConfig) {

self.smtp = SMTP.init(hostname: config.hostname, email: config.email, password: config.password, port: config.port, useTLS: config.useTLS, tlsConfiguration: config.tlsConfiguration, authMethods:config.authMethods, domainName: config.domainName, timeout: config.timeout)

}

/// Send an email.

///

/// - Parameters:

/// - mail: `Mail` object to send.

/// - completion: Callback when sending finishes. `Error` is nil on success. (optional)

public func send(_ mail: Mail, completion: ((Error?) -> Void)? = nil) {

smtp?.send(mail, completion: completion)

}

public func send(_ mails: [Mail],

progress: Progress = nil,

completion: Completion = nil) {

smtp?.send(mails, progress: progress, completion: completion)

}

}

```

最后是Config,很简单Config其实就是SMTP的配置信息

```

public struct SKSmtpConfig : Service{

var hostname: String

var email: String

var password: String

var port: Int32 = 465

var useTLS: Bool = false

var tlsConfiguration: SwiftSMTP.TLSConfiguration?

var authMethods:[ AuthMethod] = []

var domainName: String = "localhost"

var timeout: UInt = 10

init(hostname: String, email: String, password: String, port: Int32 = 465, useTLS:Bool = false,tlsConfiguration:SwiftSMTP.TLSConfiguration? = nil, authMethods:[ AuthMethod] = [], domainName: String = "localhost", timeout: UInt = 10) {

self.hostname = hostname

self.email = email

self.password = password

self.port = port

self.useTLS = useTLS

self.tlsConfiguration = tlsConfiguration

self.domainName = domainName

self.timeout = timeout

}

}

```

所有的都已经实现了,接下来就是使用了

1 系统的configure中注册对应的Provider

```

let smtpConfig = SKSmtpConfig.init(hostname: "", email: "", password: "")

services.register(smtpConfig)

try services.register(SKSmtpProvider())

```

2 在网络请求中实现

```

public func regist(req: Request)throws-> EventLoopFuture<String>{

let smtp: SKSmtp = try req.make(SKSmtp.self)

smtp.send(<#T##mail: Mail##Mail#>, completion: <#T##((Error?) -> Void)?##((Error?) -> Void)?##(Error?) -> Void#>)

```

**Vapor集成使用**

```

.package(url: "https://github.com/skeyboy/SKSmtp.git", from:"0.0.1")

```

0 人点赞