はしくれSEめも

SEに必要情報をめも程度に残していこうと思っています。

【Java】メール接続~受信までのやり方 サンプルコードあり

メールとの連携は業務システムの開発において必要不可欠なものとなっています。
最近はSlackやLINEなどのコミュニケーションツールとの連携も多いですが、
日本の会社ではメールが根強くなってしまっています。
なので、日本においてはメールの需要はまだまだ続きそうです。

改めてJavaでのメール接続~受信までをめもしておきます。 POP3でのやり方になります。 コピペレベルでできると思いますので、以下をご活用ください。

※今回は、簡単な説明で納めておくため、テキストメール(添付なし)を例にさせていただきます。 HTMLメールは今後記載させていただきます。

/ 接続~受信BOXのOPENまで
Properties prop = new Properties();

// POP3サーバー(受信サーバー)の【IPアドレス】と【ポート】を設定
prop.setProperty("mail.pop3.host", 【IPアドレス】);
prop.setProperty("mail.pop3.port", 【ポート】);

// メールアカウントの【ユーザID】と【パスワード】を設定
Authenticator authenticator = new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication(){
        return new PasswordAuthentication(【ユーザID】, 【パスワード】);
    }
};

Session session = Session.getInstance(prop, authenticator);
Store store = session.getStore("pop3");
store.connect();

// 受信ボックスの設定。【INBOX】固定
Folder inbox = store.getDefaultFolder().getFolder("INBOX");

// 読み込みだけの時はFolder.READ_ONLYでOK
// inbox.open(Folder.READ_ONLY);
// メールサーバーから削除する場合は、Folder.READ_WRITEにする必要があります
inbox.open(Folder.READ_WRITE);

Message[] messages = inbox.getMessages();
// 受信メールの件数分ループ
for (Message message : messages) {

    // 件名
    String subject = MimeUtility.decodeText(message.getSubject());
    
    System.out.println("subject: " + subject);
    
    // 差出人
    Address[] from = message.getFrom();
    String mailAddress = getAddress(MimeUtility.decodeText(from[0].toString()));

    System.out.println("mail_address: " + mailAddress);

    // 受信日時
    Date receivedDate = message.getSentDate();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    String dateTimeText = sdf.format(receivedDate);

    System.out.println("receivedDate: " + dateTimeText);

    Part part = message;
    String msgText = "";
    
    // メール本文を【part.getContent().toString()】で取得
    if (part.isMimeType("text/plain")) {
        // テキストメール
        msgText = part.getContent().toString();
    }else if (part.isMimeType("multipart/*")) {
        // HTMLメール
        // ToDo
    }
    System.out.println("----------\n" + msgText + "----------\n");
}

inbox.close(true); // 読み込みだけの時はfalaeでOK
store.close();