Programming/spring
스프링 메일 가져오기 (첨부파일 저장)
너도갈래
2019. 11. 5. 15:22
지난 글에서 스프링으로 메일을 보내는 기능을 포스팅했었는데요. 구글링 했을때 메일보내는 기능은 많이 나오는데 가져오는 기능은 많이 없더라구요. 이번에는 받은편지함에서 메일을 가져오고 거기에 첨부파일을 일괄저장하는 방법은 포스팅해볼까합니다.
먼저, pom.xml에 dependency를 추가해요.
<!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.0</version>
</dependency>
자바단 코드작성
public class EmailReader {
private String saveDirectory;
/**
* 첨부파일이 저장될 위치 설정
*
* @param dir
*/
public void setSaveDirectory(String dir) {
this.saveDirectory = dir;
}
/**
* Google gmail에 접근하여 지정한 기간 내에 모든 메일 가져오기
*
* @param userName
* @param password
* @param startDate
* @param endDate
* @throws MessagingException
*/
public void receiveMailAttachedFile(String userName, String password, Date startDate, Date endDate) throws MessagingException {
Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imaps");
try {
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps");
store.connect("imap.gmail.com", userName, password);
// 받은편지함을 INBOX 라고 한다.
Folder inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
SearchTerm olderThan = new ReceivedDateTerm (ComparisonTerm.LT, startDate);
SearchTerm newerThan = new ReceivedDateTerm (ComparisonTerm.GT, endDate);
SearchTerm andTerm = new AndTerm(olderThan, newerThan);
// 받은 편지함에 있는 메일 모두 읽어오기
//Message[] arrayMessages = inbox.getMessages();
// 검색한 기간에 해당하는 메일 읽어오기
Message[] arrayMessages = inbox.search(andTerm);
for (int i = arrayMessages.length; i > 0; i--) {
Message msg = arrayMessages[i-1];
Address[] fromAddress = msg.getFrom();
// 메일 내용 변수에 담기
String from = fromAddress[0].toString();
String subject = msg.getSubject();
String sentDate = msg.getSentDate().toString();
String receivedDate = msg.getReceivedDate().toString();
String contentType = msg.getContentType();
String messageContent = "";
String attachFiles = "";
// 첨부파일
if (contentType.contains("multipart")) {
Multipart multiPart = (Multipart) msg.getContent();
int numberOfParts = multiPart.getCount();
for (int partCount = 0; partCount < numberOfParts; partCount++) {
MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(partCount);
if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {
// 첨부파일 있을 경우 지정 폴더로 저장
String fileName = part.getFileName();
attachFiles += fileName + ", ";
part.saveFile(saveDirectory + File.separator + fileName);
} else {
// 메일 내용 저장
messageContent = part.getContent().toString();
}
}
if (attachFiles.length() > 1) {
attachFiles = attachFiles.substring(0,
attachFiles.length() - 2);
}
} else if (contentType.contains("text/plain") || contentType.contains("text/html")) {
Object content = msg.getContent();
if (content != null) {
messageContent = content.toString();
}
}
// 읽어온 메일 콘솔창 출력
System.out.println("Message #" + (i + 1) + ":");
System.out.println("\t From: " + from);
System.out.println("\t Subject: " + subject);
System.out.println("\t Received: " + sentDate);
System.out.println("\t Message: " + messageContent);
System.out.println("\t Attachments: " + attachFiles);
}
// disconnect
inbox.close(false);
store.close();
} catch (NoSuchProviderException e) {
e.printStackTrace();
System.exit(1);
} catch (MessagingException e) {
e.printStackTrace();
System.exit(2);
} catch (IOException ex) {
ex.printStackTrace();
}
}
/**
* pop3 서버이용에 필요한 계정정보
*/
public static void main(String[] args) {
String userName = "????@gmail.com";
String password = "????";
Date startDate = new SimpleDateFormat("yyyy-MM-dd").parse("2019-11-05");
Date endDate = new SimpleDateFormat("yyyy-MM-dd").parse("2019-11-01");
String saveDirectory = "C:\\저장위치";
EmailReader receiver = new EmailReader();
receiver.setSaveDirectory(saveDirectory);
receiver.receiveMailAttachedFile(userName, password, startDate, endDate);
}
}
코딩과 더불어 구글계정 보안설정, 지메일 환경설정을 변경해야해요.
이전에 스프링 메일보내기 글과 똑같이 변경하면 기능 정상적으로 잘 돌아가요.