「JavaMail」マルチパートメールの送受信サンプル

JavaMail でマルチパートメールの送受信するサンプル書いてみました。わざわざメモするような内容じゃないかもですが、一応。

送信側


package test.multipart;

import java.io.File;
import java.util.Date;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;


public class SendMultiPartTest {
	public static void main(String[] args) {
		String to = "*****@centos62.example.com";
		String from = "*****@centos62.example.com";
		String host = "centos62.example.com";
		//boolean debug = true;

		Properties props = System.getProperties();
		props.setProperty("mail.smtp.host", host);

		Session session = Session.getInstance(props, null);
		//session.setDebug(debug);

		try {
			MimeBodyPart mbp1 = new MimeBodyPart();
			mbp1.setText("hello");
			MimeBodyPart mbp2 = new MimeBodyPart();
			mbp2.attachFile(new File("hello.jpg"));
			MimeMultipart mmp = new MimeMultipart();
			mmp.addBodyPart(mbp1);
			mmp.addBodyPart(mbp2);
			
			Message msg = new MimeMessage(session);
			msg.setFrom(new InternetAddress(from));
			msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));
			msg.setSubject("MimeMultipart Test");
			msg.setSentDate(new Date());
			msg.setContent(mmp);

			Transport.send(msg);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

テキストと添付ファイル ( JPG ファイル ) をマルチパートで送信している感じです。


受信側


package test;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.util.Properties;

import javax.mail.BodyPart;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.MimeMultipart;

import com.sun.mail.pop3.POP3Store;
import com.sun.mail.util.BASE64DecoderStream;

public class ReceiveMultiPartTest {
	public static void main(String[] args) {

		String host = "centos62.example.com";
		String username = "*****";
		String password = "*****";
		// boolean debug = true;

		try {
			Properties props = new Properties();
			props.setProperty("mail.pop3.host", host);
			Session session = Session.getInstance(props);
			// session.setDebug(debug);

			POP3Store store = (POP3Store) session.getStore("pop3");
			store.connect(username, password);

			Folder folder = store.getFolder("INBOX");
			folder.open(Folder.READ_ONLY);

			int count = folder.getMessageCount();
			Message msg = folder.getMessage(count);
			System.out.println("Email Number " + msg.getMessageNumber());
			System.out.println("Subject: " + msg.getSubject());
			System.out.println("From: " + msg.getFrom()[0]);

			MimeMultipart mmp = (MimeMultipart) msg.getContent();
			BodyPart bp1 = mmp.getBodyPart(0);
			System.out.println("Body: " + bp1.getContent().toString());

			BodyPart bp2 = mmp.getBodyPart(1);
			storeAttachFile(bp2);

			System.out.println("Date: " + msg.getSentDate());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void storeAttachFile(BodyPart bp) {
		try (BASE64DecoderStream stream = (BASE64DecoderStream) bp.getContent();
				FileOutputStream fos = new FileOutputStream("test.jpg");
				ByteArrayOutputStream baos = new ByteArrayOutputStream();) {
			int i;
			while ((i = stream.read()) != -1) {
				baos.write(i);
			}
			baos.writeTo(fos);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

上記の送信側サンプルのメールを受信するサンプルです。

ただ、受信側のサンプルは、どんなメールなのか ( 各パートにどんなデータがあるのか、また、そもそもマルチパートメールか否かも ) って点がわかってる前提なので、かなり不十分な感じです。イメージ的には以下のページにあるみたいに、getContent で取得されるオブジェクトの型を判定していくという処理が必要と思われる。

java - How to handle multipart/alternative mail with JavaMail? - Stack Overflow
http://stackoverflow.com/questions/13331989/how-to-handle-multipart-alternative-mail-with-javamail

というわけなのですが、ひとまず、今回は以上です。

[ 環境情報 ]
Windows 7 SP1
Java SE 8 Update 25
JavaMail 1.4