use v3 sendinblue API

This commit is contained in:
Seán C McCord 2018-05-16 14:06:00 -04:00
parent f79d7671b0
commit d9c49ae508

View file

@ -4,17 +4,23 @@ import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"html/template" "html/template"
"net/http"
"os" "os"
"time" "time"
"github.com/CyCoreSystems/cycore-web/app/routes" "github.com/CyCoreSystems/cycore-web/app/routes"
"github.com/CyCoreSystems/sendinblue"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/revel/revel" "github.com/revel/revel"
) )
var contactEmailT *template.Template var contactEmailT *template.Template
// EmailContact describes an email EmailContact
type EmailContact struct {
Name string `json:"name"`
Email string `json:"email"`
}
func init() { func init() {
contactEmailT = template.Must(template.New("contactEmail").Parse(contactEmailTemplate)) contactEmailT = template.Must(template.New("contactEmail").Parse(contactEmailTemplate))
} }
@ -26,37 +32,24 @@ type Contact struct {
// Request handles a customer contact request // Request handles a customer contact request
func (c Contact) Request(name, email string) revel.Result { func (c Contact) Request(name, email string) revel.Result {
emailBody, err := renderContactEmail(name, email) emailBody, err := renderContactEmail(name, email)
if err != nil { if err != nil {
return c.Controller.RenderError(errors.Wrap(err, "failed to render email for contact request")) return c.Controller.RenderError(errors.Wrap(err, "failed to render email for contact request"))
} }
body, err := emailRequestBody(emailBody) msg := &sendinblue.Message{
if err != nil { Sender: sendinblue.Address{
return c.Controller.RenderError(errors.Wrap(err, "failed to encode email request")) Name: "CyCore Systems, Inc",
Email: "sys@cycoresys.com",
},
To: getEmailContacts(),
Subject: "Contact Request",
HTMLContent: emailBody,
Tags: []string{"contact-request"},
} }
if err = msg.Send(os.Getenv("SENDINBLUE_APIKEY")); err != nil {
// Don't sent when in dev mode return c.Controller.RenderError(err)
if revel.Config.BoolDefault("mode.dev", true) {
revel.INFO.Println("email:", name, email, bytes.NewBuffer(body).String())
c.Flash.Success("request faked")
return c.Redirect(routes.App.Index())
}
mreq, err := http.NewRequest("POST", "https://api.sendinblue.com/v2.0/email", bytes.NewReader(body))
mreq.Header.Add("api-key", os.Getenv("SENDINBLUE_APIKEY"))
mreq.Header.Add("Content-Type", "application/json")
mreq.Header.Add("X-Mailin-Tag", "contact-request")
resp, err := http.DefaultClient.Do(mreq)
if err != nil {
revel.ERROR.Println("Failed to send contact request email", name, email, err)
return c.Controller.RenderError(errors.Wrap(err, "failed to send contact request email"))
}
if resp.StatusCode > 299 {
revel.ERROR.Println("Contact request email was rejected:", name, email, resp.Status, bytes.NewBuffer(body).String())
c.Flash.Error("failed to send context request")
return c.Redirect(routes.App.Index())
} }
c.Flash.Success("Request sent") c.Flash.Success("Request sent")
@ -80,41 +73,21 @@ func renderContactEmail(name, email string) (string, error) {
return buf.String(), nil return buf.String(), nil
} }
func getRecipients() map[string]string { func getEmailContacts() []sendinblue.Address {
ret := make(map[string]string)
var ret []sendinblue.Address
if err := json.Unmarshal([]byte(os.Getenv("CONTACT_RECIPIENTS")), &ret); err != nil {
// Fall back to default if we fail to load from environment
ret = append(ret, sendinblue.Address{
Name: "System Receiver",
Email: "sys@cycoresys.com",
})
type Recipient struct {
Name string
Email string
} }
var data []Recipient
if err := json.Unmarshal([]byte(os.Getenv("CONTACT_RECIPIENTS")), &data); err != nil {
ret["System Receiver"] = "sys@cycoresys.com"
}
for _, d := range data {
ret[d.Name] = d.Email
}
return ret return ret
} }
func emailRequestBody(email string) ([]byte, error) {
body := struct {
To map[string]string `json:"to"`
Subject string `json:"subject"`
From []string `json:"from"`
HTML string `json:"html"`
}{
To: getRecipients(),
Subject: "Contact Request",
From: []string{"sys@cycoresys.com", "CyCore Systems Inc"},
HTML: email,
}
return json.Marshal(&body)
}
var contactEmailTemplate = ` var contactEmailTemplate = `
<html> <html>
<body> <body>