Using Mailchain, blockchain users can now send and receive rich-media HTML messages with attachments via a blockchain address.

Overview

Mailchain

Build Status Coverage Status Go Report Card

Introduction

Mailchain enables blockchain-based email-like messaging with plain or rich text and attachment capabilities. Using blockchain protocols and decentralized storage, Mailchain delivers a simple, secure, messaging experience.

The majority of blockchain protocols provide no standard way to handle messaging. Some account holders have sent messages as an encrypted or unencrypted string included in transaction data. Some applications work around the problem by asking users to link another method of contact (e.g. email address, phone number etc.) to an application. This compromises anonymity by asking users to link or reveal an identity. It also increases exposure to security risks, and relies on additional centralized services.

Mailchain provides a solution to these problems and a generalized solution to email message on blockchain protocols.

Repo layout

This is the primary repo for the Mailchain development.

The primary Mailchain repositories to be aware of are:

Quickstart and documentation

You can run Mailchain on most operating systems in a matter of seconds. See the Mailchain Getting Started Guide for how.

For more comprehensive documentation, start with the Mailchain docs. (The doc source code is available in the docs repo.)

Working in this repo

We ❤️ pull requests! See CONTRIBUTING.md for info on contributing changes.

Get involved

Code of conduct

This project is for everyone. We ask that our users and contributors take a few minutes to review our code of conduct.

Development Guide

See development guide for information on getting started as a developer.

Security Review Status: pre-audit

The code in this repository has not been audited.

License

