Send email to any SMTP server like a boss, in Swift and cross-platform
Alternatives To Hedwig
Project NameStarsDownloadsRepos Using ThisPackages Using ThisMost Recent CommitTotal ReleasesLatest ReleaseOpen IssuesLicenseLanguage
21 hours ago504cc0-1.0Python
Mail-in-a-Box helps individuals take back control of their email by defining a one-click, easy-to-deploy SMTP+everything else server: a mail server in a box.
14 days ago18September 29, 2021236mitGo
Web and API based SMTP testing
Mailcatcher5,9101,518162 months ago50July 04, 202238mitRuby
Catches mail and serves it through a dream.
a day ago130otherPython
Insular email distribution - mail server as Docker images
Maddy3,96815 days ago40July 01, 202285gpl-3.0Go
✉️ Composable all-in-one mail server.
Papercut Smtp2,546
2 months ago38JavaScript
Papercut SMTP -- The Simple Desktop Email Server
Smtp4dev2,241113 months ago69January 07, 202169bsd-3-clauseC#
smtp4dev - the fake smtp email server for development and testing
Padloc2,19212 months ago1November 14, 201970agpl-3.0JavaScript
A modern, open source password manager for individuals and teams.
Go Guerrilla2,146182 years ago2December 28, 201955mitGo
Mini SMTP server written in golang
Go Imap1,78432819 days ago30May 01, 202229mitGo
:inbox_tray: An IMAP library for clients and servers
Alternatives To Hedwig
Select To Compare

Alternative Project Comparisons

codebeat badge

Hedwig is a Swift package which supplies a set of high level APIs to allow you sending email to an SMTP server easily. If you are planning to send emails from your next amazing Swift server app, Hedwig might be a good choice.


  • [x] Connect to all SMTP servers, through whether plain, SSL or TLS (STARTTLS) port.
  • [x] Authentication with PLAIN, CRAM-MD5, LOGIN or XOAUTH2.
  • [x] Send email with HTML body and attachments.
  • [x] Customize validation method and mail header, to track your mail campaign.
  • [x] Queued mail sending, without blocking your app. You can even send mails concurrently.
  • [x] Works with Swift Package Manager, in the latest Swift syntax and cross-platform.
  • [x] Fully tested and documented.


Add the url of this repo to your Package.swift:

import PackageDescription

