Robust and flexible email library for Go

email

Build Status GoDoc

Robust and flexible email library for Go

Email for humans

The email package is designed to be simple to use, but flexible enough so as not to be restrictive. The goal is to provide an email interface for humans.

The email package currently supports the following:

  • From, To, Bcc, and Cc fields
  • Email addresses in both "[email protected]" and "First Last <[email protected]>" format
  • Text and HTML Message Body
  • Attachments
  • Read Receipts
  • Custom headers
  • More to come!

Installation

go get github.com/jordan-wright/email

Note: Version > 1 of this library requires Go v1.5 or above.

If you need compatibility with previous Go versions, you can use the previous package at gopkg.in/jordan-wright/email.v1

Examples

Sending email using Gmail

e := email.NewEmail()
e.From = "Jordan Wright <[email protected]>"
e.To = []string{"[email protected]"}
e.Bcc = []string{"[email protected]"}
e.Cc = []string{"[email protected]"}
e.Subject = "Awesome Subject"
e.Text = []byte("Text Body is, of course, supported!")
e.HTML = []byte("<h1>Fancy HTML is supported, too!</h1>")
e.Send("smtp.gmail.com:587", smtp.PlainAuth("", "[email protected]", "password123", "smtp.gmail.com"))

Another Method for Creating an Email

You can also create an email directly by creating a struct as follows:

e := &email.Email {
	To: []string{"[email protected]"},
	From: "Jordan Wright <[email protected]>",
	Subject: "Awesome Subject",
	Text: []byte("Text Body is, of course, supported!"),
	HTML: []byte("<h1>Fancy HTML is supported, too!</h1>"),
	Headers: textproto.MIMEHeader{},
}

Creating an Email From an io.Reader

You can also create an email from any type that implements the io.Reader interface by using email.NewEmailFromReader.

Attaching a File

e := NewEmail()
e.AttachFile("test.txt")

A Pool of Reusable Connections

(var ch <-chan *email.Email)
p := email.NewPool(
	"smtp.gmail.com:587",
	4,
	smtp.PlainAuth("", "[email protected]", "password123", "smtp.gmail.com"),
)
for i := 0; i < 4; i++ {
	go func() {
		for e := range ch {
			p.Send(e, 10 * time.Second)
		}
	}()
}

Documentation

http://godoc.org/github.com/jordan-wright/email

Other Sources

Sections inspired by the handy gophermail project.

Contributors

I'd like to thank all the contributors and maintainers of this package.

A special thanks goes out to Jed Denlea jeddenlea for his numerous contributions and optimizations.

