vapor smtp發(fā)送郵件provider

最經(jīng)幾天一直在拜讀Vapor中service的源碼葫录,連續(xù)幾天上班途中和下班之后都是在翻看源碼帐萎,從剛開始感覺云山霧繞到逐漸清晰


server內(nèi)部介紹

而最終內(nèi)部的所有被注冊的server都會通過下面來進(jìn)行實(shí)例化注冊到系統(tǒng)中來使用


被注冊service最終實(shí)例化

看了這么久我們根據(jù)最新發(fā)送郵件的需求自己寫個service拉庵,在此我們通過Provider來實(shí)現(xiàn)IBM swift SMTP
在此我們分為SKSmtpProviderSKSmtpConfig兩部分,其中SKSmtpConfig為SMTP的信息配置項(xiàng)而SKSmtpProvider為真實(shí)的Server實(shí)現(xiàn)部分
先上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實(shí)例帆离,才能使用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來實(shí)現(xiàn)service則必須實(shí)現(xiàn)Provider 協(xié)議

Provider官方注釋

然后是我們SMTP的server實(shí)現(xiàn),對于service協(xié)議渗蟹,就只是一個類型聲明: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其實(shí)就是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
    }
}

所有的都已經(jīng)實(shí)現(xiàn)了拌滋,接下來就是使用了
1 系統(tǒng)的configure中注冊對應(yīng)的Provider

let smtpConfig =  SKSmtpConfig.init(hostname: "", email: "", password: "")
    
    services.register(smtpConfig)
    try services.register(SKSmtpProvider())

2 在網(wǎng)絡(luò)請求中實(shí)現(xiàn)

 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")
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朴沿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赌渣,老刑警劉巖魏铅,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異坚芜,居然都是意外死亡览芳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門鸿竖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沧竟,“玉大人,你說我怎么就攤上這事缚忧∥虮茫” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵闪水,是天一觀的道長糕非。 經(jīng)常有香客問我,道長球榆,這世上最難降的妖魔是什么朽肥? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮持钉,結(jié)果婚禮上鞠呈,老公的妹妹穿的比我還像新娘。我一直安慰自己右钾,他們只是感情好蚁吝,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舀射,像睡著了一般窘茁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脆烟,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天山林,我揣著相機(jī)與錄音,去河邊找鬼邢羔。 笑死驼抹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拜鹤。 我是一名探鬼主播框冀,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼敏簿!你這毒婦竟也來了明也?” 一聲冷哼從身側(cè)響起宣虾,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎温数,沒想到半個月后绣硝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撑刺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年鹉胖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片够傍。...
    茶點(diǎn)故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡甫菠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出王带,到底是詐尸還是另有隱情,我是刑警寧澤市殷,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布愕撰,位于F島的核電站,受9級特大地震影響醋寝,放射性物質(zhì)發(fā)生泄漏搞挣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一音羞、第九天 我趴在偏房一處隱蔽的房頂上張望囱桨。 院中可真熱鬧,春花似錦嗅绰、人聲如沸舍肠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翠语。三九已至,卻和暖如春财边,著一層夾襖步出監(jiān)牢的瞬間肌括,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工酣难, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谍夭,地道東北人。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓憨募,卻偏偏與公主長得像紧索,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子菜谣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理齐板,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,791評論 25 707
  • 用兩張圖告訴你甘磨,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料橡羞? 從這篇文章中你...
    hw1212閱讀 12,699評論 2 59
  • 考試,復(fù)習(xí)济舆,寫詩卿泽,接著復(fù)習(xí)! 1. 你不在的日子 我像夜晚的月亮 被很多星星擁擠滋觉,但很孤獨(dú) 2. 圖書館的書是孤獨(dú)...
    云兒飄是我閱讀 87評論 0 3
  • 上周遲交了作業(yè)签夭、寫作質(zhì)量也很差,還被組長點(diǎn)了名椎侠。我很懊惱自己第租,當(dāng)初加入007時(shí)的雄心壯志哪里去了,堅(jiān)持了才兩個月我纪,...
    skyaone閱讀 185評論 0 1