이곳저곳 참고했다.
라이브러리는 아래
<!--Mailing-->
<!-- https://mvnrepository.com/artifact/com.sun.mail/javax.mail -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.4</version>
</dependency>
1.6.0 까지 나온 것 같은데 사용하는데 문제는 없음
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import javax.swing.*;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;
/**
* Created by eunbi on 2018-03-05.
*/
@Component
public class MailUtil {
@Value("${schedule.mail.sender.id}")
private String senderId;
@Value("${schedule.mail.sender.password}")
private String senderPassword;
@Value("${schedule.mail.sender.name}")
private String senderName;
@Value("${schedule.mail.charSet}")
private String charSet;
@Value("${schedule.mail.receiver}")
private String receiver;
private Logger logger = LoggerFactory.getLogger(WorkFlowService.class);
private MimeMessage mimeMessage;
private Multipart multipart;
StringBuilder sb;
/**
* 메일에 쓰일 설정을 초기화한다.
* @param senderId 송신자 아이디
* @param senderPassword 송신자 패스워드
* @param senderName 송신자 명
* @param receiver 수신 메일 아이디
*/
public void initConf(String senderId, String senderPassword, String senderName, String receiver){
this.senderId = senderId;
this.senderName = senderName;
this.senderPassword = senderPassword;
this.receiver = receiver;
}
/**
* 메일 세션을 초기화한다.
* @param title 메일제목
* @return
*/
public boolean createSession(String title){
sb = new StringBuilder();
sb.append("\n############### Send Mail ###############").append("\n");
sb.append("From : "+senderId +" <"+senderName+">").append("\n");
sb.append("To : "+ receiver).append("\n");
sb.append("Title : " + title).append("\n");
try {
//google 계정 인증
Authenticator auth = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(senderId, senderPassword);
}
};
//session 생성 및 MimeMessage생성
Session session = Session.getDefaultInstance(getProperties(), auth);
mimeMessage = new MimeMessage(session);
// 송신자 설정, 수신자 설정
InternetAddress from =
new InternetAddress(new String(senderName.getBytes(charSet), "8859_1") + "<"+senderName+">");
mimeMessage.setFrom(from);
mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));
// 제목, 보낼 시간 설정
mimeMessage.setSubject(title, "UTF-8");
mimeMessage.setSentDate(new Date());
multipart = new MimeMultipart();
}catch (Exception e){
logger.error(e.toString());
e.printStackTrace();
return false;
}
return true;
}
// public void sendMail(String receiver, String title, String content, String fileName){
/**
* 메일에 내용을 추가한다.
* @param content 추가할 내용
*/
public void addMsg(String content){
try {
MimeBodyPart mbp1 = new MimeBodyPart();
mbp1.setText(content);
multipart.addBodyPart(mbp1);
}catch (Exception e){
e.printStackTrace();
logger.error(e.toString());
}
}
/**
* 메일에 첨부파일을 추가한다.
* @param savePath 첨부파일 저장경로
* @param fileName 첨부파일 명
*/
public void addFile(String savePath,String fileName){
try{
//파일 첨부
sb.append("File : " + fileName).append("\n");
if(multipart!=null&&fileName != null){
DataSource source = new FileDataSource(savePath+"/"+fileName);
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(fileName);
multipart.addBodyPart(messageBodyPart);
}
}catch (AddressException addr_e) { //주소를 입력하지 않을 경우
JOptionPane.showMessageDialog(null, "메일을 입력해주세요", "메일주소입력", JOptionPane.ERROR_MESSAGE);
addr_e.printStackTrace();
}catch (MessagingException msg_e) { //메시지에 이상이 있을 경우
JOptionPane.showMessageDialog(null, "메일을 제대로 입력해주세요.", "오류발생", JOptionPane.ERROR_MESSAGE);
msg_e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
}
/**
* 메세지를 전송한다
* @return 전송여부
*/
public boolean sendMsg(){
try {
//if(mimeMessage!=null&&multipart!=null) {
sb.append("#########################################").append("\n");
mimeMessage.setContent(multipart);
Transport.send(mimeMessage);
logger.info(sb.toString());
} catch (Exception e){
JOptionPane.showMessageDialog(null, "메일을 제대로 입력해주세요.", "오류발생", JOptionPane.ERROR_MESSAGE);
logger.error(e.toString());
logger.error(e.getMessage());
return false;
}
return true;
}
/**
* Gmail 포트 등 Properties 설정
* @return properties
*/
public Properties getProperties(){
Properties prop = System.getProperties();
prop.put("mail.smtp.starttls.enable", "true");
prop.put("mail.smtp.host", "smtp.gmail.com"); // smtp 서버 호스트
prop.put("mail.smtp.auth","true");
prop.put("mail.smtp.port", "587");
return prop;
}
}
메일링 유틸을 하나 만들었다.
사용은 아래와 같이 하면 된다.
@Async
@Scheduled(cron = "0 30 * * * *")
public void schedule1(){
String deviceCountFileName =fileName+"_deviceCount";
Calendar checkDate = Calendar.getInstance();
checkDate.add(Calendar.DATE, -1);
String date = new SimpleDateFormat("yyyy-MM-dd").format(checkDate.getTime());
List<Map<String, Object>> deviceCount = workflowMapper.selectDeviceCount(date);
List<Map<String, Object>> equipData = workflowMapper.selectEquipData(date);
mailUtil.createSession("SERVER_REPORT-"+date);
mailUtil.addMsg("Server Report : "+date+"\n");
addFile(date,equipDataFileName,equipData);
addFile(date,deviceCountFileName,deviceCount);
// send Mail
mailUtil.sendMsg();
}
public void addFile(String date, String fileName, List<Map<String, Object>> exportData){
mailUtil.addMsg(fileName+"-"+date+" Attachment . . ( count : " +exportData.size()+") \n");
mailUtil.addFile(savePath, fileName + "-" + date + ".csv");
}
*결과
SERVER_REPORT-2018-03-15
받은편지함 | x |
| 3월 16일 (3일 전) | |||
Server Report : 2018-03-15
serverReport_equipDataHourly-
serverReport_deviceCount-2018-
위의 유틸의 함수는 아래와 같다.
/**
* 메일에 쓰일 설정을 초기화한다.
* @param senderId 송신자 아이디
* @param senderPassword 송신자 패스워드
* @param senderName 송신자 명
* @param receiver 수신 메일 아이디
*/
public void initConf(String senderId, String senderPassword, String senderName, String receiver)
송신자의 설정을 한다. 나는 Value를 바인딩햇지만 나중에 송/수신자가 다를것을 고려하여 세터를 만들엇다.
함수명이 setConf라고 해도 될꺼같다.
/**
* 메일 세션을 초기화한다.
* @param title 메일제목
* @return
*/
public boolean createSession(String title)
메일 세션을 new한다. 위에서 설정한 conf도 같이 할당한다.
메일제목이 왜 여깃냐하면
나는 송/수신자가 고정되고 메일제목만 바뀌어서 ㅎㅎ;;;;
내껀데뭐
/**
* 메일에 내용을 추가한다.
* @param content 추가할 내용
*/
public void addMsg(String content)
메일 내용을 추가한다.
/**
* 메일에 첨부파일을 추가한다.
* @param savePath 첨부파일 저장경로
* @param fileName 첨부파일 명
*/
public void addFile(String savePath,String fileName)
메일 첨부파일을 추가한다.
처음엔 그냥 경로 하나만 받앗는데
그럼 보낼때 풀패스가 파일명으로 오더라
읽어들일 파일 경로랑 파일명을 분리해서
첨부는 파일명으로만 햇다
/**
* 메세지를 전송한다
* @return 전송여부
*/
public boolean sendMsg()
위의 설정이 다 끝나면 메일을 보낸다.
익셉션 처리가 덜되잇다. 주희하기
'Develope > Programming' 카테고리의 다른 글
[JAVA] CSV Mapper 를 이용하여 CSV 파일 매핑하기 (0) | 2018.06.01 |
---|---|
[Jolokia] Tomcat + JMX + Jolokia + Telegraf (0) | 2018.05.28 |
[Kafka] 1. 카프카 설치 및 실행 (분산 클러스터링) (0) | 2018.01.04 |
[JAVA] 2차원 배열 Deep copy, swallow Copy (0) | 2017.12.04 |
[JAVA] Mapped Statements collection already contains value (1) | 2017.11.16 |