JavaEE-JavaMail 05受信、解析、返信、検索メール例

25949 ワード

POP 3プロトコルとIMAPプロトコルの違い
  • POP 3プロトコルは、電子メールクライアントがサーバ上のメールをダウンロードすることを許可するが、クライアントの操作[モバイルメール、タグ既読など]では、サーバ上の
  • にフィードバックしない.
  • IMAPプロトコルはWebMailと電子メールクライアント間の双方向通信を提供し、クライアントの操作はいずれもサーバーに同期して反応し、メールに対する操作は、サーバー上のメールも対応する動作を行い、例えばクライアントがメールボックスの中の3通のメールを受け取り、そのうちの1通を既読とマークし、他の2通を削除とマークする.これらの操作は、サーバ上の
  • に即座にフィードバックされます.
  • 両プロトコルはIMAPプロトコルよりも便利で信頼性が高く、POP 3はメールを紛失したり、同じメールを複数回ダウンロードしたりしやすいが、IMAPプロトコルはメールクライアントを通じてWebMailとの双方向同期機能がこれらの問題をよく回避している
  • POP 3プロトコルを使用したメールの表示
    /********************************************************************************
     * Project Name      [JavaEE_Components]
     * File Name         [CheckingMailsByPop3.java]
     * Creation Date     [2015-01-01]
     * 
     * Copyright© [email protected] All Rights Reserved
     * 
     * Work hard, play harder, think big and keep fit
     ********************************************************************************/
    package javamail.mail;
    
    import java.util.Properties;
    
    import javax.mail.Folder;
    import javax.mail.Message;
    import javax.mail.Session;
    import javax.mail.Store;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import javamail.utils.MailConstants;
    import javamail.utils.PasswordUtils;
    
    /**
     *   POP3      
     * 
     * @author      (Sean Yang aka ShortPeace)
     * @version 1.0
     * @since jdk 1.8
     * 
     */
    public class CheckingMailsByPop3 {
    
        private static Properties properties = null;
    
        private static String emailAddress = "[email protected]";
    
        @Before
        public void init() {
            properties = new Properties();
            properties.put("mail.store.protocol", MailConstants.PROTOCAL_POP3);
            properties.put("mail.pop3.host", MailConstants.POP3_HOST_OF_SINA);
            properties.put("mail.pop3.port", MailConstants.POP3_PORT_OF_SINA);
            properties.put("mail.pop3.auth", MailConstants.IS_AUTHORIZATION_NEED);
            properties.put("mail.debug", String.valueOf(MailConstants.IS_DEBUG_MOD_ENABLED));
        }
    
        /**
         *   POP3           
         * 
         * @throws Exception
         */
        public static void checkMailsByPop3() throws Exception {
            //   Session           
            Session session = Session.getInstance(properties);
            Store store = session.getStore(MailConstants.PROTOCAL_POP3);
            store.connect(emailAddress, PasswordUtils.readPassword(emailAddress));
    
            //      
            Folder folder = store.getFolder("INBOX");
            //           ,       Folder.READ_WRITE
            folder.open(Folder.READ_ONLY);
    
            // POP3           
            // getUnreadMessageCount            ,
            // getNewMessageCount getDeletedMessageCount  0
            System.out.println("     " + folder.getMessageCount() + " ");
            System.out.println("    " + folder.getNewMessageCount() + " ");
            System.out.println("     " + folder.getUnreadMessageCount() + " ");
            System.out.println("     " + folder.getDeletedMessageCount() + " ");
    
            //       
            Message[] messages = folder.getMessages();
            System.out.println("   " + messages.length);
    
            folder.close(true);
            store.close();
        }
    
        @Test
        public void testCheckMailsByPop3() throws Exception {
            checkMailsByPop3();
        }
    }

    IMAPプロトコルを使用したメールの表示
    /********************************************************************************
     * Project Name       [JavaEE_Components]
     * File Name         [CheckingMailsByImap.java]
     * Creation Date     [2015-01-01]
     * 
     * Copyright© [email protected] All Rights Reserved
     * 
     * Work hard, play harder, think big and keep fit
     ********************************************************************************/
    package javamail.mail;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.Properties;
    
    import javax.mail.Flags.Flag;
    import javax.mail.Folder;
    import javax.mail.Message;
    import javax.mail.Session;
    import javax.mail.Store;
    import javax.mail.internet.MimeUtility;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import com.sun.mail.imap.IMAPMessage;
    
    import javamail.utils.MailConstants;
    import javamail.utils.MailUtils;
    import javamail.utils.PasswordUtils;
    
    /**
     *   IMAP      
     * 
     * @author      (Sean Yang aka ShortPeace)
     * @version 1.0
     * @since jdk 1.8
     * 
     */
    public class CheckingMailsByImap {
    
        private static Properties properties = null;
    
        private static String emailAddress = "[email protected]";
    
        @Before
        public void init() {
            properties = new Properties();
            properties.put("mail.store.protocol", MailConstants.PROTOCAL_IMAP);
            properties.put("mail.imap.host", MailConstants.IMAP_HOST_OF_SINA);
            properties.put("mail.imap.port", MailConstants.IMAP_PORT_OF_SINA);
            properties.put("mail.imap.auth", MailConstants.IS_AUTHORIZATION_NEED);
            properties.put("mail.debug", String.valueOf(MailConstants.IS_DEBUG_MOD_ENABLED));
        }
    
        /**
         *   IMAP           
         * 
         * @throws Exception
         */
        public static void checkMailsByImap() throws Exception {
            //   Session           
            Session session = Session.getInstance(properties);
            Store store = session.getStore("imap");
            store.connect(emailAddress, PasswordUtils.readPassword(emailAddress));
    
            //      
            Folder folder = store.getFolder("INBOX");
            //      
            folder.open(Folder.READ_WRITE);
    
            //       
            System.out.println("     " + folder.getMessageCount() + " ");
            System.out.println("    " + folder.getNewMessageCount() + " ");
            System.out.println("     " + folder.getUnreadMessageCount() + " ");
            System.out.println("     " + folder.getDeletedMessageCount() + " ");
    
            //          
            Message[] messages = folder.getMessages();
            for (Message message : messages) {
                IMAPMessage imapMessage = (IMAPMessage) message;
                String subject = MimeUtility.decodeText(imapMessage.getSubject());
                boolean isSeen = MailUtils.isSeen(imapMessage);
                if (!isSeen) {
                    System.out.println("[" + subject + "]  ,       ?");
    
                    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
                    String answer = reader.readLine();
                    if ("yes".equalsIgnoreCase(answer)) {
                        //        ,          
                        message.setFlag(Flag.SEEN, true);
                    }
                }
            }
            folder.close(true);
            store.close();
        }
    
        @Test
        public void testCheckMailsByImap() throws Exception {
            checkMailsByImap();
        }
    }

    メールの内容を解析する
    前に定義したMailUtilsを修正し、対応する解析方法を追加します.
    ブログの制限を超えているため、次の記事は単独でリストされます
    返信メール、POP 3プロトコルでメールを表示、SMTPプロトコルで返信メールを送信
    /********************************************************************************
     * Project Name      [JavaEE_Components]
     * File Name         [ReplyingMails.java]
     * Creation Date     [2015-01-01]
     * 
     * Copyright© [email protected] All Rights Reserved
     * 
     * Work hard, play harder, think big and keep fit
     ********************************************************************************/
    package javamail.mail;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.Date;
    import java.util.Properties;
    
    import javax.mail.Folder;
    import javax.mail.Message;
    import javax.mail.Message.RecipientType;
    import javax.mail.Session;
    import javax.mail.Store;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeUtility;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import javamail.utils.MailConstants;
    import javamail.utils.PasswordUtils;
    
    /**
     *   POP3 SMTP       <br/>
     * 
     * POP3         <br/>
     * SMTP         <br/>
     * 
     * @author      (Sean Yang aka ShortPeace)
     * @version 1.0
     * @since jdk 1.8
     * 
     */
    public class ReplyingMails {
    
        private static Properties properties;
    
        private static String emailAddress = "[email protected]";
    
        @Before
        public void init() {
            properties = new Properties();
            properties.put("mail.store.protocol", MailConstants.PROTOCAL_POP3);
            properties.put("mail.pop3.host", MailConstants.POP3_HOST_OF_SINA);
            properties.put("mail.pop3.port", MailConstants.POP3_PORT_OF_SINA);
            properties.put("mail.pop3.auth", MailConstants.IS_AUTHORIZATION_NEED);
    
            properties.put("mail.smtp.host", MailConstants.SMTP_HOST_OF_SINA);
            properties.put("mail.smtp.port", MailConstants.SMTP_PORT_OF_SINA);
            properties.put("mail.smtp.auth", MailConstants.IS_AUTHORIZATION_NEED);
            properties.put("mail.debug", String.valueOf(MailConstants.IS_DEBUG_MOD_ENABLED));
        }
    
        /**
         *     
         * 
         * @throws Exception
         */
        public static void replayMails() throws Exception {
            Session session = Session.getInstance(properties);
            Store store = session.getStore(MailConstants.PROTOCAL_POP3);
            store.connect(emailAddress, PasswordUtils.readPassword(emailAddress));
    
            Folder folder = store.getFolder("INBOX");
            folder.open(Folder.READ_WRITE);
    
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    
            Message[] messages = folder.getMessages();
            if (messages != null && messages.length > 0) {
                for (Message message : messages) {
                    String from = InternetAddress.toString(message.getFrom());
                    if (from != null) {
                        System.out.println("   : " + MimeUtility.decodeText(from));
                    }
    
                    String replayTo = InternetAddress.toString(message.getReplyTo());
                    if (replayTo != null) {
                        System.out.println("  : " + MimeUtility.decodeText(replayTo));
                    }
    
                    String to = InternetAddress.toString(message.getRecipients(RecipientType.TO));
                    System.out.println("   : " + MimeUtility.decodeText(to));
    
                    String subject = message.getSubject();
                    if (subject != null) {
                        System.out.println("  : " + MimeUtility.decodeText(subject));
                    }
    
                    Date sendDate = message.getSentDate();
                    if (sendDate != null) {
                        System.out.println("    : " + sendDate);
                    }
    
                    System.out.println("      ?");
                    String answer = reader.readLine();
                    if ("yes".equalsIgnoreCase(answer)) {
                        MimeMessage replayMessage = new MimeMessage(session);
                        replayMessage = (MimeMessage) message.reply(false);
                        replayMessage.setFrom(new InternetAddress(to));
                        replayMessage.setText("        ...");
                        replayMessage.setReplyTo(message.getReplyTo());
                        Transport transport = session.getTransport(MailConstants.PROTOCOL_SMTP);
                        transport.connect(MailConstants.SMTP_HOST_OF_SINA, emailAddress,
                                PasswordUtils.readPassword(emailAddress));
                        transport.sendMessage(replayMessage, replayMessage.getAllRecipients());
                        transport.close();
                    } else {
                        break;
                    }
                }
            }
    
            folder.close(true);
            store.close();
        }
    
        @Test
        public void testReplayMails() throws Exception {
            replayMails();
        }
    }

    転送メール、POP 3プロトコルでメールを表示、SMTPプロトコルでメールを転送
    /********************************************************************************
     * Project Name      [JavaEE_Components]
     * File Name         [ForwardingMails.java]
     * Creation Date     [2015-01-01]
     * 
     * Copyright© [email protected] All Rights Reserved
     * 
     * Work hard, play harder, think big and keep fit
     ********************************************************************************/
    package javamail.mail;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.Date;
    import java.util.Properties;
    
    import javax.mail.Folder;
    import javax.mail.Message;
    import javax.mail.Message.RecipientType;
    import javax.mail.Multipart;
    import javax.mail.Session;
    import javax.mail.Store;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    import javax.mail.internet.MimeUtility;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import javamail.utils.MailConstants;
    import javamail.utils.PasswordUtils;
    
    /**
     *   POP3 SMTP       <br/>
     * 
     * POP3         <br/>
     * SMTP         <br/>
     * 
     * @author      (Sean Yang aka ShortPeace)
     * @version 1.0
     * @since jdk 1.8
     * 
     */
    public class ForwardingMails {
    
        private static Properties properties;
    
        private static String emailAddress = "[email protected]";
    
        @Before
        public void init() {
            properties = new Properties();
            properties.put("mail.store.protocol", MailConstants.PROTOCAL_POP3);
            properties.put("mail.pop3.host", MailConstants.POP3_HOST_OF_SINA);
            properties.put("mail.pop3.port", MailConstants.POP3_PORT_OF_SINA);
            properties.put("mail.pop3.auth", MailConstants.IS_AUTHORIZATION_NEED);
    
            properties.put("mail.smtp.host", MailConstants.SMTP_HOST_OF_SINA);
            properties.put("mail.smtp.port", MailConstants.SMTP_PORT_OF_SINA);
            properties.put("mail.smtp.auth", MailConstants.IS_AUTHORIZATION_NEED);
            properties.put("mail.debug", String.valueOf(MailConstants.IS_DEBUG_MOD_ENABLED));
        }
    
        /**
         *     
         * 
         * @throws Exception
         */
        public static void fowrardMails() throws Exception {
            Session session = Session.getInstance(properties);
            Store store = session.getStore(MailConstants.PROTOCAL_POP3);
            store.connect(emailAddress, PasswordUtils.readPassword(emailAddress));
    
            Folder folder = store.getFolder("INBOX");
            folder.open(Folder.READ_WRITE);
    
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    
            Message[] messages = folder.getMessages();
            if (messages != null && messages.length > 0) {
                for (Message message : messages) {
                    String from = InternetAddress.toString(message.getFrom());
                    if (from != null) {
                        System.out.println("   : " + MimeUtility.decodeText(from));
                    }
    
                    String replayTo = InternetAddress.toString(message.getReplyTo());
                    if (replayTo != null) {
                        System.out.println("  : " + MimeUtility.decodeText(replayTo));
                    }
    
                    String to = InternetAddress.toString(message.getRecipients(RecipientType.TO));
                    System.out.println("   : " + MimeUtility.decodeText(to));
    
                    String subject = message.getSubject();
                    if (subject != null) {
                        System.out.println("  : " + MimeUtility.decodeText(subject));
                    }
    
                    Date sendDate = message.getSentDate();
                    if (sendDate != null) {
                        System.out.println("    : " + sendDate);
                    }
    
                    System.out.println("      ?");
                    String answer = reader.readLine();
                    if ("yes".equalsIgnoreCase(answer)) {
                        MimeMessage forwardMessage = new MimeMessage(session);
                        forwardMessage.setRecipients(RecipientType.TO, InternetAddress.parse(from));
                        forwardMessage.setFrom(new InternetAddress(to));
                        forwardMessage.setSubject("  : " + subject);
    
                        MimeBodyPart messageBodyPart = new MimeBodyPart();
                        Multipart multipart = new MimeMultipart();
                        messageBodyPart.setContent(message, "message/rfc822");
                        multipart.addBodyPart(messageBodyPart);
                        forwardMessage.setContent(multipart);
                        forwardMessage.saveChanges();
    
                        Transport transport = session.getTransport(MailConstants.PROTOCOL_SMTP);
                        transport.connect(MailConstants.SMTP_HOST_OF_SINA, emailAddress,
                                PasswordUtils.readPassword(emailAddress));
                        transport.sendMessage(forwardMessage, forwardMessage.getAllRecipients());
                        transport.close();
                    } else {
                        break;
                    }
                }
            }
    
            folder.close(true);
            store.close();
        }
    
        @Test
        public void testForwardMails() throws Exception {
            fowrardMails();
        }
    }

    メールの削除
    /********************************************************************************
     * Project Name      [JavaEE_Components]
     * File Name         [DeletingMails.java]
     * Creation Date     [2015-01-01]
     * 
     * Copyright© [email protected] All Rights Reserved
     * 
     * Work hard, play harder, think big and keep fit
     ********************************************************************************/
    package javamail.mail;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.Date;
    import java.util.Properties;
    
    import javax.mail.Flags;
    import javax.mail.Folder;
    import javax.mail.Message;
    import javax.mail.Message.RecipientType;
    import javax.mail.Session;
    import javax.mail.Store;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeUtility;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import javamail.utils.MailConstants;
    import javamail.utils.PasswordUtils;
    
    /**
     *     ,       <br/>
     * 
     *            <br/>
     * Flags.Flag.ANSWERED<br/>
     * Flags.Flag.DELETED<br/>
     * Flags.Flag.DRAFT<br/>
     * Flags.Flag.FLAGGED<br/>
     * Flags.Flag.RECENT<br/>
     * Flags.Flag.SEEN<br/>
     * Flags.Flag.USER<br/>
     * 
     * @author      (Sean Yang aka ShortPeace)
     * @version 1.0
     * @since jdk 1.8
     * 
     */
    public class DeletingMails {
    
        private static Properties properties;
    
        private static String emailAddress = "[email protected]";
    
        @Before
        public void init() {
            properties = new Properties();
            properties.put("mail.store.protocol", MailConstants.PROTOCAL_POP3);
            properties.put("mail.pop3.host", MailConstants.POP3_HOST_OF_SINA);
            properties.put("mail.pop3.port", MailConstants.POP3_PORT_OF_SINA);
            properties.put("mail.pop3.auth", MailConstants.IS_AUTHORIZATION_NEED);
    
            properties.put("mail.smtp.host", MailConstants.SMTP_HOST_OF_SINA);
            properties.put("mail.smtp.port", MailConstants.SMTP_PORT_OF_SINA);
            properties.put("mail.smtp.auth", MailConstants.IS_AUTHORIZATION_NEED);
            properties.put("mail.debug", String.valueOf(MailConstants.IS_DEBUG_MOD_ENABLED));
        }
    
        /**
         *     
         * 
         * @throws Exception
         */
        public static void deleteMails() throws Exception {
            Session session = Session.getInstance(properties);
            Store store = session.getStore(MailConstants.PROTOCAL_POP3);
            store.connect(emailAddress, PasswordUtils.readPassword(emailAddress));
    
            Folder folder = store.getFolder("INBOX");
            folder.open(Folder.READ_WRITE);
    
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    
            Message[] messages = folder.getMessages();
            if (messages != null && messages.length > 0) {
                for (Message message : messages) {
                    String from = InternetAddress.toString(message.getFrom());
                    if (from != null) {
                        System.out.println("   : " + MimeUtility.decodeText(from));
                    }
    
                    String replayTo = InternetAddress.toString(message.getReplyTo());
                    if (replayTo != null) {
                        System.out.println("  : " + MimeUtility.decodeText(replayTo));
                    }
    
                    String to = InternetAddress.toString(message.getRecipients(RecipientType.TO));
                    System.out.println("   : " + MimeUtility.decodeText(to));
    
                    String subject = message.getSubject();
                    if (subject != null) {
                        System.out.println("  : " + MimeUtility.decodeText(subject));
                    }
    
                    Date sendDate = message.getSentDate();
                    if (sendDate != null) {
                        System.out.println("    : " + sendDate);
                    }
    
                    System.out.println("         ?");
                    String answer = reader.readLine();
                    if ("yes".equalsIgnoreCase(answer)) {
                        message.setFlag(Flags.Flag.DELETED, true);
                        System.out.println("      ");
                    } else {
                        break;
                    }
                }
            }
    
            folder.close(true);
            store.close();
        }
    
        @Test
        public void testDeleteMails() throws Exception {
            deleteMails();
        }
    }

    メールの検索
    /********************************************************************************
     * Project Name      [JavaEE_Components]
     * File Name         [SearchingMails.java]
     * Creation Date     [2015-01-01]
     * 
     * Copyright© [email protected] All Rights Reserved
     * 
     * Work hard, play harder, think big and keep fit
     ********************************************************************************/
    package javamail.mail;
    
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Properties;
    
    import javax.mail.Folder;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.Session;
    import javax.mail.Store;
    import javax.mail.URLName;
    import javax.mail.search.AndTerm;
    import javax.mail.search.BodyTerm;
    import javax.mail.search.ComparisonTerm;
    import javax.mail.search.FromStringTerm;
    import javax.mail.search.IntegerComparisonTerm;
    import javax.mail.search.NotTerm;
    import javax.mail.search.OrTerm;
    import javax.mail.search.SearchTerm;
    import javax.mail.search.SentDateTerm;
    import javax.mail.search.SizeTerm;
    import javax.mail.search.SubjectTerm;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import javamail.utils.MailConstants;
    import javamail.utils.PasswordUtils;
    
    /**
     *     
     * 
     * @author      (Sean Yang aka ShortPeace)
     * @version 1.0
     * @since jdk 1.8
     * 
     */
    public class SearchingMails {
    
        private static Properties properties = null;
    
        private static String emailAddress = "[email protected]";
        private static URLName url;
    
        @Before
        public void init() {
            properties = new Properties();
            properties.put("mail.pop3.auth", MailConstants.IS_AUTHORIZATION_NEED);
            properties.put("mail.debug", String.valueOf(MailConstants.IS_DEBUG_MOD_ENABLED));
            url = new URLName(MailConstants.PROTOCAL_POP3, MailConstants.POP3_HOST_OF_SINA,
                    Integer.parseInt(MailConstants.POP3_PORT_OF_SINA), null, emailAddress,
                    PasswordUtils.readPassword(emailAddress));
        }
    
        /**
         *     
         * 
         * @throws Exception
         */
        public static void searchMails() throws Exception {
            //   Session           
            Session session = Session.getInstance(properties);
            Store store = session.getStore(url);
            store.connect(emailAddress, PasswordUtils.readPassword(emailAddress));
    
            //      
            Folder folder = store.getFolder("INBOX");
            //           ,       Folder.READ_WRITE
            folder.open(Folder.READ_ONLY);
    
            //            
            Message[] messages = searchMails(folder);
            System.out.println("     " + messages.length + " ");
        }
    
        /**
         *         
         * 
         * @param folder
         * @return
         * @throws MessagingException
         */
        @SuppressWarnings("unused")
        private static Message[] searchMails(Folder folder) throws MessagingException {
            //     
            String subject = "java";
            SearchTerm subjectTerm = new SubjectTerm(subject);
    
            //      
            String emailFrom = "[email protected]";
            SearchTerm fromTerm = new FromStringTerm(emailFrom);
    
            //     
            String content = "html";
            SearchTerm bodyTerm = new BodyTerm(content);
    
            SearchTerm andTerm = new AndTerm(subjectTerm, fromTerm);
            SearchTerm notTerm = new NotTerm(bodyTerm);
            SearchTerm orTerm = new OrTerm(andTerm, notTerm);
    
            //             
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
            Date monday = calendar.getTime();
            SearchTerm geTerm = new SentDateTerm(ComparisonTerm.GE, monday);
            SearchTerm leTerm = new SentDateTerm(ComparisonTerm.LE, new Date());
            SearchTerm dateRangeTerm = new AndTerm(geTerm, leTerm);
    
            //     
            int size = 1024 * 100; // 100kb
            SearchTerm mailSizeTerm = new SizeTerm(IntegerComparisonTerm.GE, size);
    
            return folder.search(dateRangeTerm);
        }
    
        @Test
        public void testSearchMails() throws Exception {
            searchMails();
        }
    }