Owner
Jordan Wright
Security @ Stripe / Maintainer of Gophish
Jordan Wright
Comments
  • No Content-Type found for MIME entity

    No Content-Type found for MIME entity

    Parsing the following email (pasted as is)

    From: Mikhail Gusarov <[email protected]>
    To: [email protected]
    References: <[email protected]>
    Date: Wed, 18 Nov 2009 01:02:38 +0600
    In-Reply-To: <[email protected]> (Lars
        Kellogg-Stedman's message of "Tue, 17 Nov 2009 14:00:54 -0500")
    Message-ID: <[email protected]>
    User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux)
    MIME-Version: 1.0
    Subject: Re: [notmuch] Working with Maildir storage?
    X-BeenThere: [email protected]
    X-Mailman-Version: 2.1.12
    Precedence: list
    List-Id: "Use and development of the notmuch mail system."
        <notmuch.notmuchmail.org>
    List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,
        <mailto:[email protected]?subject=unsubscribe>
    List-Archive: <http://notmuchmail.org/pipermail/notmuch>
    List-Post: <mailto:[email protected]>
    List-Help: <mailto:[email protected]?subject=help>
    List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,
        <mailto:[email protected]?subject=subscribe>
    Content-Type: multipart/mixed; boundary="===============1958295626=="
    Sender: [email protected]
    Errors-To: [email protected]
    
    --===============1958295626==
    Content-Type: multipart/signed; boundary="=-=-=";
        micalg=pgp-sha1; protocol="application/pgp-signature"
    
    --=-=-=
    Content-Transfer-Encoding: quoted-printable
    
    
    Twas brillig at 14:00:54 17.11.2009 UTC-05 when [email protected] did g=
    yre and gimble:
    
     LK> Resulted in 4604 lines of errors along the lines of:
    
     LK>   Error opening
     LK>   /home/lars/Mail/read-messages.2008/cur/1246413773.24928_27334.hostna=
    me,U=3D3026:2,S:
     LK>   Too many open files
    
    See the patch just posted here.
    
    =2D-=20
      http://fossarchy.blogspot.com/
    
    --=-=-=
    Content-Type: application/pgp-signature
    
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.9 (GNU/Linux)
    
    iQIcBAEBAgAGBQJLAvNOAAoJEJ0g9lA+M4iIjLYQAKp0PXEgl3JMOEBisH52AsIK
    CzzfP4Fzd41K9VH/c1EdQWDYR6FCAA4IUSNICnJhITsYUb0eC5AKJiey3JP0+rmd
    s4qEFBKH2iuphv8Llltcv2Q8DyPuJBkVa3mO9XCCeABZ6v4UvnTSWRVG12csSEih
    ScgienU8sMrM9LwvvVI1ZB2flm2TzsH2hWi30jIgmtBntIKJaTgbFXB50FYFwULa
    gGL/oH3u+YpumedWzPZdCJrw2q7nMvYx8aQ29EDCNLZibAZe+6oDTa6Fv6/0ldpQ
    U+DptR0nJGbJTWa26OTSvmyeIORjAfM+TEI68n7KO9VHYPmVh6awcf0MNKYh2xWk
    eRQNBcKyQNWxeKyCCpT/rrTlpxBWahpvg+V8lkDH2W09wjRp6CUKvifK3Sz3am9m
    5ZUMpvXbwkZD6Ci6l/QytbYK50e8UpvFSu5DBaxBz59ykoypuNg2ayO5Kdi6IF5d
    T+Sw6wo8UKn9a33+vheIc0fkhZXbeSotEmDm7huazm6CgM3dcWXUpTuJvik1cSWp
    4buv98gY6IKWKoUTXODWUr+7VR4gei8du8qOsKem+QDfNX7tmaIRjhrbB24B91Wy
    td3MTJD7GjMNid0INqRY1CRMLo8YlPaq6NBZfcYtYgwa6gpJijz1/MAn8+GMrfhF
    9LI8b9jopNP+pMYBohLA
    =/ksP
    -----END PGP SIGNATURE-----
    --=-=-=--
    
    --===============1958295626==
    Content-Type: text/plain; charset="us-ascii"
    MIME-Version: 1.0
    Content-Transfer-Encoding: 7bit
    Content-Disposition: inline
    
    _______________________________________________
    notmuch mailing list
    [email protected]
    http://notmuchmail.org/mailman/listinfo/notmuch
    
    --===============1958295626==--
    
    

    From gmuch itself:

    kalbasit@cratos ~/code/src/github.com/gmuch/gmuch [email_bug] ± % make test
    === RUN   TestQuery
    --- PASS: TestQuery (0.01s)
    === RUN   TestThreadIDValidation
    method=getMessage [email protected] operation="parse email file" path=/Users/kalbasit/code/src/github.com/gmuch/gmuch/fixtures/database-v1/new/04:2, error="No Content-Type found for MIME entity"
    --- FAIL: TestThreadIDValidation (0.00s)
            thread_test.go:25: Thread("0000000000000001"): want error %!q(<nil>) got "No Content-Type found for MIME entity"
    === RUN   TestThread
    method=getMessage [email protected] operation="parse email file" path=/Users/kalbasit/code/src/github.com/gmuch/gmuch/fixtures/database-v1/new/04:2, error="No Content-Type found for MIME entity"
    --- FAIL: TestThread (0.03s)
            thread_test.go:40: g.Thread("0000000000000001"): got error: No Content-Type found for MIME entity
    FAIL
    coverage: 87.7% of statements
    exit status 1
    FAIL    github.com/gmuch/gmuch  0.064s
    make: *** [test] Error 1
    
  • Pool implementation with connection reuse

    Pool implementation with connection reuse

    Sending had to be done a bit more manually, since smtp.SendMail creates a one-time-use client, even though clients support the Reset() method for aborting transactions, and reuse after successful sends.

    The pool itself is just a channel with a buffer. It also supports only a Send(email, timeout) method to prevent library clients from failing to defer replacing the client on the pool and thus losing the connection needlessly.

  • Fails to parse email if lines are terminated with CRLF

    Fails to parse email if lines are terminated with CRLF

    If an email has lines terminated with CRLF the NewEmailFromReader function fails with the error:

    quotedprintable: invalid hex byte 0x0d

    (where 0x0d is the hex code for a CR)

    I've only experienced this with one particular email from Google. To reproduce, run the test_crlf.go code against the attached emails (download here: code_and_emails.zip).

    The two .eml files appear identical, but one has CRLF line terminators and one does not.

    ➜  file *.eml
    good_16087861c22a992efb54f73254b22052.eml: SMTP mail text, ASCII text
    bad_fa25fc7fd80e89fe6531c535f4eb68dd.eml: SMTP mail text, ASCII text, with CRLF line terminators
    
    ➜  go run test_crlf.go good_16087861c22a992efb54f73254b22052.eml 
    [+] Reading 'good_16087861c22a992efb54f73254b22052.eml'
    [+] Email details:
    
    	From: Google <[email protected]>
    	To: [[email protected]]
    	Subject: Find out more about our updated Terms of Service
    	HTML size: 20065
    	Text size: 3936
    
    ➜  go run test_crlf.go bad_fa25fc7fd80e89fe6531c535f4eb68dd.eml 
    [+] Reading 'bad_fa25fc7fd80e89fe6531c535f4eb68dd.eml'
    [+] Email details:
    
    [!] Unable to read email with Jordan's library: 
    2020/03/20 16:21:51 quotedprintable: invalid hex byte 0x0d
    exit status 1
    

    Now we set the removeCR flag in the code to remove CRLF and the bad_ email file parses:

    ➜  go run test_crlf.go bad_fa25fc7
    
    fd80e89fe6531c535f4eb68dd.eml 
    [+] Reading 'bad_fa25fc7fd80e89fe6531c535f4eb68dd.eml'
    [+] Removing carriage returns
    [+] Email details:
    
    	From: Google <[email protected]>
    	To: [[email protected]]
    	Subject: Find out more about our updated Terms of Service
    	HTML size: 20065
    	Text size: 3936
    
    

    N.B To make sure you have a 'good' copy of the two email files, their filenames are their MD5 sums:

    md5sum *.eml 
    16087861c22a992efb54f73254b22052  good_16087861c22a992efb54f73254b22052.eml
    fa25fc7fd80e89fe6531c535f4eb68dd  bad_fa25fc7fd80e89fe6531c535f4eb68dd.eml
    

    Code:

    package main
    
    import (
    	"bytes"
    	"fmt"
    	"io/ioutil"
    	"log"
    	"os"
    	"strings"
    
    	"github.com/jordan-wright/email"
    )
    
    const removeCR = false
    
    func main() {
    
    	fmt.Printf("[+] Reading '%s'\n", os.Args[1])
    	rawBody, err := ioutil.ReadFile(os.Args[1])
    	if err != nil {
    		fmt.Println("[!] Unable to read email")
    		log.Fatal(err)
    	}
    
    	if removeCR {
    		//Remove CR characters
    		fmt.Println("[+] Removing carriage returns")
    		tmp := string(rawBody)
    		tmp = strings.ReplaceAll(tmp, "\r", "")
    		rawBody = []byte(tmp)
    	}
    
    	rawBodyStream := bytes.NewReader(rawBody)
    
    	fmt.Println("[+] Email details:\n")
    
    	em, err := email.NewEmailFromReader(rawBodyStream) // Parse with @jordanwright's library
    	if err != nil {
    		fmt.Println("[!] Unable to read email with Jordan's library: ")
    		log.Fatal(err)
    	}
    
    	fmt.Printf("\tFrom: %s\n\tTo: %s\n\tSubject: %s\n\tHTML size: %d\n\tText size: %d\n", em.From, em.To, em.Subject, len(em.HTML), len(em.Text))
    
    }
    
  • Not able to parse an email: no media type

    Not able to parse an email: no media type

    Email content:

    From: "Keith Packard" <[email protected]>
    To: [email protected]
    Date: Tue, 17 Nov 2009 18:03:17 -0800
    Subject: [notmuch] Introducing myself
    In-Reply-To: <20091118002059.067214ed@hikari>
    References: <20091118002059.067214ed@hikari>
    Message-ID: <[email protected]>
    
    On Wed, 18 Nov 2009 00:20:59 +0100, Adrian Perez de Castro <aperez at igalia.com> wrote:
    
    > Some time ago I thought
    > about doing something like Not Much and in fact I played a bit with the
    > Python+Xapian and the Python+Whoosh combinations, because I find relaxing
    > to code things in Python when I am not working and also it is installed
    > by default on most distribution. I got to have some mailboxes indexed and
    > basic searching working a couple of months ago.
    
    Sup certainly started a lot of people thinking...
    
    > Also, I would like to share one idea I had in mind, that you might find
    > interesting: One thing I have found very annoying is having to re-tag my
    > mail when the indexes get b0rked (it happened a couple of times to me while
    > using Sup), so I was planning to mails as read/unread and adding the tags
    > not just to the index, but to the mail text itself, e.g. by adding a
    > "X-Tags" header field or by reusing the "Keywords" one.
    
    Easier than that, notmuch (and sup too), provide a 'dump' command which
    just lists all of the message IDs and their associated tags. Makes
    saving tags easy and doesn't involve rewriting messages. I do this once
    a day just before my computer is backed up to an external drive.
    
    If the index is destroyed, you can reindex the messages and then reapply
    all of the tags with 'notmuch restore'.
    
    --
    keith.packard at intel.com
    

    Getting the error mime: no media type when I try to parse the email above. Found that developing Gmuch email_bug branch.

  • TLS error with email 3

    TLS error with email 3

    TLS worked in 2.2 and now I get first record does not look like a TLS handshake

    Comes from https://golang.org/src/crypto/tls/conn.go row 635

    plainAuth := smtp.PlainAuth("", mail.username, mail.password, mail.host)
    if len(mail.username) == 0 {
      plainAuth = nil
    }
    
    err = e.SendWithTLS(fmt.Sprintf("%s:%s", mail.host, mail.smtpPort), plainAuth, &tls.Config{InsecureSkipVerify: true})
    
    

    Any pointers?

  • Add Message-ID header

    Add Message-ID header

    Hi,

    I would like to request an enhancement. Can you add a Message-ID header?

    http://tools.ietf.org/html/rfc5322 http://en.wikipedia.org/wiki/Message-ID

  • Adjusting trimReader to only trim whitespace on the first read.

    Adjusting trimReader to only trim whitespace on the first read.

    To make email parsing via NewEmailFromReader more resilient, we wrap the provided reader in a trimReader, which is a little custom reader that tries to trim leading whitespace. However, there was a bug where it tried to delete whitespace on every read, not just the first one.

    In very rare cases, this would cause email parsing to fail since the next set of bytes to be read would include the \n part of a \r\n. This PR fixes this by ensuring that leading whitespace is only removed during the first read.

    Fixes #106

  • Cannot get latest version: module contains a go.mod file, so module path should be github.com/jordan-wright/email/v4

    Cannot get latest version: module contains a go.mod file, so module path should be github.com/jordan-wright/email/v4

    Background

    The github.com/jordan-wright/email uses Go modules and the current release version is v4. And it’s module path is "github.com/jordan-wright/email", instead of "github.com/jordan-wright/email/v4". It must comply with the specification of "Releasing Modules for v2 or higher" available in the Modules documentation. Quoting the specification:

    A package that has opted in to modules must include the major version in the import path to import any v2+ modules To preserve import compatibility, the go command requires that modules with major version v2 or later use a module path with that major version as the final element. For example, version v2.0.0 of example.com/m must instead use module path example.com/m/v2. https://github.com/golang/go/wiki/Modules#releasing-modules-v2-or-higher

    Steps to Reproduce

    GO111MODULE=on, run go get targeting any version >= v4.0.0 of the jordan-wright/email:

    $ go get github.com/jordan-wright/[email protected]
    go: finding github.com/jordan-wright/email v4.0.0
    go: finding github.com/jordan-wright/email v4.0.0
    go get github.com/jordan-wright/[email protected]: github.com/jordan-wright/[email protected]: invalid version: module contains a go.mod file, so major version must be compatible: should be v0 or v1, not v4
    

    SO anyone using Go modules will not be able to easily use any newer version of jordan-wright/email.

    Solution

    1. Kill the go.mod files, rolling back to GOPATH.

    This would push them back to not being managed by Go modules (instead of incorrectly using Go modules). Ensure compatibility for downstream module-aware projects and module-unaware projects projects

    2. Fix module path to strictly follow SIV rules.

    Patch the go.mod file to declare the module path as github.com/jordan-wright/email/v4 as per the specs. And adjust all internal imports. The downstream projects might be negatively affected in their building if they are module-unaware (Go versions older than 1.9.7 and 1.10.3; Or use third-party dependency management tools, such as: Dep, glide,govendor…).

    [*] You can see who will be affected here: [53 module-unaware user, i.e., maximus-next/repo.nefrosovet.ru, signal18/replication-manager, lockys/Awesome.json] https://github.com/search?q=github.com%2Fjordan-wright%2Femail+extension%3Ajson+extension%3Aconf+extension%3Atoml+extension%3Alock&type=Code

    If you don't want to break the above repos. This method can provides better backwards-compatibility. Release a v2 or higher module through the major subdirectory strategy: Create a new v4 subdirectory (github.com/jordan-wright/email/v4) and place a new go.mod file in that subdirectory. The module path must end with /v4. Copy or move the code into the v4 subdirectory. Update import statements within the module to also use /v4 (import "github.com/jordan-wright/email/v4/…"). Tag the release with v4.x.y.

    3. Suggest your downstream module users to use hash instead of a version tag.

    If the standard rule of go modules conflicts with your development mode. Or not intended to be used as a library and does not make any guarantees about the API. So you can’t comply with the specification of "Releasing Modules for v2 or higher" available in the Modules documentation. Regardless, since it's against one of the design choices of Go, it'll be a bit of a hack. Instead of go get github.com/jordan-wright/email@version-tag, module users need to use this following way to get the jordan-wright/email: (1) Search for the tag you want (in browser) (2) Get the commit hash for the tag you want (3) Run go get github.com/jordan-wright/email@commit-hash (4) Edit the go.mod file to put a comment about which version you actually used This will make it difficult for module users to get and upgrade jordan-wright/email.

    [*] You can see who will be affected here: [139 module users, e.g., cambalamas/creekmail, jacekk/go-rest-api-playground, pulsar-go/pulsar] https://github.com/search?q=github.com%2Fjordan-wright%2Femail+extension%3Amod&type=Code

    Summary

    You can make a choice to fix DM issues by balancing your own development schedules/mode against the affects on the downstream projects.

    For this issue, Solution 2 can maximize your benefits and with minimal impacts to your downstream projects the ecosystem.

    References

    • https://github.com/golang/go/wiki/Modules#semantic-import-versioning
    • https://golang.org/cmd/go/#hdr-Module_compatibility_and_semantic_versioning
    • https://github.com/golang/go/wiki/Modules#releasing-modules-v2-or-higher
  • might be cool?

    might be cool?

    Might be cool if the Send mech had a way to do this in a go routine? to avoid blocking code using the package?

    I would think we need some community guidance about whether the go routines should inside the packages or expected to be done by the users of the package...

    opinion?

  • Support for inline attachments with NewEmailFromReader

    Support for inline attachments with NewEmailFromReader

    in v4.0.0 when using NewEmailFromReader to create an email, attachments are only created if Content-Disposition is 'attachment'. This PR adds support for inline attachments as well.

    Links to issue #82 just like PR #89

    The failing test during build was there before this change already, assumed it is a known issue

  • unexpected behavior for go 1.9.2

    unexpected behavior for go 1.9.2

    I use this package to send some emails in Chinese. When compiling with go 1.8.3, it's OK, but when compiling with go 1.9.2, the content seems to be encoded (I'm not sure, something like: =E5=86=85=E5=AE=B9)

    Is there any easy solution to this?

  • SendWithStartTLS:504 5.7.4 Unrecognized authentication type [HK2PR04CA0063.apcprd04.prod.outlook.com]

    SendWithStartTLS:504 5.7.4 Unrecognized authentication type [HK2PR04CA0063.apcprd04.prod.outlook.com]

    Hi, I have a problem. When I use the SendWithStartTLS function to send mail, It produces an error message: 504 5.7.4 Unrecognized authentication type [HK2PR04CA0063.apcprd04.prod.outlook.com],The code is as follows:

    tlsConfig := &tls.Config{
    	InsecureSkipVerify: true,
    	ServerName:         smtpServerHost,
    }
    // send email with starttls
    // smtpServerAddr contains host and port of smtp server
    err := em.SendWithStartTLS(smtpServerAddr, smtp.PlainAuth("", username, password, smtpServerHost), tlsConfig)
    

    What should I do?

  • Hello author, about proxy IP

    Hello author, about proxy IP

    I want to consult, I have been in contact with golang soon i want to know i want to switch my sending ip everytime i send some mail Is there a built-in method for switching IPs in jordan-wright/email? If not, how should I switch my IP when I send too many emails or switch other sending mailboxes? Please advise

  • #147 Proper handling of utf-8 characters in reply-to headers

    #147 Proper handling of utf-8 characters in reply-to headers

    This PR aims to resolve #147.

    Most e-mail headers got proper character encoding handling with PR #132. Unfortunately that change missed that the reply-to header was not treated as an address but as a regular header. As a result it did not get the same kind of handling as the from, to, cc and bcc headers.

    This PR extends the same functionality also to the Reply-To header. It also adds corresponding tests and updates the project github workflow to work with Go 1.16 even without a go.mod file

  • Incorrect encoding for utf-8 characters in reply-to addresses

    Incorrect encoding for utf-8 characters in reply-to addresses

    Most e-mail headers got proper character encoding handling with PR #132. Unfortunately that change missed that the reply-to header was not treated as an address but as a regular header. As a result it did not get the same kind of handling as the from, to, cc and bcc headers.

    As a result reply-to addresses get currently incorrectly encoded if they contain utf-8 characters.

