Swift
Swift integration examples for Keplars Mail Service
Send emails using iOS Swift with Keplars Mail Service REST API.
Installation
No additional dependencies required for basic usage.
Basic Setup
// Add your API key to Info.plist or use environment variables
let apiKey = "kms_your_api_key.live_..."REST API Integration
Basic Client
import Foundation
class KeplarsEmailClient {
private let apiKey: String
private let baseURL: String
private let session: URLSession
init(apiKey: String, baseURL: String = "https://api.keplars.com") {
self.apiKey = apiKey
self.baseURL = baseURL
self.session = URLSession.shared
}
func sendEmail(
to: String,
subject: String,
body: String,
isHTML: Bool = false,
completion: @escaping (Result<[String: Any], Error>) -> Void
) {
makeRequest(endpoint: "/api/v1/send-email/async", to: to, subject: subject, body: body, isHTML: isHTML, completion: completion)
}
func sendInstantEmail(
to: String,
subject: String,
body: String,
isHTML: Bool = false,
completion: @escaping (Result<[String: Any], Error>) -> Void
) {
makeRequest(endpoint: "/api/v1/send-email/instant", to: to, subject: subject, body: body, isHTML: isHTML, completion: completion)
}
private func makeRequest(
endpoint: String,
to: String,
subject: String,
body: String,
isHTML: Bool,
completion: @escaping (Result<[String: Any], Error>) -> Void
) {
guard let url = URL(string: "\(baseURL)\(endpoint)") else {
completion(.failure(KeplarsError.invalidURL))
return
}
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("Bearer \(apiKey)", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let payload: [String: Any] = [
"to": [to],
"subject": subject,
"body": body,
"is_html": isHTML
]
do {
request.httpBody = try JSONSerialization.data(withJSONObject: payload)
} catch {
completion(.failure(error))
return
}
session.dataTask(with: request) { data, response, error in
if let error = error {
completion(.failure(error))
return
}
guard let httpResponse = response as? HTTPURLResponse,
let data = data else {
completion(.failure(KeplarsError.invalidResponse))
return
}
if httpResponse.statusCode == 200 {
do {
if let jsonResponse = try JSONSerialization.jsonObject(with: data) as? [String: Any] {
completion(.success(jsonResponse))
} else {
completion(.failure(KeplarsError.invalidJSON))
}
} catch {
completion(.failure(error))
}
} else {
completion(.failure(KeplarsError.httpError(httpResponse.statusCode)))
}
}.resume()
}
}
enum KeplarsError: Error {
case invalidURL
case invalidResponse
case invalidJSON
case noData
case httpError(Int)
}Usage Examples
class EmailService {
private let client: KeplarsEmailClient
init() {
guard let apiKey = Bundle.main.object(forInfoDictionaryKey: "KEPLARS_API_KEY") as? String else {
fatalError("KEPLARS_API_KEY not found in Info.plist")
}
self.client = KeplarsEmailClient(apiKey: apiKey)
}
func sendWelcomeEmail(to userEmail: String, name userName: String, completion: @escaping (Bool) -> Void) {
let htmlBody = """
<h1>Welcome \(userName)!</h1>
<p>Thank you for joining our platform.</p>
"""
client.sendEmail(to: userEmail, subject: "Welcome \(userName)!", body: htmlBody, isHTML: true) { result in
DispatchQueue.main.async {
switch result {
case .success(let response):
print("Email sent: \(response)")
completion(true)
case .failure(let error):
print("Failed to send email: \(error)")
completion(false)
}
}
}
}
func sendVerificationEmail(to userEmail: String, code: String, completion: @escaping (Bool) -> Void) {
let body = "Your verification code: \(code)"
client.sendInstantEmail(to: userEmail, subject: "Verify Your Email", body: body, isHTML: false) { result in
DispatchQueue.main.async {
switch result {
case .success(let response):
print("Verification email sent: \(response)")
completion(true)
case .failure(let error):
print("Failed to send verification email: \(error)")
completion(false)
}
}
}
}
}SwiftUI Integration
import SwiftUI
struct EmailView: View {
@State private var email = ""
@State private var name = ""
@State private var isLoading = false
@State private var showAlert = false
@State private var alertMessage = ""
private let emailService = EmailService()
var body: some View {
VStack(spacing: 20) {
TextField("Email", text: $email)
.textFieldStyle(RoundedBorderTextFieldStyle())
.keyboardType(.emailAddress)
.autocapitalization(.none)
TextField("Name", text: $name)
.textFieldStyle(RoundedBorderTextFieldStyle())
Button("Send Welcome Email") {
sendEmail()
}
.disabled(isLoading || email.isEmpty || name.isEmpty)
if isLoading {
ProgressView()
}
}
.padding()
.alert("Email Status", isPresented: $showAlert) {
Button("OK") { }
} message: {
Text(alertMessage)
}
}
private func sendEmail() {
isLoading = true
emailService.sendWelcomeEmail(to: email, name: name) { success in
isLoading = false
alertMessage = success ? "Email sent successfully!" : "Failed to send email"
showAlert = true
}
}
}
struct ContentView: View {
var body: some View {
NavigationView {
EmailView()
.navigationTitle("Keplars Email")
}
}
}UIKit Integration
import UIKit
class EmailViewController: UIViewController {
@IBOutlet weak var emailTextField: UITextField!
@IBOutlet weak var nameTextField: UITextField!
@IBOutlet weak var sendButton: UIButton!
@IBOutlet weak var activityIndicator: UIActivityIndicatorView!
private let emailService = EmailService()
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
private func setupUI() {
title = "Send Email"
emailTextField.keyboardType = .emailAddress
emailTextField.autocapitalizationType = .none
}
@IBAction func sendEmailTapped(_ sender: UIButton) {
guard let email = emailTextField.text, !email.isEmpty,
let name = nameTextField.text, !name.isEmpty else {
showAlert(message: "Please fill in all fields")
return
}
setLoading(true)
emailService.sendWelcomeEmail(to: email, name: name) { [weak self] success in
self?.setLoading(false)
let message = success ? "Email sent successfully!" : "Failed to send email"
self?.showAlert(message: message)
}
}
private func setLoading(_ loading: Bool) {
sendButton.isEnabled = !loading
if loading {
activityIndicator.startAnimating()
} else {
activityIndicator.stopAnimating()
}
}
private func showAlert(message: String) {
let alert = UIAlertController(title: "Email Status", message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default))
present(alert, animated: true)
}
}Async/Await Support
extension KeplarsEmailClient {
@available(iOS 13.0, *)
func sendEmail(
to: String,
subject: String,
body: String,
isHTML: Bool = false
) async throws -> [String: Any] {
return try await withCheckedThrowingContinuation { continuation in
sendEmail(to: to, subject: subject, body: body, isHTML: isHTML) { result in
continuation.resume(with: result)
}
}
}
@available(iOS 13.0, *)
func sendInstantEmail(
to: String,
subject: String,
body: String,
isHTML: Bool = false
) async throws -> [String: Any] {
return try await withCheckedThrowingContinuation { continuation in
sendInstantEmail(to: to, subject: subject, body: body, isHTML: isHTML) { result in
continuation.resume(with: result)
}
}
}
}
// Usage with async/await
class ModernEmailService {
private let client = KeplarsEmailClient(apiKey: "your_api_key")
@available(iOS 13.0, *)
func sendWelcomeEmail(to email: String, name: String) async throws {
let htmlBody = "<h1>Welcome \(name)!</h1><p>Thank you for joining our platform.</p>"
let response = try await client.sendEmail(to: email, subject: "Welcome \(name)!", body: htmlBody, isHTML: true)
print("Email sent: \(response)")
}
}iOS Swift provides native integration with Keplars Mail Service using URLSession for HTTP requests.