diff --git a/Sources/MailCore/Extensions/Request+Mail.swift b/Sources/MailCore/Extensions/Request+Mail.swift index 783c24c..d271635 100644 --- a/Sources/MailCore/Extensions/Request+Mail.swift +++ b/Sources/MailCore/Extensions/Request+Mail.swift @@ -20,19 +20,22 @@ public struct MailProperty { return try mailer.send(message, on: request) } + /// Send email + public func send(_ messages: [Mailer.Message]) throws -> EventLoopFuture<[(Mail, Mailer.Result)]> { + let mailer = try request.make(MailerService.self) + return try mailer.send(messages, on: request) + } + /// Send email public func send(from: String, to: String, subject: String, text: String) throws -> EventLoopFuture { return try send(Mailer.Message(from: from, to: to, subject: subject, text: text)) } - } - extension Request { /// Mail functionality accessor for request public var mail: MailProperty { return MailProperty(request: self) } - } diff --git a/Sources/MailCore/MailCore.swift b/Sources/MailCore/MailCore.swift index 9581cba..c036932 100644 --- a/Sources/MailCore/MailCore.swift +++ b/Sources/MailCore/MailCore.swift @@ -15,6 +15,7 @@ import SendGrid /// Emailing service public protocol MailerService: Service { func send(_ message: Mailer.Message, on req: Request) throws -> Future + func send(_ messages: [Mailer.Message], on req: Request) throws -> Future<[(Mail, Mailer.Result)]> } @@ -91,8 +92,8 @@ public class Mailer: MailerService { let mailgunClient = try req.make(Mailgun.self) return try mailgunClient.send(message.asMailgunContent(), on: req).map(to: Mailer.Result.self) { _ in return Mailer.Result.success - }.catchMap({ error in - return Mailer.Result.failure(error: error) + }.catchMap({ error in + return Mailer.Result.failure(error: error) } ) case .sendGrid(_): @@ -100,8 +101,8 @@ public class Mailer: MailerService { let sendGridClient = try req.make(SendGridClient.self) return try sendGridClient.send([email], on: req.eventLoop).map(to: Mailer.Result.self) { _ in return Mailer.Result.success - }.catchMap({ error in - return Mailer.Result.failure(error: error) + }.catchMap({ error in + return Mailer.Result.failure(error: error) } ) case .smtp(let smtp): @@ -119,4 +120,23 @@ public class Mailer: MailerService { } } + /// Send multiple messages using a provider defined in `config: Config` + public func send(_ messages: [Message], on req: Request) throws -> Future<[(Mail, Mailer.Result)]> { + switch config { + case .mailgun: + throw Abort(.notImplemented, reason: "Sending mass email using Mailgun is not currently supported.") + case .sendGrid(_): + throw Abort(.notImplemented, reason: "Sending mass email using SendGrid is not currently supported.") + case .smtp(let smtp): + let promise = req.eventLoop.newPromise([(Mail, Mailer.Result)].self) + smtp.send(messages.map { $0.asSmtpMail() }, progress: nil) { mails, errors in + let errors = errors.map { ($0.0, Mailer.Result.failure(error: $0.1)) } + let successes = mails.map { ($0, Mailer.Result.success) } + promise.succeed(result: errors + successes) + } + return promise.futureResult + default: + throw Abort(.serviceUnavailable, reason: "Mails could not be sent: you need to configure your mail service.") + } + } }