func (d *SendGridDriver) Send(ctx context.Context, message *notificationpb.Message, man template.Manager, ch chan<- drivers.DriverResult) { m := message.GetEmail() email := new(mail.SGMailV3) p := mail.NewPersonalization() var fromName string if len(m.FromName) > 0 { fromName = m.FromName } else { fromName = d.DefaultFromName } if len(m.FromEmail) > 0 { email.SetFrom(mail.NewEmail(fromName, m.FromEmail)) } else { email.SetFrom(mail.NewEmail(fromName, d.DefaultFromEmail)) } addName := len(m.ToEmail) == len(m.ToName) for i, e := range m.ToEmail { if addName { p.AddTos(mail.NewEmail(m.ToName[i], e)) } else { p.AddTos(mail.NewEmail("", e)) } } for _, e := range m.Cc { p.AddCCs(mail.NewEmail("", e)) } for _, e := range m.Bcc { p.AddBCCs(mail.NewEmail("", e)) } if len(m.ReplyTo) > 0 { email.SetReplyTo(mail.NewEmail("", m.ReplyTo)) } data := make(map[string]interface{}) if len(message.DataJson) > 0 { if err := json.Unmarshal(message.DataJson, &data); err != nil { ch <- drivers.DriverResult{Type: drivers.TypeEmail, Err: err} return } } for k, v := range message.Tags { if _, ok := data[k]; !ok { data[k] = v } } var err error email.Subject, _, err = templateString(data, m.TemplateSub, message, man, "sub", false) if err != nil && m.Subject == "" { ch <- drivers.DriverResult{Type: drivers.TypeEmail, Err: errors.New("failed to create subject text")} return } if email.Subject == "" { email.Subject = m.Subject } var html string var set bool var text string text, set, err = templateString(data, m.TemplateTxt, message, man, "txt", false) if set { if err != nil { ch <- drivers.DriverResult{Type: drivers.TypeEmail, Err: errors.New("failed to create text content")} return } email.AddContent(mail.NewContent("text/plain", text)) } html, set, err = templateString(data, m.TemplateHtml, message, man, "html", true) if set { if err != nil { ch <- drivers.DriverResult{Type: drivers.TypeEmail, Err: errors.New("failed to create html content")} return } email.AddContent(mail.NewContent("text/html", html)) } if message.ScheduleAt > 0 { email.SendAt = int(message.ScheduleAt) } email.AddPersonalizations(p) request := sendgrid.GetRequest(d.ApiKey, "/v3/mail/send", "https://api.sendgrid.com") request.Method = "POST" request.Body = mail.GetRequestBody(email) select { case <-ctx.Done(): ch <- drivers.DriverResult{Type: drivers.TypeEmail, Err: ctx.Err()} default: r, err := sendgrid.API(request) if err != nil { ch <- drivers.DriverResult{Type: drivers.TypeEmail, Err: err} return } if r.StatusCode >= 300 { b, _ := json.Marshal(email) logrus.Debugf("failed to send mail: body was %s", string(b)) ch <- drivers.DriverResult{Type: drivers.TypeEmail, Err: fmt.Errorf(r.Body)} } else { ch <- drivers.DriverResult{Type: drivers.TypeEmail, Err: nil} } } }