1. SIS Lab
  2. >
  3. Blog
  4. >
  5. GAEでデータストア登録 -サークルIT化のお手伝い

GAEでデータストア登録 -サークルIT化のお手伝い

更新日:2018.08.04 作成日:2010.09.23

勝手に思ってるサークルの問題点に勝手に取り組むシリーズ改め、「サークルIT化のお手伝い」で引き続きやっていこうと思います。今回は、GAEでデータストア登録です。

おさらい -こんなことがしたいんです!

新入生からのメールに対して、自動でGmailにアドレスを登録するところまで持ってきたい。
gae1

今回は、メール受信から次の3つを取得してデータストアに登録します。

  • メールアドレス
  • 件名
  • 本文

件名に自分の名前を入れてもらえれば、メールアドレスと件名を取得して、アドレス帳ができる。本文に記入するのは、予備ってことで。

今回も Google App Engine for Javaでのメール受信コード -きしだのはてな のソースを参考にしています。


今回新たに、

を付け加えました。データストアに登録するのって難しいです>_< いまいちよくわかってません。

そんで、デプロイ。GAE宛にメールを送ってみると・・・・

ちゃんとデータストアに登録されました!!感激♪
スクリーンショット(2010-09-23 10.13.10)


次は、Gmailにインポートするためのcsv出力ですね。



ソース

PMF.java
package javamail.util;

import javax.jdo.JDOHelper; import javax.jdo.PersistenceManagerFactory;

//永続化マネージャを管理 public final class PMF { private static final PersistenceManagerFactory pmfInstance = JDOHelper.getPersistenceManagerFactory("transactions-optional"); private PMF() {} public static PersistenceManagerFactory get(){ return pmfInstance; } }

ReceivedMail.java
package javamail;

import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey;

@PersistenceCapable(identityType=IdentityType.APPLICATION) public class ReceivedMail { @PrimaryKey @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY) private Long id;

<span class="synPreProc">@Persistent</span>
<span class="synType">private</span> String from;

<span class="synPreProc">@Persistent</span>
<span class="synType">private</span> String subject;

<span class="synPreProc">@Persistent</span>
<span class="synType">private</span> String text;


<span class="synType">public</span> String getFrom() {
	<span class="synStatement">return</span> from;
}

<span class="synType">public</span> String getSubject() {
	<span class="synStatement">return</span> subject;
}

<span class="synType">public</span> String getText() {
	<span class="synStatement">return</span> text;
}

<span class="synType">public</span> <span class="synType">void</span> setFrom(String from) {
	<span class="synType">this</span>.from = from;
}

<span class="synType">public</span> <span class="synType">void</span> setSubject(String subject) {
	<span class="synType">this</span>.subject = subject;
}

<span class="synType">public</span> <span class="synType">void</span> setText(String text) {
	<span class="synType">this</span>.text = text;
}

<span class="synType">public</span> <span class="synType">void</span> setId(Long id) {
	<span class="synType">this</span>.id = id;
}

<span class="synType">public</span> Long getId() {
	<span class="synStatement">return</span> id;
}

}

JavaMailServlet.java
package javamail;

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; import java.util.Properties;

import javamail.util.PMF;

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

@SuppressWarnings("serial") public class JavaMailServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { PersistenceManager pm = PMF.get().getPersistenceManager();

    Properties props = <span class="synStatement">new</span> Properties();
	Session session = Session.getDefaultInstance(props, <span class="synConstant">null</span>);