Related tags
Sending emails using email server talking to RabbitMQ and send grid server sending emails to email ids consumed from RabbitMQ
Sending emails using email server talking to RabbitMQ and send grid server sending emails to email ids consumed from RabbitMQ

Sending emails using email server talking to RabbitMQ and send grid server sending emails to email ids consumed from RabbitMQ

Oct 27, 2022
VMail - check the markup (HTML, CSS) of HTML email template compatibility with email clients
VMail - check the markup (HTML, CSS) of HTML email template compatibility with email clients

VMail - check the markup (HTML, CSS) of HTML email template compatibility with email clients Email clients use different rendering standards. This is

Dec 17, 2022
:white_check_mark: A Go library for email verification without sending any emails.

email-verifier ✉️ A Go library for email verification without sending any emails. Features Email Address Validation: validates if a string contains a

Dec 30, 2022
✉️ A Go library for email verification without sending any emails.

email-verifier ✉️ A Go library for email verification without sending any emails. Features Email Address Validation: validates if a string contains a

Jun 24, 2021
Mcopa - A library allows for parsing an email message into a more convenient form than the net/mail provides

Mail content parsing This library allows for parsing an email message into a mor

Jan 1, 2022
Golang library for sending email using gmail credentials

library for sending email using gmail credentials

Jan 22, 2022
Golang package for send email. Support keep alive connection, TLS and SSL. Easy for bulk SMTP.

