LiveUI MailCore

Slack Jenkins Platforms Swift Package Manager Swift 4 Vapor 3

用于 Mailgun、SendGrid 或 SMTP 等多种邮件服务的邮件包装器

特性

安装

只需将以下行添加到您的 Package.swift 文件中。

.package(url: "https://github.com/LiveUI/MailCore.git", .branch("master"))

用法

用法非常简单!

1/3) 配置

首先创建您的客户端配置

Mailgun

let config = Mailer.Config.mailgun(key: "{mailgunApi}", domain: "{mailgunDomain}", region: "{mailgunRegion}")

SendGrid

let config = Mailer.Config.sendGrid(key: "{sendGridApiKey}")

SMTP

使用 SMTP 结构体作为处理 SMTP 服务器的句柄

let smtp = SMTP(hostname: "smtp.gmail.com",     // SMTP server address
                   email: "user@gmail.com",     // username to login
                password: "password")           // password to login
                
let config = Mailer.Config.smtp(smtp)

使用 TLS 的 SMTP

SMTP 结构体的所有参数

let smtp = SMTP(hostname: String,
                   email: String,
                password: String,
                    port: Int32 = 465,
                  useTLS: Bool = true,
        tlsConfiguration: TLSConfiguration? = nil,
             authMethods: [AuthMethod] = [],
             accessToken: String? = nil,
              domainName: String = "localhost",
                 timeout: UInt = 10)
                 
let config = Mailer.Config.smtp(smtp)

2/3) 注册服务

在您的应用程序的 configure 方法中注册并配置服务。

Mailer(config: config, registerOn: &services)

Mailer.Config 是一个 enum,您可以从中选择要使用的任何集成服务

3/3) 发送电子邮件

let mail = Mailer.Message(from: "admin@liveui.io", to: "bobby.ewing@southfork.com", subject: "Oil spill", text: "Oooops I did it again", html: "<p>Oooops I did it again</p>")
return try req.mail.send(mail).flatMap(to: Response.self) { mailResult in
    print(mailResult)
    // ... Return your response for example
}

测试

Mailcore 提供了一个 MailCoreTestTools 框架,您可以将其导入到您的测试中以获取 MailerMock

要注册并可能覆盖任何现有的“真实” Mailer 服务,只需使用您的服务初始化 MailerMock

// Register
MailerMock(services: &services)

// Retrieve in your tests
let mailer = try! req.make(MailerService.self) as! MailerMock

MailerMock 将存储上次使用的结果以及收到的消息和请求。 moct 的结构如下所示

public class MailerMock: MailerService {

    public var result: Mailer.Result = .success
    public var receivedMessage: Mailer.Message?
    public var receivedRequest: Request?

    // MARK: Initialization

    @discardableResult public init(services: inout Services) {
        services.remove(type: Mailer.self)
        services.register(self, as: MailerService.self)
    }

    // MARK: Public interface

    public func send(_ message: Mailer.Message, on req: Request) throws -> Future<Mailer.Result> {
        receivedMessage = message
        receivedRequest = req
        return req.eventLoop.newSucceededFuture(result: result)
    }

    public func clear() {
        result = .success
        receivedMessage = nil
        receivedRequest = nil
    }

}

支持

加入我们的 Slack,频道 #help-boost 来... 嗯,获得帮助 :)

企业应用商店

Einstore 的核心包,这是一个完全开源的、用 Swift 编写的企业应用商店!

其他核心包

已实现的第三方提供商

代码贡献

我们热爱 PR,多多益善... 因此,如果您有有趣的改进、错误修复或新功能,请不要犹豫与我们联系。 如果您在开始开发之前不确定某些事情,您可以随时通过我们的 Slack 联系我们的开发和产品团队。

作者

Ondrej Rafaj (@rafiki270 在 Github, Twitter, LiveUI SlackVapor Slack)

许可

MIT 许可证,请参阅 LICENSE 文件了解更多详情。