JavaでHello World
Google
  HOME  |  基礎  |  掲示板  |  ツール |  書籍  |  デザインパターン  |  リンク  |  フィードバック
JavaでHello World > JavaMail (POP)編  
メニュー
Home
情報交換掲示板
ツールの部屋
Java関連の書籍
アプリケーション編
Swing編
Swing(イベント)編
Swing(Look&Feel)編
アプレット編
iアプリ編
サーブレット編
サーブレット(Linux)編
サーブレット(web.xml)編
サーブレット(セッション)編
サーブレット(クッキー)編
サーブレット(フィルタ)編
JSP編
JSP(ディレクティブ)編
JSP(アクション)編
JSP(スクリプト)編
JSP(オブジェクト)編
JSP(カスタムタグ)編
JSP(データベース)編
Apache + Tomcat編
Struts編
JDBC編
JDBC(データソース)編
JDBC(MySQL)編
JDBC(PostgreSQL)編
JDBC(トランザクション)編
JavaMail(SMTP)編
JavaMail(POP)編
JNI編
RMI編
RMI(アプレット)編
CORBA編
JNDI編
EJB編
EJB(Entity Bean)編
JMS(PTP)編
JMS(Pub/Sub)編
XML(SAX)編
XML(DOM)編
XSLT編
SOAP編
国際化編
国際化(タイムゾーン)編
国際化(通貨)編
リフレクション編
コレクション編
コレクション(Set)編
コレクション(List)編
コレクション(Map)編
スレッド編
正規表現編
アサーション編
ログ機能編
サウンド編
ファイル入出力編
URL編
ソケット編
データグラム編
HTTP
FTP編
jar編
javadoc編
Ant編
外部コマンド編
プロパティファイル編
システムプロパティ編
Eclipse編
  2002/02/03  田中宏和
Last Update 2002/12/07
JavaMail (POP)編
◆POPとは?
POPPost Office Protocolの略です。メールを受信するときに使われるプロトコルです。JavaMailのAPIを使用するとこのプロトコルを詳しく知らなくても簡単にメールを受信するプログラムを作ることができます。
◆JavaMailとは?
JavaMailとはJavaのプログラムから、メールの送受信を行うためのAPIです。JavaMailのAPIを使用してJavaでメールを送受信するプログラムを作成することができます。
◆ここでの環境
OS Windows XP
J2SE SDK 1.4.1_01
◆メール受信に使用するライブラリ
JavaMail バージョン1.3
JAF(JavaBeans Activation Framework) バージョン1.0.2
◆JavaMailのライブラリをCLASSPATHに設定
■mail.jarをCLASSPATHに設定
まずJavaMailをダウンロードします。
ダウンロード → JavaMail
ダウンロードしたファイルを解凍してください。解凍したフォルダに入っているmail.jarをCLASSPATHに設定します。
■activation.jarをCLASSPATHに設定
JavaMailのライブラリで使用するJAF(JavaBeans Activation Framework)もダウンロードしてCLASSPATHに設定します。
ダウンロード → JAF
ダウンロードしたファイルを解凍したフォルダに入っているactivation.jarをCLASSPATHに設定してください。
 
◆プログラムの作成
以下がメールを受信して表示するプログラムです。ホストアドレス、アカウント、パスワードは環境に合わせて設定してください。
HelloWorldPOP.java(ここからダウンロード)
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

