Allow to configure SMTP port (#292)

* Allow to customize SMTP port

* Document change

* Fix test

* Add env vars
This commit is contained in:
Sung Won Cho 2019-10-29 21:34:52 -07:00 committed by GitHub
commit 8e7d24d409
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 101 additions and 68 deletions

View file

@ -14,11 +14,15 @@ The following log documentes the history of the server project.
#### Upgrade Guide
* Please define a new environment variable `WebURL` whose value is the URL to your Dnote server, without the trailing slash. (e.g. `https://my-server.com`) (Please see #290)
* Please define the follwoing new environment variables:
- `WebURL`: the URL to your Dnote server, without the trailing slash. (e.g. `https://my-server.com`) (Please see #290)
- `SmtpPort`: the SMTP port. (e.g. `465`) optional - required *if you want to configure email*
#### Fixed
- Allow to customize the app URL in the emails (#290)
- Allow to customize the SMTP port
### 0.2.0 - 2019-10-28

View file

@ -9,5 +9,6 @@ DBPassword=
SmtpUsername=mock-SmtpUsername
SmtpPassword=mock-SmtpPassword
SmtpHost=mock-SmtpHost
SmtpPort=465
WebURL=http://localhost:3000

View file

@ -9,5 +9,6 @@ DBPassword=
SmtpUsername=mock-SmtpUsername
SmtpPassword=mock-SmtpPassword
SmtpHost=mock-SmtpHost
SmtpPort=465
WebURL=http://localhost:3000

View file

@ -35,7 +35,7 @@ func TestGetMe(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -63,7 +63,7 @@ func TestCreateResetToken(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -96,7 +96,7 @@ func TestCreateResetToken(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -125,7 +125,7 @@ func TestResetPassword(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -171,7 +171,7 @@ func TestResetPassword(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -209,7 +209,7 @@ func TestResetPassword(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -246,7 +246,7 @@ func TestResetPassword(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -294,7 +294,7 @@ func TestResetPassword(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()

View file

@ -77,7 +77,7 @@ func TestClassicPresignin(t *testing.T) {
t.Run(fmt.Sprintf("presignin %s", tc.email), func(t *testing.T) {
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -105,7 +105,7 @@ func TestClassicPresignin_MissingParams(t *testing.T) {
defer testutils.ClearData()
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -128,7 +128,7 @@ func TestClassicSignin(t *testing.T) {
testutils.MustExec(t, db.Save(&alice), "saving alice")
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -226,7 +226,7 @@ func TestClassicSignin_Failure(t *testing.T) {
t.Run(fmt.Sprintf("signin %s %s", tc.email, tc.authKey), func(t *testing.T) {
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()

View file

@ -31,7 +31,7 @@ func TestCheckHealth(t *testing.T) {
defer testutils.ClearData()
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()

View file

@ -43,7 +43,7 @@ func TestGetNotes(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -186,7 +186,7 @@ func TestGetNote(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()

View file

@ -42,7 +42,7 @@ func TestGetRepetitionRule(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -116,7 +116,7 @@ func TestGetRepetitionRules(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -225,7 +225,7 @@ func TestCreateRepetitionRules(t *testing.T) {
t0 := time.Date(2009, time.November, 1, 2, 3, 4, 5, time.UTC)
c.SetNow(t0)
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: c,
})
defer server.Close()
@ -283,7 +283,7 @@ func TestCreateRepetitionRules(t *testing.T) {
t0 := time.Date(2009, time.November, 1, 2, 3, 4, 5, time.UTC)
c.SetNow(t0)
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: c,
})
defer server.Close()
@ -346,7 +346,7 @@ func TestUpdateRepetitionRules(t *testing.T) {
c := clock.NewMock()
t0 := time.Date(2009, time.November, 1, 2, 3, 4, 5, time.UTC)
c.SetNow(t0)
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: c,
})
defer server.Close()
@ -420,7 +420,7 @@ func TestDeleteRepetitionRules(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -545,7 +545,7 @@ func TestCreateUpdateRepetitionRules_BadRequest(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -589,7 +589,7 @@ func TestCreateUpdateRepetitionRules_BadRequest(t *testing.T) {
}
testutils.MustExec(t, db.Save(&b1), "preparing book1")
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -628,7 +628,7 @@ func TestCreateRepetitionRules_BadRequest(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()

View file

@ -681,7 +681,7 @@ func TestNotSupportedVersions(t *testing.T) {
}
// setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()

View file

@ -26,9 +26,9 @@ import (
"github.com/pkg/errors"
)
// mustNewServer is a test utility function to initialize a new server
// MustNewServer is a test utility function to initialize a new server
// with the given app paratmers
func mustNewServer(t *testing.T, app *App) *httptest.Server {
func MustNewServer(t *testing.T, app *App) *httptest.Server {
app.WebURL = os.Getenv("WebURL")
r, err := NewRouter(app)

View file

@ -46,7 +46,7 @@ func TestUpdatePassword(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -74,7 +74,7 @@ func TestUpdatePassword(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -100,7 +100,7 @@ func TestUpdatePassword(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -134,7 +134,7 @@ func TestCreateVerificationToken(t *testing.T) {
templatePath := fmt.Sprintf("%s/mailer/templates/src", testutils.ServerPath)
mailer.InitTemplates(&templatePath)
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -167,7 +167,7 @@ func TestCreateVerificationToken(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -200,7 +200,7 @@ func TestVerifyEmail(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -241,7 +241,7 @@ func TestVerifyEmail(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -285,7 +285,7 @@ func TestVerifyEmail(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -327,7 +327,7 @@ func TestVerifyEmail(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -372,7 +372,7 @@ func TestUpdateEmail(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -406,7 +406,7 @@ func TestUpdateEmailPreference(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -432,7 +432,7 @@ func TestUpdateEmailPreference(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -472,7 +472,7 @@ func TestUpdateEmailPreference(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -506,7 +506,7 @@ func TestUpdateEmailPreference(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -542,7 +542,7 @@ func TestUpdateEmailPreference(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -578,7 +578,7 @@ func TestUpdateEmailPreference(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -604,7 +604,7 @@ func TestUpdateEmailPreference(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -640,7 +640,7 @@ func TestGetEmailPreference(t *testing.T) {
defer testutils.ClearData()
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()

View file

@ -90,7 +90,7 @@ func TestRegister(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -133,7 +133,7 @@ func TestRegisterMissingParams(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -160,7 +160,7 @@ func TestRegisterMissingParams(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -188,7 +188,7 @@ func TestRegisterDuplicateEmail(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -225,7 +225,7 @@ func TestSignIn(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -255,7 +255,7 @@ func TestSignIn(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -286,7 +286,7 @@ func TestSignIn(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -317,7 +317,7 @@ func TestSignIn(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -360,7 +360,7 @@ func TestSignout(t *testing.T) {
testutils.MustExec(t, db.Save(&session2), "preparing session2")
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -411,7 +411,7 @@ func TestSignout(t *testing.T) {
testutils.MustExec(t, db.Save(&session2), "preparing session2")
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()

View file

@ -42,7 +42,7 @@ func TestGetBooks(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -121,7 +121,7 @@ func TestGetBooksByName(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -206,7 +206,7 @@ func TestDeleteBook(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -356,7 +356,7 @@ func TestCreateBook(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -417,7 +417,7 @@ func TestCreateBookDuplicate(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -496,7 +496,7 @@ func TestUpdateBook(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()

View file

@ -38,7 +38,7 @@ func TestCreateNote(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -171,7 +171,7 @@ func TestUpdateNote(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()
@ -264,7 +264,7 @@ func TestDeleteNote(t *testing.T) {
db := database.DBConn
// Setup
server := mustNewServer(t, &App{
server := MustNewServer(t, &App{
Clock: clock.NewMock(),
})
defer server.Close()

View file

@ -25,6 +25,7 @@ import (
"html/template"
"os"
"path"
"strconv"
"github.com/aymerick/douceur/inliner"
"github.com/gobuffalo/packr/v2"
@ -124,6 +125,30 @@ func NewEmail(from string, to []string, subject string) *Email {
}
}
type dialerParams struct {
Host string
Port int
Username string
Password string
}
func getSMTPParams() (*dialerParams, error) {
portStr := os.Getenv("SmtpPort")
port, err := strconv.Atoi(portStr)
if err != nil {
return nil, errors.Wrap(err, "parsing SMTP port")
}
p := &dialerParams{
Host: os.Getenv("SmtpHost"),
Port: port,
Username: os.Getenv("SmtpUsername"),
Password: os.Getenv("SmtpPassword"),
}
return p, nil
}
// Send sends the email
func (e *Email) Send() error {
// If not production, never actually send an email
@ -134,16 +159,18 @@ func (e *Email) Send() error {
return nil
}
smtpPort := 465
m := gomail.NewMessage()
m.SetHeader("From", e.from)
m.SetHeader("To", e.to...)
m.SetHeader("Subject", e.subject)
m.SetBody("text/html", e.Body)
d := gomail.NewPlainDialer(os.Getenv("SmtpHost"), smtpPort, os.Getenv("SmtpUsername"), os.Getenv("SmtpPassword"))
p, err := getSMTPParams()
if err != nil {
return errors.Wrap(err, "getting dialer params")
}
d := gomail.NewPlainDialer(p.Host, p.Port, p.Username, p.Password)
if err := d.DialAndSend(m); err != nil {
return err
}