Rev 3390 | Rev 3546 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
/****/package in.shop2020.util;import in.shop2020.crm.Activity;import in.shop2020.crm.ActivityType;import in.shop2020.crm.CRMService.Client;import in.shop2020.crm.SearchFilter;import in.shop2020.crm.Ticket;import in.shop2020.crm.TicketCategory;import in.shop2020.crm.TicketPriority;import in.shop2020.crm.TicketStatus;import in.shop2020.model.v1.user.User;import in.shop2020.model.v1.user.UserContextException;import in.shop2020.thrift.clients.CRMClient;import in.shop2020.thrift.clients.UserClient;import java.io.IOException;import java.text.ParseException;import java.util.Date;import java.util.regex.Matcher;import java.util.regex.Pattern;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.Multipart;import javax.mail.Part;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.apache.thrift.TException;import org.apache.thrift.transport.TTransportException;/*** @author mandeep**/public class CRMEmailProcessor {private static final int DESCRIPTION_MAX_WIDTH = 1900;private static final String MAILOR_DAEMON_EMAIL_ID = "mailer-daemon@googlemail.com";private static final Log log = LogFactory.getLog(CRMEmailProcessor.class);private Client client;public void processEmail(Message message) throws MessagingException,IOException, TException, UserContextException {// Ignoring mails from Mailor daemonif (MAILOR_DAEMON_EMAIL_ID.equals(parseEmailId(message.getFrom()[0].toString()))) {return;}Long ticketId = parseTicketId(message);if (ticketId != null) {log.info("Response for Ticket: " + ticketId + ": " + message);updateTicket(ticketId, message);} else {log.info("Mail not recognized as CRM ticket response with subject: "+ message.getSubject());log.info("Creating ticket for the same");createTicket(message);}}private Long parseTicketId(Message message) throws MessagingException {Long ticketId = null;String subject = message.getSubject();if (subject != null) {Pattern p = Pattern.compile("^.*"+ CRMConstants.CRM_SUBJECT_PREFIX_FOR_TICKET_ID+ "(\\d+).*$");Matcher m = p.matcher(subject);if (m.matches()) {ticketId = Long.parseLong(m.group(1));}}return ticketId;}public Date getLastProcessedTimestamp() throws ParseException, TException {client = new CRMClient().getClient();return new Date(client.getLastEmailProcessedTimestamp());}public void updateLastProcessedTimestamp(Date date) throws TException {client = new CRMClient().getClient();client.updateLastEmailProcessedTimestamp(date.getTime());}private void updateTicket(Long ticketId, Message message) {try {SearchFilter searchFilter = new SearchFilter();searchFilter.setTicketId(ticketId);client = new CRMClient().getClient();Ticket ticket = client.getTickets(searchFilter).get(0);Activity activity = new Activity();activity.setTicketId(ticketId);activity.setTicketAssigneeId(ticket.getAssigneeId());activity.setTicketCategory(ticket.getCategory());activity.setTicketDescription(ticket.getDescription());activity.setTicketPriority(ticket.getPriority());activity.setTicketStatus(ticket.getStatus());activity.setType(ActivityType.RECEIVED_EMAIL_FROM_CUSTOMER);activity.setCreatorId(CRMConstants.ADMIN_AGENT_ID);activity.setIsRead(false);if (ticket.isSetCustomerId()) {activity.setCustomerId(ticket.getCustomerId());}activity.setDescription(convertMessageToText(message));if (TicketStatus.CLOSED.equals(ticket.getStatus())) {ticket.setStatus(TicketStatus.REOPEN);}client = new CRMClient().getClient();client.updateTicket(ticket, activity);} catch (TTransportException e) {log.error("Could not update ticket " + ticketId + " with mail "+ message, e);} catch (TException e) {log.error("Could not update ticket " + ticketId + " with mail "+ message, e);} catch (MessagingException e) {log.error("Could not update ticket " + ticketId + " with mail "+ message, e);} catch (IOException e) {log.error("Could not update ticket " + ticketId + " with mail "+ message, e);}}private void createTicket(Message message) throws MessagingException,IOException, TException, UserContextException {String description = convertMessageToText(message);Ticket ticket = new Ticket();ticket.setCreatorId(CRMConstants.ADMIN_AGENT_ID);ticket.setCategory(TicketCategory.OTHER);String customerEmailId = parseEmailId(message.getFrom()[0].toString());in.shop2020.model.v1.user.UserContextService.Client userClient = new UserClient().getClient();User user = userClient.getUserByEmail(customerEmailId);if (user == null || user.getUserId() == -1) {ticket.setCustomerEmailId(customerEmailId);} else {ticket.setCustomerId(user.getUserId());}ticket.setDescription(description);ticket.setPriority(TicketPriority.MEDIUM);ticket.setStatus(TicketStatus.OPEN);log.info("Creating activity!");Activity activity = new Activity();activity.setDescription(description);activity.setTicketCategory(ticket.getCategory());activity.setTicketDescription(ticket.getDescription());activity.setTicketPriority(ticket.getPriority());activity.setTicketStatus(ticket.getStatus());activity.setType(ActivityType.RECEIVED_EMAIL_FROM_CUSTOMER);activity.setCreatorId(CRMConstants.ADMIN_AGENT_ID);activity.setIsRead(false);client = new CRMClient().getClient();client.insertTicket(ticket, activity);}// parsing email Id from strings like// "Pankaj Jain <ponkoj@hotmail.com>"private String parseEmailId(String address) {Pattern p = Pattern.compile("^.*<(.+)>.*$");Matcher m = p.matcher(address);if (m.matches()) {address = m.group(1);}return address;}private String convertMessageToText(Message message)throws MessagingException, IOException {String messageContent = getText(message);String content = "From: " + message.getFrom()[0].toString()+ "\n\nSubject: " + message.getSubject() + "\n\nBody: "+ messageContent;if (content.length() > DESCRIPTION_MAX_WIDTH) {content = content.substring(0, DESCRIPTION_MAX_WIDTH);content += "\n\nTHIS TEXT IS TRUNCATED. PLEASE VISIT INBOX TO SEE COMPLETE DETAILS.";}return content;}/*** Return the primary text content of the message.*/private String getText(Part p) throws MessagingException, IOException {if (p.isMimeType("text/*")) {String s = (String) p.getContent();return s;}if (p.isMimeType("multipart/alternative")) {// prefer plain text over html textMultipart mp = (Multipart) p.getContent();String text = null;for (int i = 0; i < mp.getCount(); i++) {Part bp = mp.getBodyPart(i);if (bp.isMimeType("text/html")) {if (text == null)text = getText(bp);continue;} else if (bp.isMimeType("text/plain")) {String s = getText(bp);if (s != null)return s;} else {return getText(bp);}}return text;} else if (p.isMimeType("multipart/*")) {Multipart mp = (Multipart) p.getContent();for (int i = 0; i < mp.getCount(); i++) {String s = getText(mp.getBodyPart(i));if (s != null)return s;}}return null;}}