package org.rakam.report;
import com.google.common.base.Throwables;
import io.airlift.configuration.Config;
import io.netty.handler.codec.http.HttpResponseStatus;
import org.rakam.util.MailSender;
import org.rakam.util.RakamException;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Properties;
import static io.netty.handler.codec.http.HttpResponseStatus.NOT_IMPLEMENTED;
public class EmailClientConfig {
private String host;
private String port;
private String user;
private String password;
private boolean useTls;
private String fromAddress = "emre@rakam.io";
private String fromName = "Rakam.io";
private URL siteUrl;
public EmailClientConfig() {
try {
siteUrl = new URL("https://app.rakam.io");
} catch (MalformedURLException e) {
throw Throwables.propagate(e);
}
}
@Config("mail.smtp.host")
public void setHost(String host) {
this.host = host;
}
@Config("mail.from-address")
public void setFromAddress(String fromAddress) {
this.fromAddress = fromAddress;
}
@Config("mail.from-name")
public void setFromName(String fromName) {
this.fromName = fromName;
}
public String getFromName() {
return fromName;
}
@Config("mail.site-url")
public void setSiteUrl(URL siteUrl) {
this.siteUrl = siteUrl;
}
public URL getSiteUrl() {
return siteUrl;
}
@Config("mail.smtp.port")
public EmailClientConfig setPort(String port) {
this.port = port;
return this;
}
@Config("mail.smtp.user")
public EmailClientConfig setUser(String user) {
this.user = user;
return this;
}
@Config("mail.smtp.password")
public EmailClientConfig setPassword(String password) {
this.password = password;
return this;
}
@Config("mail.smtp.use-tls")
public void setUseTls(boolean useTls) {
this.useTls = useTls;
}
public String getHost() {
return host;
}
public String getPort() {
return port;
}
public String getFromAddress() {
return fromAddress;
}
public String getUser() {
return user;
}
public String getPassword() {
return password;
}
public boolean isUseTls() {
return useTls;
}
/*
The javax documentation doesn't mention but it seems that Session is thread-safe. See http://stackoverflow.com/a/12733317/689144
*/
public MailSender getMailSender() {
if(getHost() == null || getUser() == null) {
throw new RakamException("mail.smtp.host or mail.smtp.username is not set.", NOT_IMPLEMENTED);
}
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", isUseTls());
props.put("mail.smtp.host", getHost());
if(getPort() != null) {
props.put("mail.smtp.port", getPort());
}
Session session = Session.getInstance(props,
new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(getUser(), getPassword());
}
});
return new MailSender(session, getFromAddress(), getFromName());
}
}