今回は、JavaMailを使ってメールの受信、および送信おこなう方法を紹介します。
JavaMailとは、Javaに標準実装されているメール送信APIです。
簡単な実装で、メールの受信と送信をおこなうことができます。
今回は、Yahooメールを使用した実装サンプルを紹介します。
環境情報
環境の情報は以下になります。
今回は、Yahooメールを使ってメールの送受信をおこなってみます。
メールはYahooのフリーアカウントを使用します。
- Java1.8.60
- POP3:Yahooメール
- SMTP:Yahooメール
Yahooメールを受信する
メール受信プログラムは以下になります。
YahooメールのPOP3サーバに接続し、受信ボックスに存在するメールを取得して標準出力をおこなっています。
22行目のIDとパスワードは、自分のYahooメールのIDをパスワードを使用してください。
import java.util.Properties; import javax.mail.Session; import javax.mail.Store; import javax.mail.Folder; import javax.mail.Message; public class MailReceive { public static void main(String[] args){ System.out.print("start: main\r\n"); try { // メール受信のプロパティ設定 Properties props = new Properties(); props.put("mail.pop3.host", "pop.mail.yahoo.co.jp"); props.put("mail.pop3.port", "110"); // メール受信フォルダをオープン Session session = Session.getDefaultInstance(props); Store store = session.getStore("pop3"); store.connect("ID", "PW"); Folder folderInbox = store.getFolder("INBOX"); folderInbox.open(Folder.READ_ONLY); // メッセージ一覧を取得 Message[] arrayMessages = folderInbox.getMessages(); for (int lc = 0; lc < arrayMessages.length; lc++) { // メッセージの取得 Message message = arrayMessages[lc]; // 件名の取得と表示 String subject = message.getSubject(); System.out.print("件名:" + subject + "\r\n"); // 本文の取得と表示 String content = message.getContent().toString(); System.out.print("本文:" + content + "\r\n"); // 取得の最大件数は10件 if (lc >= 10) { break; } System.out.print("\r\n"); } } catch (Exception e) { System.out.print("例外が発生!"); e.printStackTrace(); } finally { } System.out.print("end: main\r\n"); } }
Javaメールのメール受信をおこなえるようにするためには、Yahooメールでの設定変更が必要です。
Yahooメールの設定画面で、POPサーバについて、Yahoo公式サービス以外からのアクセスを許可します。
送信の場合はSMTPを使うので、POPとSMTPについては許可設定をしておく必要があります。
Yahooメールを送信する
次にメール送信です。
メールの送信元がYahooメールで、メールの送信先もYahooメールにしています。
自分自身にメールを送っています。
IDとパスワード、メールアドレスについては、実際に送信する情報にあわせて修正が必要になります。
import java.util.Properties; import javax.mail.Address; import javax.mail.Session; import javax.mail.Store; import javax.mail.Folder; import javax.mail.Message; import javax.mail.PasswordAuthentication; import javax.mail.Transport; import javax.mail.Multipart; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; public class MailSend { public static void main(String[] args){ System.out.print("start: main\r\n"); try { // メール送信のプロパティ設定 Properties props = new Properties(); props.put("mail.smtp.host", "smtp.mail.yahoo.co.jp"); props.put("mail.smtp.port", "587"); props.put("mail.smtp.auth", "true"); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.ssl.trust", "*"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.connectiontimeout", "10000"); props.put("mail.smtp.timeout", "10000"); // セッションを作成する Session session = Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("ID", "PW"); } }); // メールの送信先はYahooメール。送信元もYahooメール Message message = new MimeMessage(session); message.setFrom(new InternetAddress( "fromAddress", "fromName")); message.setReplyTo(new Address[]{ new InternetAddress("toAddress")}); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("toAddress")); message.setSubject("テスト"); MimeBodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText("テストメール。"); // メールのメタ情報を作成 Multipart multipart = new MimeMultipart(); multipart.addBodyPart(messageBodyPart); message.setHeader( "Content-Transfer-Encoding", "base64"); // メールを送信する message.setContent(multipart); Transport.send(message); } catch (Exception e) { System.out.print("例外が発生!\r\n"); e.printStackTrace(); } finally { } System.out.print("end: main\r\n"); } }
筆者がちょっとはまったのが、以下の例外が発生した場合です。
javax.mail.NoSuchProviderException: No provider for smtp at javax.mail.Session.getProvider(Session.java:464) at javax.mail.Session.getTransport(Session.java:659) at javax.mail.Session.getTransport(Session.java:640) at javax.mail.Session.getTransport(Session.java:697) at javax.mail.Transport.send0(Transport.java:192) at javax.mail.Transport.send(Transport.java:124) at MailSend.main(MailSend.java:55)
“smtpのプロバイダーが存在しないよ”、と言われてしまっています。
この例外が発生する場合は、実行時のクラスパスに「mail.jar」が含まれていないときです。
「mail.jar」がない状態でビルドしてもビルドエラーにならないので、気が付きにくいかもしれません。
最後に
いかがでしたでしょうか?
Javaメールを使った、メール受信とメール送信の方法について紹介しました。
今回はYahooメールを使用したメール送受信方法を紹介しましたが、他メールサービスでも試してみたいと思います。(いつか。。。)
それではまた!