2010年4月2日金曜日

Google App Engineでメール受信の機能をためす

久々に、GoogleAppEngineで遊んでみる。

従来から、メールを受信して、その内容に応じて何らかの
メールを返すみたいなアプリケーションを作ってみたかったのだので、
ためしに、メールの受信・送信をGAE[Java]上で試してみた。

まず、参考にしたページは、下記です。
ほとんど、この通りにやってけば、問題なく動くところまでいけます。
●受信
http://code.google.com/intl/en/appengine/docs/java/mail/receiving.html

●送信
http://code.google.com/intl/en/appengine/docs/java/mail/usingjavamail.html

ほとんど、上に書いていることだけど、一応、一通りポイントを書いておく。

appengine-web.xmlをいじくってメールの受信を行えるように追記をする。
(Rootの要素として)

==========================
<inbound-services>
  <service>mail</service> 
</inbound-services>

==========================


次にweb.xmlをいじってサーブレットのマッピングを行う。


=========================
<servlet>
  <servlet-name>mailhandler</servlet-name> 
  <servlet-class>MailHandlerServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
  <servlet-name>mailhandler</servlet-name> 
  <url-pattern>/_ah/mail/*</url-pattern> 
</servlet-mapping> 
<security-constraint> 
  <web-resource-collection> 
    <url-pattern>/_ah/mail/*</url-pattern> 
  </web-resource-collection> 
  <auth-constraint> 
    <role-name>admin</role-name> 
  </auth-constraint> 
</security-constraint>
==========================


ちなみにメールのあて先は、下記のように@以前の文字は任意の
文字列が利用できるので、この文字列により、サーブレットの
振り分けも行うことができる。
<url-pattern>/_ah/mail/*</url-pattern>


その場合には、下記のような感じでかけば振り分けられる
<url-pattern>/_ah/mail/support*</url-pattern>


これで、上記のサーブレットクラス「MailHandlerServlet」を
実装してあげれば、メールを受信できる用になる。

==========================
//受信して、そのまま返信するだけのサンプルコード

import java.io.IOException;

import java.io.IOException;  
import java.util.Properties;  
import java.util.logging.Logger;

import javax.mail.Address;
import javax.mail.MessagingException;
import javax.mail.Session;  
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;  
import javax.servlet.http.*; 
import javax.mail.Message; 

public class MailHandlerServlet extends HttpServlet {
 /**
  * 
  */
 private static final long serialVersionUID = 1L;

 public void doPost(HttpServletRequest req,  
            HttpServletResponse resp)  
 throws IOException {  
  Properties props = new Properties();
  Logger log = Logger.getLogger("MailHandlerServlet");
  log.info("Send  Mail");
   Address[] sendAdress=null ;
  Session session = Session.getDefaultInstance(props, null);  
  try {
   MimeMessage message = new MimeMessage(session, req.getInputStream());
   sendAdress = message.getFrom();
   log.info(sendAdress[0].toString());
  } catch (MessagingException e) {
   
   e.printStackTrace();
  }
  // 送信
      session = Session.getDefaultInstance(props, null); 
        
         String msgBody = "単に返信するだけです。"; 
  
         try { 
             Message msg = new MimeMessage(session); 
             msg.setFrom(new InternetAddress("takes90@gmail.com", "serviceAdmin")); 
             msg.addRecipient(Message.RecipientType.TO, sendAdress[0]); 
             msg.setSubject("It's Test"); 
             msg.setText(msgBody); 
             Transport.send(msg); 
             log.info("Send  Mail");
  
         } catch (AddressException e) { 
          e.printStackTrace();
         } catch (MessagingException e) { 
          e.printStackTrace();
         }
 }
}
==========================
これで、受信できるようになったので、まずは開発環境でテストしてみる。

これもきちんとツールが用意されている。

ローカル環境の

http://localhost:8888/_ah/admin/

にアクセスすると「Inbound Mail」というツールがあるので、それをクリックする。


ここから、送信すると先ほどのサーブレット「MailHandlerServlet 」が呼び出される
という感じです。
この段階では、メールは実際には送信されません。

で、うまく動きそうであれば、Deploy App Engine Projectを行えば、
実際に、メールを送信すると、すぐに帰ってくるのが確かめられます。

あとは、この中身のアプリを実装してあげれば思ったものができそうです。

0 件のコメント: