문제: 관리자 화면단에서 고객 내용에 답변하는 HTML형식의 메일 발송하는데
HTML을 알아서 인식하여 적용된 화면을 보여주는 메일 사업자도 있었으나
사용자가 많은 네이버나 다음메일에서는 적용이 안되고 HTML형식의 태그가 달린 원본글이 그대로 노출되었다.
연구 : sb.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
메일 내용에 메타테그 될줄 알았으나... 발송되는 문자열 자체를
그냥 통으로 인식해서 문자열 내부에 메타태그를 사용하더라도 인식이 안되는건 당연하다.
해결 : MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "utf-8");
helper.setText(body, true); // *HTML 적용!!
기존발송시에는 Simple mail 인가 ? 보냈는데 그건 HTML설정하는 부분이 없어 MimeMessage 를 사용하니 잘되었다.
예>
- Controller 단 -
@SuppressWarnings("static-access")
@RequestMapping("/QNAXxxxxxxxx.do")
public ModelAndView qnaModify(HttpServletRequest request, HttpServletResponse response) throws Exception {
log.debug("QnaController qnaModify Start");
ServiceDataVo param = new ServiceDataVo();
bind(request, param);
//leftMenu 값
LeftMenuDataVo leftMenu = new LeftMenuDataVo();
bind(request, leftMenu);
//Session 체크
if (!"".equals(userInfo(request)) && !isbReturnValue()) {
return new ModelAndView(userInfo(request));
}
LogDataVo logDataVo = util.setLogDataVo(request.getRequestURL().toString(), "U", userInfo.getUserId(), Const.QNA_UPDATE, userInfo.getUpperType());
param.setReply_id(userInfo.getUserId());
int updateResult = serviceManageService.getQnaModify(request, param, logDataVo);
param.setCarrigeRetrun("View");
ServiceDataVo result = serviceManageService.getQnaView(param);
// 메일내용
if(updateResult == 1) {
StringBuffer sb = new StringBuffer();
sb.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
sb.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">");
sb.append("<head>");
sb.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
sb.append("<title>고객센터</title>");
sb.append("</head>");
sb.append("<body style=\"font-family: Arial, '맑은 고딕', 'Malgun Gothic', Dotum, '돋움',sans-serif, Helvetica; font-size:12px; color:#464646; line-height:0;\">");
sb.append("<div style=\"width:100%; padding:20px 0;\">");
sb.append("<div style=\"width:700px; margin:0 auto;\">");
sb.append("<img src=\"http://xxxxxxxxxx.co.kr/images/mail_title.jpg\" width=\"700px\" height=\"80px\" />");
sb.append("<div style=\"padding:30px;\">");
sb.append("<p>여러분의 소중한 의견과 함께 커가는 xxxxx 고객센터입니다.</p>");
sb.append("<p style=\"background-color:#f4f4f4; color:#754c24; border:1px solid #d7d7d7; padding:30px; text-align:center; font-size:18px; font-weight:bold; margin-bottom:50px;\">문의하신 내용에 답변 드립니다.</p>");
sb.append("<p style=\"line-height:1.6em;\">문의하신 질문에 대한 답변입니다.</p>");
sb.append("<div style=\"background:url(http://xxxxxxxxxx.co.kr/images/icon_a.jpg) left 25px no-repeat; border-top:1px solid #d7d7d7; border-bottom:1px solid #d7d7d7; padding:10px 10px 10px 50px; margin-bottom:50px;\">");
sb.append("<p style=\"line-height:1.6em; color:#754c24;\">");
sb.append(result.getReply_body());
sb.append("</p>");
sb.append("</div>");
sb.append("<p style=\"line-height:1.6em;\">고객께서 문의하신 내용입니다.</p>");
sb.append("<<div style=\"background:url(http://xxxxxxxxxxx..co.kr/images/icon_q.jpg) left center no-repeat; border-top:1px solid #d7d7d7; border-bottom:1px solid #d7d7d7; padding:10px 10px 10px 50px;\">");
sb.append("<p style=\"line-height:1.4em; font-weight:bold;\">" + result.getTitle() + "</p>");
sb.append("<p style=\"font-size:11px; color:#636363;\">" + result.getRegistration_date_time() + "</p>");
sb.append("</div>");
sb.append("<div style=\"padding:20px 50px; line-height:1.6em; border-bottom:1px solid #d7d7d7;\">");
sb.append(result.getBody());
sb.append("</div>");
sb.append("</div>");
sb.append("<div style=\"font-size:11px; color:#636363; background-color:#f4f4f4; line-height:1.3em; padding:20px 30px; margin-top:50px;\">");
sb.append("본 메일은 발신 전용이므로 메일로 문의 시 확인이 불가능합니다.<br />");
sb.append("다른 궁금하신 사항은 웹사이트(<a href=\"http://xxxxxxxkr\" target=\"_blank\">www.smartmedia.co.kr</a>)의 FAQ에서 확인 또는 Q&A에서 문의해 주세요.<br />");
sb.append("Copyrjght 2014 dfsdfdf All rights reserved.");
sb.append("</div>");
sb.append("</div>");
sb.append("</div>");
sb.append("</body>");
sb.append("</html>");
mailService.send("문의하신 내용에 답변 드립니다.", sb.toString(), Const.WEBMASTER_EMAIL_ID, result.getEmail());
}
FileInformationVo fileDataVo = new FileInformationVo();
fileDataVo.setLinkType(Const.QNA_LINK);
fileDataVo.setLinkID(param.getBbs_id());
fileDataVo.setReplayYN("Y");
List<FileInformationVo> file = systemService.getFileInfoList(fileDataVo);
ModelAndView mav = new ModelAndView();
mav.addObject("qna",result);
mav.addObject("userInfo", userInfo);
mav.addObject("leftMenu", leftMenu);
mav.addObject("file", file);
mav.addObject("param", param);
mav.setViewName("serviceManage/ows/qnaView.do");
return mav;
}
----------------------------------------
package com.osp.common.util;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import com.osp.common.exception.DoException;
@Service("MailService")
public class MailServiceImpl implements MailService {
private static final Logger log = LoggerFactory.getLogger(MailServiceImpl.class);
private JavaMailSender mailSender;
private SimpleMailMessage messageSource;
public void setMailSender(JavaMailSender mailSender) {
this.mailSender = mailSender;
}
public void setMessageSource(SimpleMailMessage messageSource) {
this.messageSource = messageSource;
}
@Override
public void send(SimpleMailMessage arg0) throws MailException {
}
@Override
public void send(SimpleMailMessage[] arg0) throws MailException {
}
public boolean send(String subject, String body, String fromUser, String toUser) throws DoException{
log.debug("Mail Send !!");
try{
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "utf-8");
helper.setText(body, true); //***HTML 적용
helper.setTo(toUser);
helper.setSubject(subject);
helper.setFrom("support@smartmedia.co.kr");
mailSender.send(mimeMessage);
return true;
} catch (MailException e) {
e.printStackTrace();
return false;
} catch (Throwable e) {
e.printStackTrace();
return false;
}
}
public boolean sendFileAttach(String subject, String body, String fromUser, String toUser, String FileName ) throws MailException{
MimeMessage message = mailSender.createMimeMessage();
try{
MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "UTF-8");
messageHelper.setSubject(subject);
messageHelper.setText(body, true);
messageHelper.setFrom(fromUser);
//messageHelper.setTo(new InternetAddress(member.getEmail(), member.getName(), "UTF-8"));
messageHelper.setTo(new InternetAddress(toUser, "KBS", "UTF-8"));
DataSource dataSource = new FileDataSource("c:\\통합 문서1.xlsx");
messageHelper.addAttachment(MimeUtility.encodeText("통합 문서1.xlsx", "UTF-8", "B"), dataSource);
mailSender.send(message);
return true;
} catch (MailException e) {
e.printStackTrace();
return false;
} catch (Throwable e) {
e.printStackTrace();
return false;
}
}
}
---------------------------
servlet-osp.xml // 발송만 잘되게 설정을 맞게 해주면된다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:context="http://www.springframework.org/schema/context"
.....
생략
<!-- SET default mail properties --> // 메일 발신 입력
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="dsmtp.naver.com" />
<property name="port" value="587" />
<property name="username" value="support@xxxxxxxxxx.co.kr" />
<property name="password" value="xxxxxxxx" />
<property name="javaMailProperties">
<props>
<prop key="mail.transport.protocol">smtp</prop>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
<prop key="mail.smtp.EnableSSL.enable">true</prop>
<prop key="mail.mime.charset">UTF-8</prop>
<prop key="mail.debug">true</prop>
</props>
</property>
</bean>
<!-- You can have some pre-configured messagess also which are ready to send -->
<bean id="mailMessage" class="org.springframework.mail.SimpleMailMessage">
<property name="to" value=""></property>
<property name="from" value="sport@xxxxxxxxxx.co.kr"></property>
<property name="subject" value="FATAL - Application crash. Save your job !!"/>
</bean>
<bean id="MailService" class="com.sp.common.util.MailServiceImpl">
<property name="mailSender"><ref bean="mailSender"/></property>
<property name="messageSource"><ref bean="mailMessage"/></property>
</bean>
</beans>