Develope/Programming

[JAVA] Gmail API 이용해서 메일 보내기 (파일 첨부)

고로이 2018. 3. 19. 10:24
반응형

 이곳저곳 참고했다.



라이브러리는 아래



<!--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

SERVER @gmail.com

첨부파일3월 16일 (3일 전)
에게

Server Report : 2018-03-15

serverReport_equipDataHourly-

2018-03-15 Attachment . . ( count : 12000)

serverReport_deviceCount-2018-03-15 Attachment . . ( count : 500)


 첨부파일 2
 
 



위의 유틸의  함수는 아래와 같다.



/**
* 메일에 쓰일 설정을 초기화한다.
* @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()



위의 설정이 다 끝나면 메일을 보낸다.

익셉션 처리가 덜되잇다. 주희하기



반응형