package com.kinancity.mail; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.mail.BodyPart; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.subethamail.smtp.MessageHandler; import org.subethamail.smtp.RejectException; import org.subethamail.smtp.TooMuchDataException; /** * Message Handler * * @author drallieiv * */ public class KcMessageHandler implements MessageHandler { private static final String POKEMON_DOMAIN = "@pokemon.com"; private static final String ACTIVATION_EXP = "https://club.pokemon.com/us/pokemon-trainer-club/activated/.*"; private Logger logger = LoggerFactory.getLogger(getClass()); private String recipient; private String from; private LinkActivator activator; /** * Construct with a given Link Activator * @param activator */ public KcMessageHandler(LinkActivator activator) { this.activator = activator; } @Override public void from(String from) throws RejectException { this.from = from; } @Override public void recipient(String recipient) throws RejectException { this.recipient = recipient; } /** * Parse email, exctact activation link and call Link Activator */ @Override public void data(InputStream data) throws RejectException, TooMuchDataException, IOException { // Only accept pokemon mails if (from.endsWith(POKEMON_DOMAIN)) { logger.debug("Received email from {} to {}", from, recipient); try { Session session = Session.getDefaultInstance(new Properties()); MimeMessage message = new MimeMessage(session, data); MimeMultipart mpart = (MimeMultipart) message.getContent(); BodyPart part = mpart.getBodyPart(0); String content = (String) part.getContent(); Pattern p = Pattern.compile(ACTIVATION_EXP); Matcher m = p.matcher(content); if (m.find()) { String activationLink = m.group(0); logger.info("Activation link found for email {} : [{}]", recipient, activationLink); if(activator.activateLink(activationLink)){ logger.info("Account activation for email {} : success", recipient); }else{ logger.error("Account activation for email {} : failed", recipient); } } else { logger.error("No activation link found"); } } catch (MessagingException e) { logger.error("Failed parsing Mime Message"); } } } @Override public void done() { } }