Google App Engine for Java でデータストアに保存したデータからメールを送信

Google App Engine for Java で受信したメールをデータストアに保存 の続き。
データストアに保存したメールデータを利用してメールを送信するよ。

データストアから受信メールデータを取得

受信後すぐに送信するので本当はデータストアから取得する必要はないのだけどw
sentDateで並び替えて最新の1件を取得。

            // データストアから最新の1件を取得
            String query = "select from " + ReceivedMail.class.getName() + " order by sentDate desc range 0,1"; 
            List<ReceivedMail> mailList = (List<ReceivedMail>) pm.newQuery(query).execute();
            ReceivedMail storedMail = mailList.get(0);

取得した受信メールデータを送信メールに入力して送信

送信元に返信。件名はそのままで、本文には送信元、送信先、件名、本文を設定。
件名は文字コードを設定しないと文字化けした。本文は何故か平気だった。

            if(!(storedMail==null)) {
                Message sendMsg = new MimeMessage(session);
                
                // 送信元(From)の設定
                sendMsg.setFrom(new InternetAddress(ADMIN_MAIL_ADDRESS));
                
                // 送信先(To)の設定
                sendMsg.addRecipients(Message.RecipientType.TO, InternetAddress.parse(storedMail.getFrom()));
                
                // 件名(Subject)の設定
                ((MimeMessage)sendMsg).setSubject(storedMail.getSubject(), "UTF-8");
                
                // 本文(text)の設定
                StringBuffer sb = new StringBuffer();
                sb.append("From:" + storedMail.getFrom() + "\n");
                sb.append("To:" + storedMail.getTo() + "\n");
                sb.append("Sbuject:" + storedMail.getSubject() + "\n");
                sb.append("Body:\n" + storedMail.getText());
                sendMsg.setText(sb.toString());
                
                // メールの送信
                Transport.send(sendMsg);
            }

一応、メール関連の動作確認サンプルは完成?

メール受信、データストアへ保存、メール送信を一通り実行するサンプルが完成。
ひとまずこれで終了かな。

package jp.kuronicle.kuromail;

import java.io.IOException;
import java.util.List;
import java.util.Properties;

import javax.jdo.PersistenceManager;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jp.kuronicle.kuromail.datastore.ReceivedMail;

public class MailHandlerServlet extends HttpServlet {

    private static final String ADMIN_MAIL_ADDRESS = "hogehoge@fugafuga.appspotmail.com";

    public void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {

        PersistenceManager pm = PMF.get().getPersistenceManager();
        Properties prop = new Properties();
        Session session = Session.getDefaultInstance(prop, null);

        try {
            // 受信メールを取得
            MimeMessage recMsg = new MimeMessage(session, req.getInputStream());

            // 永続化用JDOに値を入力
            ReceivedMail mail = new ReceivedMail();
            mail.setSentDate(recMsg.getSentDate());
            mail.setFrom(recMsg.getFrom()[0].toString());
            mail.setTo(recMsg.getAllRecipients()[0].toString());
            mail.setSubject(recMsg.getSubject());
            mail.setText(this.getText(recMsg.getContent()));
            
            // 永続化
            pm.makePersistent(mail);
            
            // データストアから最新の1件を取得
            String query = "select from " + ReceivedMail.class.getName() + " order by sentDate desc range 0,1"; 
            List<ReceivedMail> mailList = (List<ReceivedMail>) pm.newQuery(query).execute();
            ReceivedMail storedMail = mailList.get(0);
            
            if(!(storedMail==null)) {
                Message sendMsg = new MimeMessage(session);
                
                // 送信元(From)の設定
                sendMsg.setFrom(new InternetAddress(ADMIN_MAIL_ADDRESS));
                
                // 送信先(To)の設定
                sendMsg.addRecipients(Message.RecipientType.TO, InternetAddress.parse(storedMail.getFrom()));
                
                // 件名(Subject)の設定
                ((MimeMessage)sendMsg).setSubject(storedMail.getSubject(), "UTF-8");
                
                // 本文(text)の設定
                StringBuffer sb = new StringBuffer();
                sb.append("From:" + storedMail.getFrom() + "\n");
                sb.append("To:" + storedMail.getTo() + "\n");
                sb.append("Sbuject:" + storedMail.getSubject() + "\n");
                sb.append("Body:\n" + storedMail.getText());
                sendMsg.setText(sb.toString());
                
                // メールの送信
                Transport.send(sendMsg);
            } 
        } catch (MessagingException e) {
            e.printStackTrace();
        } finally {
            pm.close();
        }
    }

    private String getText(Object content) throws IOException,
            MessagingException {
        String text = null;
        StringBuffer sb = new StringBuffer();

        if (content instanceof String) {
            sb.append((String) content);
        } else if (content instanceof Multipart) {
            Multipart mp = (Multipart) content;
            for (int i = 0; i < mp.getCount(); i++) {
                BodyPart bp = mp.getBodyPart(i);
                sb.append(getText(bp.getContent()));
            }
        }

        text = sb.toString();
        return text;
    }
}