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; } }