Go Simple Mail The best way to send emails in Go with SMTP Keep Alive and Timeout for Connect and Send. IMPORTANT Examples in this README are for v2.2

Jan 8, 2023
a simple api that sent spam via sms and email

a simple api that sent spam via sms and email routes: /sms /email example request with python

Oct 19, 2021
📮 Simple (but useful) email sender written in pure Go v1.17. Support HTML templates and attachments.

?? Go Email Sender Simple (but useful) email sender written in pure Go v1.17. Yes, yet another email package here! ?? Support HTML templates and attac

Dec 31, 2021
Monitoring and automation for Open Source email servers, starting with Postfix.
Monitoring and automation for Open Source email servers, starting with Postfix.

Welcome to Lightmeter Control Center, the Open Source mailops monitoring application.

Dec 19, 2022
An email MIME artist for golang

Marcel is a tool to generate IETF compliant emails in raw MIME format. I mainly use this for generating emails with attachments and sending them via amazon SES. If that's what you're doing too, you may want notifications

Nov 7, 2022
:incoming_envelope: Simple email interface across multiple service providers (ses, postmark, mandrill, smtp)
:incoming_envelope: Simple email interface across multiple service providers (ses, postmark, mandrill, smtp)

go-mail Lightweight email package with multi-provider support (ses, mandrill, postmark) Table of Contents Installation Documentation Examples & Tests

