Skip to content

hasCorp/HasMail

Repository files navigation

hasMail

Centralized email automation service for hasCorp.

Run locally

A complete example:

go run cmd/mailservice/main.go -bypass -port=2564

Authentication

SendGrid

Store your SendGrid API key in a credentials.json at the root of the repo (this is in the .gitignore). Take a look at ./credentials.json.template as an example:

{
    "SENDGRID_API_KEY": "Your API key goes here",
    "FROM_NAME": "Friendly Name",
    "FROM_ADDR": "some-email@fake.dev"
}

If you don't want to store the credentials and configurations in a JSON file in the project repo, you can expose environment variables with the same key names.

# for Linux/Unix systems
export SENDGRID_API_KEY="Your API key goes here",
export FROM_NAME="Friendly Name",
export FROM_ADDR="some-email@fake.dev"
# for Windows systems
set SENDGRID_API_KEY="Your API key goes here",
set FROM_NAME="Friendly Name",
set FROM_ADDR="some-email@fake.dev"

Bypassing client authentication

For local development, it makes sense to do some testing without requiring a hard dependency on the authentication service to verify incoming requests. When running locally, pass in the -bypass flag to ignore client auth verification

go run cmd/mailservice/main.go -bypass

Verifying local auth for testing

For local development, you can configure a static token to verify that the header is read correctly for auth protected routes. Set a static token with the token flag. Note that the -bypass flag takes precedence over this.

go run cmd/mailservice/main.go -token abc123
curl -d '{"foo": "bar"}' -H 'Authorization: abc123' -H 'Content-Type: application/json' localhost:8000/mail/foo

Listening port

By default, the HTTP server listens on port 8000. This can be changed when running via the -port flag:

go run cmd/mailservice/main.go -bypass -port=2564

Building

You can build the project locally simply by running:

go build .

Or you can use the Dockerfile at the root of the repo to build an image.

docker build -t hascorp/hasmail -f Dockerfile .

Running

You can run the project locally with go:

go run ./cmd/mailservice

Or you can use the built Docker image to run a container:

docker run -it -p 8000:8000 hascorp/hasmail

Testing

Ping the server with cURL or your preferred client:

# ping healthcheck endpoint
curl localhost:8000/

# verify routes work with no-op endpoint
curl -d '{"a": "b"}' -H 'Content-Type: application/json' localhost:8000/mail/noop

# send a real sample mail end-to-end
curl -d '{"name": "Hank Pecker", "vars": {"foo": "bar"}, "recipient": "hank@hascorp.dev"}' -H 'Content-Type: application/json' localhost:8000/mail/sample

Releasing

Pipeline

TODO: this

Dockerize

Build with the production Dockerfile:

docker build -t hascorp/hasmail-prod -f Dockerfile.production .

This can be tested locally like the regular Dockerfile:

docker run -it -p 8000:8000 hascorp/hasmail-prod

Testing

Unit testing

Run unit tests locally:

go test -v ./...

Integration testing

TBD

Developing

TBD

Linting

Install golangci-lint: https://golangci-lint.run/usage/install/#local-installation

Run it:

golangci-lint run