summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/goamz/goamz/exp/ses/ses.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/goamz/goamz/exp/ses/ses.go')
-rw-r--r--vendor/github.com/goamz/goamz/exp/ses/ses.go145
1 files changed, 145 insertions, 0 deletions
diff --git a/vendor/github.com/goamz/goamz/exp/ses/ses.go b/vendor/github.com/goamz/goamz/exp/ses/ses.go
new file mode 100644
index 000000000..7c9c7c352
--- /dev/null
+++ b/vendor/github.com/goamz/goamz/exp/ses/ses.go
@@ -0,0 +1,145 @@
+// ses.go
+package ses
+
+import (
+ "encoding/xml"
+ "github.com/goamz/goamz/aws"
+ "io/ioutil"
+ "net/http"
+ "net/url"
+ "strconv"
+ "strings"
+)
+
+type SES struct {
+ auth aws.Auth
+ region aws.Region
+ client *http.Client
+}
+
+// Initializes a pointer to an SES struct which can be used
+// to perform SES API calls.
+func NewSES(auth aws.Auth, region aws.Region) *SES {
+ ses := SES{auth, region, nil}
+ return &ses
+}
+
+// Sends an email to the specifications stored in the Email struct.
+func (ses *SES) SendEmail(email *Email) error {
+ data := make(url.Values)
+
+ index := 0
+ for i := range email.destination.bccAddresses {
+ if len(email.destination.bccAddresses[i]) > 0 {
+ index += 1
+ key := "Destination.BccAddresses.member." + strconv.Itoa(index)
+ data.Add(key, email.destination.bccAddresses[i])
+ }
+ }
+
+ index = 0
+ for i := range email.destination.ccAddresses {
+ if len(email.destination.ccAddresses[i]) > 0 {
+ index += 1
+ key := "Destination.CcAddresses.member." + strconv.Itoa(index)
+ data.Add(key, email.destination.ccAddresses[i])
+ }
+ }
+
+ index = 0
+ for i := range email.destination.toAddresses {
+ if len(email.destination.toAddresses[i]) > 0 {
+ index += 1
+ key := "Destination.ToAddresses.member." + strconv.Itoa(index)
+ data.Add(key, email.destination.toAddresses[i])
+ }
+ }
+
+ index = 0
+ for i := range email.replyTo {
+ if len(email.replyTo[i]) > 0 {
+ index += 1
+ key := "ReplyToAddresses.member." + strconv.Itoa(index)
+ data.Add(key, email.replyTo[i])
+ }
+ }
+
+ if len(email.message.Subject.Data) > 0 {
+ if len(email.message.Subject.Charset) > 0 {
+ data.Add("Message.Subject.Charset", email.message.Subject.Charset)
+ }
+ data.Add("Message.Subject.Data", email.message.Subject.Data)
+ }
+
+ if len(email.message.Body.Html.Data) > 0 {
+ if len(email.message.Body.Html.Charset) > 0 {
+ data.Add("Message.Body.Html.Charset", email.message.Body.Html.Charset)
+ }
+ data.Add("Message.Body.Html.Data", email.message.Body.Html.Data)
+ }
+
+ if len(email.message.Body.Text.Data) > 0 {
+ if len(email.message.Body.Text.Charset) > 0 {
+ data.Add("Message.Body.Text.Charset", email.message.Body.Text.Charset)
+ }
+ data.Add("Message.Body.Text.Data", email.message.Body.Text.Data)
+ }
+
+ if len(email.returnPath) > 0 {
+ data.Add("ReturnPath", email.returnPath)
+ }
+
+ if len(email.source) > 0 {
+ data.Add("Source", email.source)
+ }
+
+ return ses.doPost("SendEmail", data)
+}
+
+// Do an SES POST action.
+func (ses *SES) doPost(action string, data url.Values) error {
+ req := http.Request{
+ Method: "POST",
+ ProtoMajor: 1,
+ ProtoMinor: 1,
+ Close: true,
+ Header: http.Header{}}
+
+ URL, err := url.Parse(ses.region.SESEndpoint)
+ if err != nil {
+ return err
+ }
+ URL.Path = "/"
+
+ req.URL = URL
+ req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
+ sign(ses.auth, "POST", req.Header)
+
+ data.Add("AWSAccessKeyId", ses.auth.AccessKey)
+ data.Add("Action", action)
+
+ body := data.Encode()
+ req.Header.Add("Content-Length", strconv.Itoa(len(body)))
+ req.Body = ioutil.NopCloser(strings.NewReader(body))
+
+ if ses.client == nil {
+ ses.client = &http.Client{}
+ }
+
+ resp, err := ses.client.Do(&req)
+ if err != nil {
+ return err
+ }
+ if resp.StatusCode > 204 {
+ defer resp.Body.Close()
+ return buildError(resp)
+ }
+
+ return nil
+}
+
+func buildError(r *http.Response) *SESError {
+ err := SESError{}
+ xml.NewDecoder(r.Body).Decode(&err)
+ return &err
+}