content: package com.ctrip.framework.apollo.portal.spi.ctrip;
  
  import com.ctrip.framework.apollo.portal.component.config.PortalConfig;
  import com.ctrip.framework.apollo.portal.entity.bo.Email;
  import com.ctrip.framework.apollo.tracer.Tracer;
  
  import org.apache.commons.lang.time.DateUtils;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  import org.springframework.beans.factory.annotation.Autowired;
  
  import java.lang.reflect.Method;
  import java.util.Calendar;
  import java.util.Date;
  import java.util.List;
  
  import javax.annotation.PostConstruct;
  
  public class CtripEmailRequestBuilder {
  
    private static final Logger logger = LoggerFactory.getLogger(CtripEmailRequestBuilder.class);
  
    private static Class sendEmailRequestClazz;
    private static Method setBodyContent;
    private static Method setRecipient;
    private static Method setSendCode;
    private static Method setBodyTemplateID;
    private static Method setSender;
    private static Method setSubject;
    private static Method setIsBodyHtml;
    private static Method setCharset;
    private static Method setExpiredTime;
    private static Method setAppID;
  
    @Autowired
    private PortalConfig portalConfig;
  
  
    @PostConstruct
    public void init() {
      try {
        sendEmailRequestClazz = Class.forName("com.ctrip.framework.apolloctripservice.emailservice.SendEmailRequest");
  
        setSendCode = sendEmailRequestClazz.getMethod("setSendCode", String.class);
        setBodyTemplateID = sendEmailRequestClazz.getMethod("setBodyTemplateID", Integer.class);
        setSender = sendEmailRequestClazz.getMethod("setSender", String.class);
        setBodyContent = sendEmailRequestClazz.getMethod("setBodyContent", String.class);
        setRecipient = sendEmailRequestClazz.getMethod("setRecipient", List.class);
        setSubject = sendEmailRequestClazz.getMethod("setSubject", String.class);
        setIsBodyHtml = sendEmailRequestClazz.getMethod("setIsBodyHtml", Boolean.class);
        setCharset = sendEmailRequestClazz.getMethod("setCharset", String.class);
        setExpiredTime = sendEmailRequestClazz.getMethod("setExpiredTime", Calendar.class);
        setAppID = sendEmailRequestClazz.getMethod("setAppID", Integer.class);
  
      } catch (Throwable e) {
        logger.error("init email request build failed", e);
        Tracer.logError("init email request build failed", e);
      }
    }
  
  
    public Object buildEmailRequest(Email email) throws Exception {
  
      Object emailRequest = createBasicEmailRequest();
  
      setSender.invoke(emailRequest, email.getSenderEmailAddress());
      setSubject.invoke(emailRequest, email.getSubject());
      String emailBodyBuilder = "<entry><content><![CDATA[<!DOCTYPE html>" +
              email.getBody() +
              "]]></content></entry>";
      setBodyContent.invoke(emailRequest, emailBodyBuilder);
      setRecipient.invoke(emailRequest, email.getRecipients());
  
      return emailRequest;
    }
  
    private Object createBasicEmailRequest() throws Exception {
      Object request = sendEmailRequestClazz.newInstance();
  
      setSendCode.invoke(request, portalConfig.sendCode());
      setBodyTemplateID.invoke(request, portalConfig.templateId());
      setIsBodyHtml.invoke(request, true);
      setCharset.invoke(request, "UTF-8");
      setExpiredTime.invoke(request, calExpiredTime());
      setAppID.invoke(request, portalConfig.appId());
  
      return request;
    }
  
  
    private Calendar calExpiredTime() {
  
      Calendar calendar = Calendar.getInstance();
      calendar.setTime(DateUtils.addHours(new Date(), portalConfig.survivalDuration()));
  
      return calendar;
    }
  
  
  }
  