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);
    }
}

 

코딩과 더불어 구글계정 보안설정, 지메일 환경설정을 변경해야해요. 

이전에 스프링 메일보내기 글과 똑같이 변경하면 기능 정상적으로 잘 돌아가요.