Copyright 2019, Finobo. All rights reserved.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use these files except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Issues
  • Polkascan API client

    Polkascan API client

    Is your feature request related to a problem? Please describe. Mailchains needs to look up messages by address to support substrate. LINK

    Describe the solution you'd like Create a polkascan package in clients that initially finds a transactionsByAddress, it should read all data for each transaction/extrinsic including the data field.

    Describe alternatives you've considered N/A

    Additional context see getTransactionsByAddress(network string, address []byte) (*txList, error) in internal/clients/etherscan for an example

    enhancement protocol/substrate bounty-awaiting-approval bounty-s 
    opened by robdefeo 37
  • be more general when getting key from hex

    be more general when getting key from hex

    Is your feature request related to a problem? Please describe. With the introduction of substrate, when sending a message the public key type needs to be specified, the client will now send public-key-encoding and public-key-kind https://github.com/mailchain/mailchain-web/issues/146

    Describe the solution you'd like

    • [ ] expand PostMessage in cmd/mailchain/internal/http/handlers/send_message.go to include public-key-encoding and public-key-kind
    • [ ] validate public_key_encoding use encoding/consts.go
    • [ ] validate public_key_kind use crypto/keys.go
    • [ ] use correct encoding method from encoding package to decode bytes https://github.com/mailchain/mailchain/blob/master/cmd/mailchain/internal/http/handlers/send_message.go#L291
    • [ ] use crypto/multikey.PublicKeyFromBytes to decode bytes to key https://github.com/mailchain/mailchain/blob/master/cmd/mailchain/internal/http/handlers/send_message.go#L291
    • [ ] create tests using external files for request and response see https://github.com/mailchain/mailchain/blob/master/cmd/mailchain/internal/http/handlers/pubkey_test.go#L129. Use response and request prefix for files
    Stale cmd/mailchain protocol/substrate bounty-awaiting-approval bounty-xs area/sender 
    opened by todo[bot] 35
  • Support sr25519 curve

    Support sr25519 curve

    Is your feature request related to a problem? Please describe. Substrate uses SR25519

    Describe the solution you'd like Implement sr25519 algorithm against the the PublicKey and PrivateKey interfaces

    // PrivateKey definition usable in all mailchain crypto operations
    type PrivateKey interface {
    	// Bytes returns the byte representation of the private key
    	Bytes() []byte
    	// PublicKey from the PrivateKey
    	PublicKey() PublicKey
            Sign(message []byte) (signature []byte, err error)
    }
    
    // PublicKey definition usable in all mailchain crypto operations
    type PublicKey interface {
    	// Bytes returns the byte representation of the public key
    	Bytes() []byte
            Verify(data []byte) error
    }
    

    Additional items

    • [ ] Test package sr25519test with sofia
      Secret seed: 0x5c6d7adf75bda1180c225d25f3aa8dc174bbfb3cddee11ae9a85982f6faf791a
      Public key (hex): 0x169a11721851f5dff3541dd5c4b0b478ac1cd092c9d5976e83daa0d03f26620c
      Address (SS58): 5CaLgJUDdDRxw6KQXJY2f5hFkMEEGHvtUPQYDWdSbku42Dv2
    
    • [ ] Test package sr25519test with charlotte
      Secret seed: 0x23b063a581fd8e5e847c4e2b9c494247298791530f5293be369e8bf23a45d2bd
      Public key (hex): 0x84623e7252e41138af6904e1b02304c941625f39e5762589125dc1a2f2cf2e30
      Address (SS58): 5F4HMyes8GNWzpSDjTPSh61Aw6RTaWmZKwKvszocwqbsdn4h
    
    • [ ] Test under the nacl package to test encryption with sofia and charlotte keys
    • [ ] PrivateKeyFromBytes(privKey []byte) takes seed or full private key bytes
    • [ ] PublicKeyFromBytes
    • [ ]

    Describe alternatives you've considered Using CGO to and calling https://github.com/Warchant/sr25519-crust C bindings exist against https://github.com/w3f/schnorrkel

    Additional context

    • Useful information about the keys
    const (
    	chainCodeSize  = 32
    	keyPairSize    = 96
    	publicKeySize     = 32
    	privateKeySize     = 64
    	seedSize       = 32
    	signatureSize  = 64
    	vrfOutputSize = 32
    	vrfProofSize  = 64
    )
    
    • Merlin go library https://github.com/gtank/merlin
    • Ristretto go library https://github.com/gtank/ristretto255
    • Description on substrate keys can be found at https://wiki.polkadot.network/docs/en/learn-keys
    enhancement crypto/sr25519 bounty-awaiting-approval bounty-m 
    opened by robdefeo 19
  • feat: add run cmd for indexer

    feat: add run cmd for indexer

    Initial work on run command for indexer (issue #473)

    • [x] Create a command that is a child of root
    • [x] Init a postgres database against localhost
    • [ ] Create a single sequential processor for ethereum.Goerli against a local rpc client
    • [ ] test command runs

    I got stuck on Create a single sequential processor for ethereum.Goerli against a local rpc client, currently there are no concrete types that implement these interfaces that are needed to create transaction processor which is needed by the the block processor in order to create a new sequential processor instance.

    I would appreciate feedback on this (also any change requests to the current implementation of the issue are welcome).

    opened by Despire 16
  • Specify cipher for send message

    Specify cipher for send message

    Is your feature request related to a problem? Please describe. There are situations where selecting the cipher is prefered for sending messages.

    Describe the solution you'd like Ability to specify the cipher to use for each message being sent.

    handlers.SendMessage should look for a encryption-method in handlers.PostRequestBody and pass it to mailbox.SendMessage. Currently encrypter := aes256cbc.NewEncrypter() is hard coded. Checks for public key type and encryption-method need to be performed before attempting encryption.

    Describe alternatives you've considered Fixed based on protocol/curve

    Additional context Would be needed for #262

    enhancement good first issue protocol/substrate bounty-awaiting-approval bounty-s 
    opened by robdefeo 12
  • Name Service endpoint throws 404 error for name/address not found

    Name Service endpoint throws 404 error for name/address not found

    Describe the bug When calling endpoints with a valid name/address but one that does not have a resolvable ENS name/address, the API response is a 404.

    • http://127.0.0.1:8080/api/nameservice/address/{address}/resolve?protocol=ethereum&network=ropsten
    • http://127.0.0.1:8080/api/nameservice/name/{name}/resolve?protocol=ethereum&network=ropsten

    This is a arguably correct response for no name existing, but it leads to degraded developer/user experience as: [1] The 'not found' error needs to be handled as part of the application flow, as an expected result. [2] The error is propagated to the browser console and looks, well, ugly 👹

    To Reproduce Steps to reproduce the behavior:

    1. Go to 'https://inbox.mailchain.xyz/#/' with mailchain client running with addresses that are not configured for reverse resolution in ENS
    2. Open the javascript console
    3. See error

    What version of Mailchain are you using ? $ mailchain version Version: v0.0.31

    Expected behavior Something more graceful - open to ideas that help the developer handle errors better

    bug good first issue protocol/ethereum 
    opened by tboeckmann 11
  • Add original TX Hash to message

    Add original TX Hash to message

    Is your feature request related to a problem? Please describe. I want to have an option in the UI to be able to see the "origin" txhash of the message.

    Describe the solution you'd like

    Something akin to a light version of email client "show original", showing the fields from rpc getTransactionByHash (or equiv) example tx.

    The following would be added to the message headers object returned via the API. This aligns with the optional headers guidelines for RFC2822 header standards https://tools.ietf.org/html/rfc2822#section-3.6.8 ).

    "transaction": {
      "blockHash": "0x94fa39de3950f87d9225d2146b19981e5824f271d1049348462cc2ee2f20f94f",
      "blockNumber": "0x81a753",
      "from": "0x4ad2b251246aafc2f3bdf3b690de3bf906622c51",
      "gas": "0x77c4",
      "gasPrice": "0x4a817c800",
      "hash": "0x2bf261a81e624d649450a3851df2d0639a8b98ed3bce39da14e8f318adf3edb9",
      "input": "0x6d61696c636861696e010a82012ee10c59024c836d7ca12470b5ac74673002127ddedadbc6fc4375a8c086b650060ede199f603a158bc7884a903eadf97a2dd0fbe69ac81c216830f94e56b847d924b51a7d8227c80714219e6821a51bc7cba922f291a47bdffe29e7c3f67ad908ff377bfcc0b603007ead4bfd87ff0acc272528ca03d6381e6d0e1e2c5dfd24d521",
      "nonce": "0x8",
      "to": "0x92d8f10248c6a3953cc3692a894655ad05d61efb",
      "transactionIndex": "0x40",
      "value": "0x0"
    }
    

    NOTE: The fields above map intersection fields from Geth & Parity getTransactionByHash calls.

    Describe alternatives you've considered

    Considered including the encrypted message object. This would be nice to have.

    Additional context Add any other context or screenshots about the feature request here.

    enhancement area/receiver 
    opened by tboeckmann 11
  • Add verify method to secp256k1.PublicKey

    Add verify method to secp256k1.PublicKey

    Is your feature request related to a problem? Please describe.

    It is not possible to verify if a []byte is signed by a public key. This is a problem, when determining the public key from an address and there are multiple different public key possibilities due to the protocol allowing different key types.

    Describe the solution you'd like

    Implement Verify(message, sig []byte) bool on secp256k1.PublicKey. Use secp256k1test package to test signed messages with both sofia and charlotte keys. This will mean that the validity of the signed data against this public key / key type can be verified.

    Describe alternatives you've considered N/A

    Additional context N/A

    enhancement crypto/secp256k1 
    opened by robdefeo 8
  • Add verify method to ed25519.PublicKey

    Add verify method to ed25519.PublicKey

    Is your feature request related to a problem? Please describe. It is not possible to verify if a []byte is signed by a public key. This is a problem, when determining the public key from an address and there are multiple different public key possibilities due to the protocol allowing different key types.

    Describe the solution you'd like Implement Verify(message, sig []byte) bool on ed25519.PublicKey. Use ed25519test package to test signed messages with both sofia and charlotte keys. This will mean that the validity of the signed data against this public key / key type can be verified.

    Describe alternatives you've considered N/A

    Additional context N/A

    enhancement crypto/ed25519 
    opened by robdefeo 7
  • Specify envelope to use when sending a message

    Specify envelope to use when sending a message

    Is your feature request related to a problem? Please describe. I am unable to chose which envelope to use from the API when sending a message.

    Describe the solution you'd like Ability to specify the envelope to use for each message being sent.

    handlers.SendMessage should look for a envelope in handlers.PostRequestBody and pass it to mailbox.SendMessage. Currently envelope.Kind0x01 is hard coded.

    enhancement good first issue bounty-awaiting-approval bounty-xs 
    opened by robdefeo 7
  • chore(deps): bump github.com/ethereum/go-ethereum from 1.9.19 to 1.10.9

    chore(deps): bump github.com/ethereum/go-ethereum from 1.9.19 to 1.10.9

    Bumps github.com/ethereum/go-ethereum from 1.9.19 to 1.10.9.

    Release notes

    Sourced from github.com/ethereum/go-ethereum's releases.

    Attican Beta (v1.10.9)

    Geth v1.10.9 is a maintenance release containing mostly bug fixes.

    Chain tracing has received quite a bit of attention during this release cycle. JS-based tracing now supports additional callbacks for entry and exit of contract calls, improving performance if processing individual opcodes is not needed.

    Geth command changes

    • The 'evm' command has a new subcommand for testing tx decoding. (#23494)
    • 'evm t8n' now calculates and returns block difficulty. (#23353, #23507)
    • Legacy flags --rpc, --rpcaddr, --rpcport, etc. are no longer supported. (#23358)
    • Legacy debugging flags --pprofport, --pprofaddr, etc. are also no longer supported. (#23368)
    • When initializing Clique-based private networks, zero-length extradata in genesis.json now prints an error message instead of crashing. (#23538)

    Go library changes

    • Contract bindings created by accounts/abi/bind now validate log event signatures. This prevents accidentally decoding events with the wrong signature. (#23230)
    • A crash in accounts/abi when decoding struct-typed Solidity return values is resolved. (#23573)
    • Writes to the ancient database are now batched internally for improved performance. (#23462)
    • Multiple data races in transaction pool code are fixed. (#23474)
    • Comprehensive benchmarks for RLP encoding/decoding of consensus types have been added. (#23190)
    • RLP encoding of slices and arrays is slightly faster. (#23467)
    • rpc.BlockNumber now implements encoding.TextMarshaler. (#23324)
    • The Account type has been moved from package core/state to core/types. (#23567)
    • For crypto/cloudflare/bn256 EC curve, in-place addition and unmarshalling now works correctly. (#23419)
    • A very rare crash in the background 'bloombits' indexer is resolved. (#23437)

    RPC/GraphQL changes

    • JS tracing of EVM execution now provides additional callbacks for call entry/exit. Using these callbacks instead of 'step' can yield a 10-100x tracing speedup if you don't need to process every VM opcode. (#23087)
    • The '4byte' built-in tracer now uses enter/exit. (#23622)
    • A state database corruption bug caused by tracer re-execution of old blocks is resolved. (#23632)
    • The new debug_intermediateRoots method computes per-transaction state roots of a block. (#23594)
    • EVM memory and return data are no longer captured by default when tracing. (#23558)
    • EVM execution is now aborted on the server side when tracing is interrupted. (#23580)
    • Broken WebSocket connections are now detected better and their subscriptions report an error instead of hanging indefinitely. (#23556)
    • personal_sendTransaction now supports both "input" and "data" arguments, just like eth_sendTransaction. (#23476)
    • Log filtering performance is improved. (#23147)
    • Transaction access lists returned by GraphQL are now correct. (#23650)
    • The debug_stacks method now supports an optional filter expression. (#23605)
    • For clique blocks returned by RPC, the "miner" field once again contains the actual block coinbase field instead of the derived block signer. This fixes a regression where clients would no longer be able to verify the block seal signature. (#23466)

    Networking

    • The eth/65 peer-to-peer protocol is no longer supported. Geth only supports eth/66 as of this release. (#23456)
    • The cross-client eth protocol tests suite better distinguishes eth/65 and eth/66. (#23568)
    • ENR sequence numbers are now initialized as a timestamp. This prevents issues when the p2p nodes database is dropped/re-created while keeping the nodekey the same. (#19903)
    • Several data races are resolved in packages p2p and p2p/enode. (#23434)
    • Note: to simplify the ongoing rewrite of eth/downloader, the package has been duplicated temporarily. The additional copy will be removed later. (#23561)

    Build

    ... (truncated)

    Commits
    • eae3b19 params: release go-ethereum v1.10.9 stable
    • 3a6fe69 eth/protocols/snap, trie: better error-handling (#23657)
    • 42bc194 graphql: add storage slots to access list (#23650)
    • a541fbe eth/protocols/eth: simplify peer known block/txs caches (#23649)
    • 3531ca2 eth/tracers: avoid unsyncronized mutations on trie database (#23632)
    • 92c5d10 accounts/abi/bind: check event signature before parsing (#23230)
    • 783e97e core/rawdb: avoid unnecessary receipt processing for log filtering (#23147)
    • ab2caae eth/tracers: implement debug.intermediateRoots (#23594)
    • 443afc9 core/state: move state account to core/types + abstracted "write account to t...
    • ac7baea eth/tracers: re-write of 4byte tracer using enter/exit (#23622)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • network not found for protocol

    network not found for protocol

    hello

    i have installed the mailchain binaries, obtained an address from metamask and its private key, and done my best to mitigate the docs form 0.0.36 to 0.0.78

    my platform linux ubuntu 21.10 $ uname -a Linux asdasdad 5.12.19-zen+ #1 ZEN SMP PREEMPT Thu Jul 29 10:43:35 +08 2021 x86_64 x86_64 x86_64 GNU/Linux

    $ mailchain version Version: v0.0.78

    my problem

    mailchain account add --key-type secp256k1  --protocol ethereum --network mainnet   --private-key xxxx 2021/09/26 00:46:56 network not found for protocol

    for completeness sake, i tried mailchain account add --protocol=ethereum --network=mainnet --private-key=[PRIVATE-KEY-VALUE] --key-type=secp256k1 format first, same results.

    i notice other bugs, but first this issue seems most important.

    my yaml file is bone stock for this version, not shown. i made no alterations to it

    bug 
    opened by jnorthrup 1
  • Return estimated message fee via API

    Return estimated message fee via API

    Is your feature request related to a problem? Please describe. In order to show users the estimated fee to send a message, we need an endpoint that returns the current estimated fees in the context of a protocol, network, and envelope type.

    It should take into account the cost of the on-chain data and sending the transaction with medium priority.

    Describe the solution you'd like GET /messages/fee?protocol=ethereum&network=ropsten&envelope_type=0x01 returns:

    {
      "fee": "167248000000000",
      "unit": "wei"
    }
    

    Ethereum See tools here Etherscan may be the best place to get data from as this is already used for the tx index and is considered widely accurate.

    Edgeware E.g. see substrate fees here

    Other considerations Envelope has an impact? It might be handled differently than as a param- I'm open to suggestions.

    enhancement 
    opened by tboeckmann 1
  • /messages returns empty

    /messages returns empty

    Describe the bug The /messages endpoint does not return any messages

    To Reproduce Steps to reproduce the behavior:

    1. Got to http://127.0.0.1:8080/api/messages?protocol=ethereum&network=ropsten&address=0xd5ab4ce3605cd590db609b6b5c8901fdb2ef7fe6 (or any other netowrk with messages)
    2. See empty [] repsonse

    What version of Mailchain are you using ? $ mailchain version Version: v0.0.68 & Version: v0.0.69

    Expected behavior Messages should be returned for that address

    Desktop (please complete the following information):

    • OS: OSX
    • Browser: chrome

    Additional context Version: v0.0.67 works

    bug 
    opened by tboeckmann 2
  • add fees to the check

    add fees to the check

    https://github.com/mailchain/mailchain/blob/3e5245e3e17bf5728291d7248c7df5ed6e251a91/sender/algod/sender.go#L91-L94


    This issue was generated by todo based on a TODO comment in 3e5245e3e17bf5728291d7248c7df5ed6e251a91 when #694 was merged. cc @mailchain.
    todo :spiral_notepad: 
    opened by todo[bot] 0
  • algorand indexer

    algorand indexer

    Is your feature request related to a problem? Please describe. Alogorand transactions need to be indexed for Mailchain messages.

    Describe the solution you'd like Extend the indexer to index algorand transactions

    enhancement cmd/indexer protocol/algorand 
    opened by robdefeo 0
  • Deprecate AES-CBC

    Deprecate AES-CBC

    Is your feature request related to a problem? Please describe. AES-CBC does not provide authentication and its use may lead to attacks.

    Describe the solution you'd like Deprecated the AES-CBC mode but kept only for backward compatibility.

    enhancement security crypto/aes256cbc area/crypto 
    opened by robdefeo 0
  • Deprecate non hashed version of nacl encryption

    Deprecate non hashed version of nacl encryption

    Is your feature request related to a problem? Please describe. Ephemeral key is not hashed #657

    Describe the solution you'd like Deprecate NACL plain sending and use encryption scheme that hashes the ephemeral key #657

    enhancement security crypto/nacl area/crypto 
    opened by robdefeo 0
  • Hash ephemeral key

    Hash ephemeral key

    Is your feature request related to a problem? Please describe. Ephemeral key is not hashed in https://github.com/mailchain/mailchain/blob/f85c09ea74722525db86ce90aac433a9e729af6f/crypto/cipher/nacl/encrypter.go#L32 This is because if it is not hashed, we do not know how to prove any security property and there may be attacks against the scheme.

    Describe the solution you'd like Libsodium provides an example https://github.com/jedisct1/libsodium/blob/master/src/libsodium/crypto_box/curve25519xsalsa20poly1305/box_curve25519xsalsa20poly1305.c#L45

    enhancement security crypto/nacl area/crypto 
    opened by robdefeo 0
  • Check that mailchain serve runs on build

    Check that mailchain serve runs on build

    Is your feature request related to a problem? Please describe. Its possible for a PR to pass checks but mailchain serve not run.

    Describe the solution you'd like One of depending on what is most appropriate

    • A test to run serve
    • A command in the travis file
    • A new step / check in the PR checks
    enhancement devex 
    opened by robdefeo 0
Releases(v0.0.78)
Owner
Mailchain
Secure, email-like messaging for blockchain addresses and accounts
Mailchain
📮 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

Vic Shóstak 5 Nov 20, 2021
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

Alexey Vasiliev 10 Dec 1, 2021
A simple microservice designed in Go using Echo Microframework for sending emails and/or calendar invitations to users.

Calenvite A simple microservice designed in GO using Echo Microframework for sending emails and/or calendar invitations to users. Features Send emails

Adriano Galello 11 Nov 26, 2021
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

Santiago De la Cruz 230 Nov 23, 2021
:envelope: A streaming Go library for the Internet Message Format and mail messages

go-message A Go library for the Internet Message Format. It implements: RFC 5322: Internet Message Format RFC 2045, RFC 2046 and RFC 2047: Multipurpos

Simon Ser 228 Nov 28, 2021
The best way to send emails in Go.

Gomail Introduction Gomail is a simple and efficient package to send emails. It is well tested and documented. Gomail can only send emails using an SM

Gomail 3.4k Dec 5, 2021
Inline styling for html mail in golang

go-premailer Inline styling for HTML mail in golang Document install go get github.com/vanng822/go-premailer/premailer Example import ( "fmt" "gith

Nguyen Van Nhu 77 Nov 23, 2021
Golang package that generates clean, responsive HTML e-mails for sending transactional mail

Hermes Hermes is the Go port of the great mailgen engine for Node.js. Check their work, it's awesome! It's a package that generates clean, responsive

Mathieu Cornic 2.4k Dec 5, 2021
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

null 3 Oct 19, 2021
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

Jefferson Otoni Lima 8 Nov 12, 2021
📧 Example of sending mail via SendGrid in Golang.

?? go-sendgrid-example Example of sending mail via SendGrid in Golang. Get it started $ make setup # Edit environment variables $ vim ./env/local.env

ducci 1 Nov 13, 2021
A simple CSS parser and inliner in Go

douceur A simple CSS parser and inliner in Golang. Parser is vaguely inspired by CSS Syntax Module Level 3 and corresponding JS parser. Inliner only p

Aymerick 202 Nov 25, 2021
Robust and flexible email library for Go

email 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

Jordan Wright 1.9k Nov 28, 2021
:inbox_tray: An IMAP library for clients and servers

go-imap An IMAP4rev1 library written in Go. It can be used to build a client and/or a server. Usage Client package main import ( "log" "github.com

Simon Ser 1.4k Dec 3, 2021
Web and API based SMTP testing

MailHog Inspired by MailCatcher, easier to install. Download and run MailHog Configure your outgoing SMTP server View your outgoing email in a web UI

MailHog 9.3k Dec 5, 2021
High performance, self-hosted newsletter and mailing list manager with a modern dashboard. Single binary app.

listmonk is a standalone, self-hosted, newsletter and mailing list manager. It is fast, feature-rich, and packed into a single binary. It uses a Postg

Kailash Nadh 7.2k Nov 29, 2021
MIME mail encoding and decoding package for Go

enmime enmime is a MIME encoding and decoding library for Go, focused on generating and parsing MIME encoded emails. It is being developed in tandem w

James Hillyerd 271 Nov 9, 2021
A simple Go POP3 client library for connecting and reading mails from POP3 servers.

go-pop3 A simple Go POP3 client library for connecting and reading mails from POP3 servers. This is a full rewrite of TheCreeper/go-pop3 with bug fixe

Kailash Nadh 29 Nov 28, 2021
Monitoring and automation for Open Source email servers, starting with Postfix.

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

Lightmeter 68 Nov 9, 2021