Dec 10, 2022
EMail Searcher By Golang
EMail Searcher By Golang

GiveMeMail ▄████ ██▓ ██▒ ██▓ ▓██████ ███▄ ▄███▓▓██████ ███▄ ▄███▓ ██ ██▓ ██▓ ██▒ ▀█▒ ▓██▒ ▓██░ █▒ ▓█ ▀ ▓██▒▀█▀ ██▒▓█

Dec 4, 2021
End-to-end encrypted email for the mesh networking age

Yggmail It's email, but not as you know it. Introduction Yggmail is a single-binary all-in-one mail transfer agent which sends and receives email nati

Jan 2, 2023
envio de email via SMTP com anexo usando Go

gosendmail - SMTP This repo is a simple net/smtp abstraction for sending emails using SMTP. With it we can send emails With copy, with blind copy and

Aug 18, 2022
Go implementation of the JWZ email threading algorithm
Go implementation of the JWZ email threading algorithm

The JWZ Threading algorithm written in Go This is an open source Go implementation of the widely known JWZ message threading algorithm originally writ

Oct 31, 2022
Experimental email attachment downloader for Kobo devices (gmail only ATM)

KoboMail Experimental email attachment downloader for Kobo devices (gmail only ATM) What is KoboMail? It is a software that will read emails sent to u

Jan 9, 2023
In this project I just created email-verification Code.

mail-verification In this project I just created email-verification Code. Setup Before run the program. Type go mod tidy on terminal. After that chang

Nov 4, 2021
aerc is an email client for your terminal.

aerc aerc is an email client for your terminal. This is a fork of the original aerc by Drew DeVault. A short demonstration can be found on https://aer

Dec 14, 2022