	<span class="synStatement">try</span> {
        MimeMessage message = <span class="synStatement">new</span> MimeMessage(session, req.getInputStream());

        ReceivedMail mail = <span class="synStatement">new</span> ReceivedMail();
        mail.setSubject(message.getSubject());
        <span class="synComment">//ローカルサーバーでは文字化けするので次のようなコードが必要。本番サーバーでは不要</span>
        <span class="synComment">//mail.setSubject(new String(message.getSubject().getBytes(&quot;8859_1&quot;), &quot;UTF-8&quot;));</span>
        mail.setFrom(parseFrom(message.getFrom()[<span class="synConstant">0</span>].toString()));
		
        String contentType = message.getContentType();
        InputStream is = <span class="synConstant">null</span>;
        String mess = <span class="synConstant">&quot;&quot;</span>;

        <span class="synStatement">if</span>(message.isMimeType(<span class="synConstant">&quot;text/plain&quot;</span>)){
            <span class="synComment">//ふつうのメールの処理</span>
            mess = (String)message.getContent();
        }<span class="synStatement">else</span>{
            <span class="synComment">//HTMLメールや添付メールの処理</span>
            Multipart content = (Multipart)message.getContent();

            <span class="synStatement">for</span>(<span class="synType">int</span> i = <span class="synConstant">0</span>; i &lt; content.getCount(); ++i){
                BodyPart bp = content.getBodyPart(i);
                <span class="synStatement">if</span>(!bp.isMimeType(<span class="synConstant">&quot;text/plain&quot;</span>)) <span class="synStatement">continue</span>;
                is = bp.getInputStream();

                contentType = bp.getContentType();
                <span class="synStatement">break</span>;
            }
        }
        <span class="synStatement">if</span>(is != <span class="synConstant">null</span>){
            <span class="synComment">//contentTypeからエンコーディングを取得</span>
            String encoding = <span class="synConstant">null</span>;
            String[] elms = contentType.split(<span class="synConstant">&quot;;&quot;</span>);
            <span class="synStatement">for</span>(String elm : elms){
                <span class="synStatement">if</span>(elm.trim().startsWith(<span class="synConstant">&quot;charset=&quot;</span>)){
                    encoding = elm.trim().substring(<span class="synConstant">&quot;charset=&quot;</span>.length());
                }
            }

            Reader r = <span class="synConstant">null</span>;
            <span class="synStatement">if</span>(encoding != <span class="synConstant">null</span>){
                <span class="synComment">//エンコーディングが入っている</span>
                <span class="synStatement">if</span>(encoding.startsWith(<span class="synConstant">&quot;</span><span class="synSpecial">\&quot;</span><span class="synConstant">&quot;</span>)) encoding = encoding.substring(<span class="synConstant">1</span>);
                <span class="synStatement">if</span>(encoding.endsWith(<span class="synConstant">&quot;</span><span class="synSpecial">\&quot;</span><span class="synConstant">&quot;</span>)) encoding = 
                    encoding.substring(<span class="synConstant">0</span>, encoding.length() - <span class="synConstant">1</span>);
                r = <span class="synStatement">new</span> InputStreamReader(is, encoding);
            }<span class="synStatement">else</span>{
                <span class="synComment">//エンコーディングが入っていない</span>
                r = <span class="synStatement">new</span> InputStreamReader(is);
            }

            BufferedReader buf = <span class="synStatement">new</span> BufferedReader(r);
            <span class="synStatement">for</span>(String line; (line = buf.readLine()) != <span class="synConstant">null</span>;){
                mess += line + <span class="synConstant">&quot;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>;
            }
        }
		
        <span class="synComment">//パース処理</span>
        ArrayList&lt;String&gt; sets = <span class="synStatement">new</span> ArrayList&lt;String&gt;();
        <span class="synStatement">for</span> (String str : mess.split(<span class="synConstant">&quot;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>)) {
            sets.add(str);
        }
		
        String changedmess = <span class="synConstant">&quot;&quot;</span>;
        <span class="synStatement">for</span> (String set : sets) {
            changedmess += set;
        }
		
        mail.setText(changedmess);
        pm.makePersistent(mail);

	} <span class="synStatement">catch</span> (MessagingException ex) {
        ex.printStackTrace();
	} <span class="synStatement">finally</span> {
        pm.close();
	}
}

<span class="synComment">//アドレス部分だけ抜き出す</span>
<span class="synType">private</span> String parseFrom(String from){
	<span class="synStatement">return</span> from.substring(from.indexOf(<span class="synConstant">&quot;&lt;&quot;</span>) + <span class="synConstant">1</span>, from.lastIndexOf(<span class="synConstant">&quot;&gt;&quot;</span>));
}

}

B! Pocket
スポンサーリンク

Related contents

TECH

2010.09.18

GAEでメール受信&メール送信 〜勝手に思ってるサークルの問題点に、勝手に取り組む

TECH

2010.07.13

TDDBootCamp名古屋の1日目の課題にリトライ!

TECH

2010.05.29

ありえるえりあ勉強会に行ってきましたー!!

TECH

2011.04.18

大阪EffectiveJava読書会 第1回に行ってきました!!

TECH

2009.05.19

Javaの用語

TECHBOOK

2009.05.14

Java言語で学ぶデザインパターン入門#1

TECH

2008.05.31

Java 今の時間を表示させる