package bo.gotthardt.email.sendgrid; import bo.gotthardt.email.EmailService; import bo.gotthardt.email.EmailServiceConfiguration; import com.codahale.metrics.MetricRegistry; import com.google.common.base.Strings; import com.sendgrid.SendGrid; import com.sendgrid.SendGridException; import lombok.extern.slf4j.Slf4j; import javax.inject.Inject; /** * Email service that uses SendGrid. * * @author Bo Gotthardt */ @Slf4j public class SendGridEmailService implements EmailService { private final EmailServiceConfiguration config; private final SendGrid sendGrid; private final MetricRegistry metrics; @Inject public SendGridEmailService(HasSendGridConfiguration config, MetricRegistry metrics) { this.config = config.getEmail(); this.metrics = metrics; this.sendGrid = new SendGrid(config.getSendGrid().getUsername(), config.getSendGrid().getPassword()); } @Override public void send(String toAddress, String subject, String htmlContent) { SendGrid.Email email = new SendGrid.Email(); email.setSubject(subject); email.setHtml(htmlContent); email.setFrom(config.getFromEmail()); email.setFromName(config.getFromName()); if (!Strings.isNullOrEmpty(config.getOverrideReceiver())) { email.addTo(config.getOverrideReceiver()); } else { email.addTo(toAddress); } try { SendGrid.Response response = sendGrid.send(email); if (!response.getStatus()) { metrics.meter(MetricRegistry.name("email", "send", "failure", toMetricName(toAddress))).mark(); log.error("Error sending email via SendGrid:", response.getMessage()); } else { metrics.meter(MetricRegistry.name("email", "send", "success", toMetricName(toAddress))).mark(); } } catch (SendGridException e) { metrics.meter(MetricRegistry.name("email", "send", "failure", toMetricName(toAddress))).mark(); log.error("Error sending email via SendGrid:", e); } } private static String toMetricName(String email) { return email.replace(".", "-"); // TODO This probably needs to be more comprehensive. } }