专栏首页大话swiftvapor smtp发送邮件provider

vapor smtp发送邮件provider

最经几天一直在拜读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")

```

本文分享自微信公众号 - 大话swift(gh_ca2266b7cab0),作者:YuLongLi

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • QuickSort BinaryTree`s deep LeetCode~ListNode

    init(_ value:T, leftNode: Node<T>?, rightNode: Node<T>? ) {

    大话swift
  • gin框架之jwt

    JWT (JSON Web Token) 是一种规范。这个规范允许我们使用JWT在用户和服务器之间安全传递信息.jwt分3个部分,Header 头部、Paylo...

    大话swift
  • vapor 之 cache记录

    为了后续修改方便我们进行了alias ```typealias IACache = SQLiteCache```

    大话swift
  • AFNetworking框架分析(二)——AFURLSessionManager(上)

    AFURLSessionManager 这个类是AFN框架的核心类,基本上通过它来实现了大部分核心功能。负责请求的建立、管理、销毁、安全、请求重定向、请求重启等...

    我只不过是出来写写代码
  • python项目练习三:万能的XML

    这个项目的名称与其叫做万能的XML不如叫做自动构建网站,根据一份XML文件,生成对应目录结构的网站,不过只有html还是太过于简单了,如果要是可以连带生成css...

    the5fire
  • PXE 模式启动 CoreOS

    本文是对 CoreOS 官方文档 Booting with PXE 的翻译与补充。 安装配置 PXE 服务器 安装配置 PXE 服务器请查看本博客文章 Linu...

    康怀帅
  • 神经网络实践之情感分类神经网络实践之情感分类

    最近报名了Udacity的深度学习基石,这是第二周的课程,主要是介绍了运用神经网络进行情感分类,课程中是对英文进行了分类,我这边改为了中文。 首先是中文切词,...

    zhuanxu
  • 分页功能

    py3study
  • 说说地图中的聚类

    虽然Openlayers4会有自带的聚类效果,但是有些时候是不能满足我们的业务场景的,本文结合一些业务场景,讲讲地图中的聚类展示。

    lzugis
  • Python实现子类调用父类方法

    这是因为尽管Student类继承了Person类,但是并没有调用父类的__init__()方法,那么怎样调用父类的方法呢? 有如下两种解决方案:

    用户2936342

扫码关注云+社区

领取腾讯云代金券