let package = Package(
    name: "YourAwesomeSoftware",
    dependencies: [
        .Package(url: "https://github.com/onevcat/Hedwig.git", 
                 majorVersion: 1)

Then run swift build whenever you get prepared. (Also remember to grab a cup of coffee 😄)

You can find more information on how to use Swift Package Manager in Apple's official page.


Sending text only email

let hedwig = Hedwig(hostName: "smtp.example.com", user: "[email protected]", password: "password")
let mail = Mail(
        text: "Across the great wall we can reach every corner in the world.", 
        from: "[email protected]", 
        to: "[email protected]", 
        subject: "Hello World"
hedwig.send(mail) { error in
    if error != nil { /* Error happened */ }

Sending HTML email

let hedwig = Hedwig(hostName: "smtp.example.com", user: "[email protected]", password: "password")
let attachment = Attachment(htmlContent: "<html><body><h1>Title</h1><p>Content</p></body></html>")
let mail = Mail(
        text: "Fallback text", 
        from: "[email protected]", 
        to: "[email protected]", 
        subject: "Title", 
        attachments: [attachment]
hedwig.send(mail) { error in
    if error != nil { /* Error happened */ }

CC and BCC

let hedwig = Hedwig(hostName: "smtp.example.com", user: "[email protected]", password: "password")
let mail = Mail(
        text: "Across the great wall we can reach every corner in the world.", 
        from: "[email protected]", 
        to: "[email protected]",
        cc: "Wei Wang <[email protected]>, [email protected]", // Addresses will be parsed for you
        bcc: "My Group: [email protected], [email protected];",    // Even with group syntax
        subject: "Hello World"
hedwig.send(mail) { error in
    if error != nil { /* Error happened */ }

Using different SMTP settings (security layer, auth method and etc.)

let hedwig = Hedwig(
        hostName: "smtp.example.com", 
        user: "[email protected]", 
        password: "password",
        port: 1234,     // Determined from secure layer by default
        secure: .plain, // .plain (Port 25) | .ssl (Port 465) | .tls (Port 587) (default)
        validation: .default, // You can set your own certificate/cipher/protocols
        domainName: "onevcat.com", // Used when saying hello to STMP Server
        authMethods: [.plain, .login] // Default: [.plain, .cramMD5, .login, .xOauth2]        

Send mails with inline image and other attachment

let imagePath = "/tmp/image.png"
// You can create an attachment from a local file path.
let imageAttachment = Attachment(
        filePath: imagePath, 
        inline: true, 
        // Add "Content-ID" if you need to embed this image to another attachment.
        additionalHeaders: ["Content-ID": "hedwig-image"] 
let html = Attachment(
        htmlContent: "<html><body>A photo <img src=\"cid:hedwig-image\"/></body></html>", 
        // If imageAttachment only used embeded in HTML, I recommend to set it as related.
        related: [imageAttachment]

// You can also create attachment from raw data.
let data = "{\"key\": \"hello world\"}".data(using: .utf8)!
let json = Attachment(
        data: data, 
        mime: "application/json", 
        name: "file.json", 
        inline: false // Send as standalone attachment.

let mail = Mail(
        text: "Fallback text", 
        from: "[email protected]", 
        to: "[email protected]", 
        subject: "Check the photo and json file!",
        attachments: [html, json]
hedwig.send(mail) { error in
    if error != nil { /* Error happened */ }

Send multiple mails

let mail1: Mail = //...
let mail2: Mail = //...

hedwig.send([mail1, mail2], 
        progress: { (mail, error) in
            if error != nil { 
                print("\(mail) failed. Error: \(error)") 
        completion: { (sent, failed) in
            for mail in sent {
                print("Sent mail: \(mail.messageId)")
            for (mail, error) in failed {
                print("Mail \(mail.messageId) errored: \(error)")

Help and Questions

Visit the documentation page for full API reference.

You could also run the tests (swift test) to see more examples to know how to use Hedwig.

If you have found the framework to be useful, please consider a donation. Your kind contribution will help me afford more time on the project.

Click here to lend your support to: Hedwig and make a donation at pledgie.com !

Or you are a Bitcoin fan and want to treat me a cup of coffe, here is my wallet address:



I cannot send mails with Gmail SMTP.

Gmail uses an application specific password. You need to create one and use the specified password when auth. See this.

I need to add/set some additonal header in the mail.

Both Mail and Attachment accept customizing header fields. Pass your headers as additionalHeaders when creating the mail or attachment and Hedwig will handle it.

Can I use it in iOS?

At this time Swift Package Manager has no support for iOS, watchOS, or tvOS platforms. So the answer is no. But this framework is not using anything only in iOS (like UIKit), so as soon as Swift Package Manager supports iOS, you can use it there too.

Tell me about the name and logo of Hedwig

Yes, Hedwig (bird) was Harry Potter's pet Snowy Owl. The logo of Hedwig (this framework) is created by myself and it pays reverence to the novels and movies.

Other questions

Submit an issue if you find something wrong. Pull requests are warmly welcome, but I suggest to discuss first.

You can also follow and contact me on Twitter or Sina Weibo.

Enjoy sending your emails


Hedwig is released under the MIT license. See LICENSE for details.

Popular Server Projects
Popular Smtp Projects
Popular Networking Categories
Related Searches

Get A Weekly Email With Trending Projects For These Categories
No Spam. Unsubscribe easily at any time.
Smtp Server