public class HelloWorldPOP {
  public static void main(String args[]) {
    try {
      String host="xxx.xxx.xxx.xxx"; // ホストアドレス
      String user="xxxxxx"; // アカウント
      String password="xxxxxx"; // パスワード

      // 接続します
      Session session = Session.getDefaultInstance(System.getProperties(), null);
      Store store = session.getStore("pop3");
      store.connect(host, -1, user, password);

      // フォルダーを開きます
      Folder folder = store.getFolder("INBOX");
      folder.open(Folder.READ_ONLY);

      // フォルダーにあるメッセージの数を取得します
      int totalMessages = folder.getMessageCount();
      if (totalMessages == 0) {
          System.out.println("メールは0件です");
          folder.close(false);
          store.close();
          return;
      }

      // メッセージを取得します
      Message[] messages = folder.getMessages();
      for (int i = 0; i < messages.length; i++) {
        // メッセージを表示します
        showMessage(messages[i]);
      }

      // フォルダーを閉じます
      folder.close(false);
      store.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  /**
   * メールの内容を表示します
   */
  public static void showMessage(Message m) throws Exception {
    Address[] a;
    // 差出人
    if ((a = m.getFrom())!=null) {
      for (int j = 0; j < a.length; j++) {
        System.out.println("差出人: " + MimeUtility.decodeText(a[j].toString()));
      }
    }

    // 宛先
    if ((a = m.getRecipients(Message.RecipientType.TO))!=null) {
      for (int j = 0; j < a.length; j++) {
        System.out.println("宛先: " + MimeUtility.decodeText(a[j].toString()));
      }
    }
    // 題名
    System.out.println("題名: " + m.getSubject());
    // 日付
    Date d = m.getSentDate();
    System.out.println("日付: " + (d!= null ? d.toString() : "不明"));
    // サイズ
    System.out.println("サイズ: " + m.getSize());
    // 内容
    System.out.println("内容:\n" + m.getContent());
  }
}
 
 
◆コンパイル
コマンドプロンプト
C:\JavaHello\POP>javac HelloWorldPOP.java

C:\JavaHello\POP>

◆実行
実行するわけですが、接続するサーバーのメールボックスにメールを送信しておかないと受信できません。ここでは、「JavaMailでHello World」という題名で内容が「Hello World」のメールを送信してあります。実行してみましょう!
コマンドプロンプト

C:\JavaHello\POP>java HelloWorldPOP
差出人: Hirokazu Tanaka <java@hellohiro.com>
宛先: java@hellohiro.com
題名: JavaMailでHello World
日付: Sat Dec 07 01:45:58 JST 2002
サイズ: 15
内容:
Hello World

C:\JavaHello\POP>

おおおおお!受信して表示できましたね!!
 
◆添付ファイルの受信
上のソースだと添付ファイルを受信できません。添付ファイルが受信できるように改造してみましょう。
HelloWorldPOPA.java(ここからダウンロード)
import javax.mail.*;
import javax.mail.internet.*;
import java.io.*;
import java.util.*;

public class HelloWorldPOPA {
  static int attachnum = 1;

  public static void main(String args[]) {
    try {
      String host="xxx.xxx.xxx.xxx"; // ホストアドレス
      String user="xxxxxx"; // アカウント
      String password="xxxxxx"; // パスワード

      // 接続します
      Session session = Session.getDefaultInstance(System.getProperties(), null);
      Store store = session.getStore("pop3");
      store.connect(host, -1, user, password);

      // フォルダーを開きます
      Folder folder = store.getFolder("INBOX");
      folder.open(Folder.READ_ONLY);

      // フォルダーにあるメッセージの数を取得します
      int totalMessages = folder.getMessageCount();
      if (totalMessages == 0) {
          System.out.println("メールは0件です");
          folder.close(false);
          store.close();
          return;
      }

      // メッセージを取得します
      Message[] messages = folder.getMessages();
      for (int i = 0; i < messages.length; i++) {
        // メッセージを表示します
        dumpPart(messages[i]);
      }

      // フォルダーを閉じます
      folder.close(false);
      store.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }


  public static void dumpPart(Part p) throws Exception {
    String html = "";
    boolean attachment = false;

    if (p instanceof Message) {
      showMessage((Message)p);
    }

    if (p.isMimeType("text/plain")) { // テキストの場合
      System.out.println("内容:\n" + p.getContent());
    } else if (p.isMimeType("multipart/*")) { // マルチパートの場合
      Multipart mp = (Multipart)p.getContent();
      int count = mp.getCount();
      for (int i = 0; i < count; i++) {
        dumpPart(mp.getBodyPart(i));
      }
    } else if (p.isMimeType("message/rfc822")) { // メッセージの場合
      dumpPart((Part)p.getContent());
    } else if (p.isMimeType("text/html")) { // HTMLの場合
      html = ".html";
      attachment = true;
    } else { // その他の場合
      attachment = true;
    }



    /**
    * 添付ファイルを保存します
    */
    if (attachment) {
      String disp = p.getDisposition();
      // 添付ファイルの場合
      if (disp == null || disp.equalsIgnoreCase(Part.ATTACHMENT)) {
        String filename = p.getFileName();
        if (filename!=null) {
          filename =  MimeUtility.decodeText(filename);
        } else {
          filename = "添付ファイル" + attachnum++ + html;
        }
        try {
          File f = new File(filename);
          if (f.exists()) {
            throw new IOException("同名のファイルが存在します");
          }
          OutputStream os = new BufferedOutputStream(new FileOutputStream(f));
          InputStream is = p.getInputStream();
          int c;
          while ((c = is.read()) != -1) {
            os.write(c);
          }
          os.close();
          System.out.println(filename + "を保存しました。");
        } catch (IOException e) {
          System.out.println("添付ファイルの保存に失敗しました。" + e);
        }
      }
    }
  }

  /**
   * メールの内容を表示します
   */
  public static void showMessage(Message m) throws Exception {
    Address[] a;
    // 差出人
    if ((a = m.getFrom())!=null) {
      for (int j = 0; j < a.length; j++) {
        System.out.println("差出人: " + MimeUtility.decodeText(a[j].toString()));
      }
    }

    // 宛先
    if ((a = m.getRecipients(Message.RecipientType.TO))!=null) {
      for (int j = 0; j < a.length; j++) {
        System.out.println("宛先: " + MimeUtility.decodeText(a[j].toString()));
      }
    }
    // 題名
    System.out.println("題名: " + m.getSubject());
    // 日付
    Date d = m.getSentDate();
    System.out.println("日付: " + (d!= null ? d.toString() : "不明"));
    // サイズ
    System.out.println("サイズ: " + m.getSize());
  }
}
 
 
◆コンパイルと実行
ここでは、あらかじめ「こんにちわ.txt」と「Hello.txt」という2つのファイルを添付したメールを送ってあります。コンパイルして実行してみましょう。
コマンドプロンプト
C:\JavaHello\POP>javac HelloWorldPOPA.java

C:\JavaHello\POP>java HelloWorldPOPA
差出人: Hirokazu Tanaka <java@hellohiro.com>
宛先: java@hellohiro.com
題名: JavaMailでHello World
日付: Sat Dec 07 01:58:45 JST 2002
サイズ: 700
内容:
添付ファイルを添付します。

こんにちわ.txtを保存しました。
Hello.txtを保存しました。

C:\JavaHello\POP>

おおお!表示されましたね!
添付ファイルが生成されているか見てみましょう。
おおお!生成されていますね!
 
■関連
JavaMail(SMTP)編
■書籍
Java関連の書籍

 
  ネットで買えば断然お得!お買い物なら楽天市場
ツールの部屋 - Java関連の書籍 - デザインパターン - 情報交換掲示板 - HOME