trash-area.com ≫ blog ≫ androidandroidでgmailの送信(SSL + javamail-android)

2011年05月17日 0

androidスマフォで2chブラウザを使ってるときなど
このスレを(インテントで)共有して特定のメアドに即送信したい!!ってことよくありますよねぇ。

こんなことが何度も何度も何度もあると
「share → gmail → アドレス入力 → 送信」と流れるのすら
とてもとても億劫になりますね。

そんなこんなで share した場合に、gmailのアカウントを使用して、
特定のメールアドレスに即送信するサンプルです。

まずはアクティビティ。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_height="fill_parent" android:orientation="horizontal"
	android:layout_gravity="center_horizontal|center" android:layout_width="fill_parent">
 
	<LinearLayout android:id="@+id/LinearLayout02"
		android:layout_width="fill_parent" android:orientation="vertical"
		android:layout_margin="22px" android:layout_gravity="center"
		android:layout_height="70px">
 
		<LinearLayout android:id="@+id/LinearLayout01"
			android:layout_width="wrap_content" android:layout_height="wrap_content"
			android:layout_gravity="center" android:orientation="horizontal">
 
			<ProgressBar android:id="@+id/ProgressBar01"
				android:layout_width="wrap_content" android:layout_height="wrap_content"
				android:layout_gravity="center"></ProgressBar>
 
			<TextView android:id="@+id/TextView01" android:layout_width="wrap_content"
				android:layout_height="wrap_content" android:layout_gravity="center"
				android:text="Sending ..." android:textSize="24px"
				android:layout_marginLeft="18px"></TextView>
 
		</LinearLayout>
 
	</LinearLayout>
 
</LinearLayout>

丸形でくるくるとまわる ProgressBar と、sending … というテキストを中央に配置しています。

次に、activity をちょっと透過させてみるので、res/valus/ に style.xml を作ります。
ここで、半透明のテーマを定義しています。
(parent指定はいまいちよくわかりませんでした。)

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<style name="Theme.Translucent" parent="android:style/Theme.Dialog">
 
		<item name="android:windowNoTitle">true</item>
		<item name="android:windowBackground">@android:color/transparent</item>
 
	</style>
</resources>

次に AndroidManifest.xml でインテントのキャッチと、
スタイル(さっき作ったカスタムテーマ)を適用します。
インテントは android.intent.action.SEND をキャッチするようにしています。
なお、メール送信したいので、uses-permissionの指定も忘れずに行います。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="com.trasharea.xxxxx" android:versionCode="1"
	android:versionName="1.0">
 
	<application android:icon="@drawable/icon" android:label="@string/app_name">
 
		<activity android:name=".main" android:label="@string/app_name"
			android:theme="@style/Theme.Translucent">
 
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
 
			<intent-filter>
				<action android:name="android.intent.action.SEND"></action>
				<category android:name="android.intent.category.DEFAULT"></category>
				<data android:mimeType="text/*" />
			</intent-filter>
 
		</activity>
 
	</application>
 
	<uses-sdk android:minSdkVersion="4" />
 
	<uses-permission android:name="android.permission.INTERNET" />
 
</manifest>

ソースコード。
gmailのアカウントを使用して、TTL(465)で固定のメールアドレスに対して、即送信します。

package com.trasharea.xxxxx;
 
import java.util.Properties;
 
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
 
public class main extends Activity {
 
  @Override
  public void onCreate(Bundle savedInstanceState) {
 
    super.onCreate(savedInstanceState);
 
    Intent intent = getIntent();
    if (intent.getExtras() == null) {
      finish();
      return;
    }
 
    // インテント経由のみ起動
    setContentView(R.layout.main);
 
    Bundle bundle = intent.getExtras();
 
    // インテントで渡されたデータをかき集める
    String body = "";
    for (String key : bundle.keySet()) {
      body += key + ":" + bundle.get(key) + ", ";
    }
 
    Properties props = new Properties();
    props.put("mail.smtp.host", "smtp.gmail.com");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.port", "465");
    props.put("mail.smtp.socketFactory.port", "465");
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
 
    try {
 
      final Message message = new MimeMessage(Session.getDefaultInstance(props, new Authenticator() {
        @Override
        // 認証データ。アカウント名とパスワードを指定して下さい。
        protected PasswordAuthentication getPasswordAuthentication() {
          return new PasswordAuthentication("${gmail_account}", "${gmail_password}");
        }
      }));
 
      // FROM/TOなど。setTextのあとに一般的(?)なエンコードにしています。
      message.setFrom(new InternetAddress("${gmail_account}@gmail.com"));
      message.setRecipients(Message.RecipientType.TO, 
                  InternetAddress.parse("${to_addr}"));
      message.setSubject("");
      message.setText(body);
      message.setHeader("Content-Transfer-Encoding", "7bit");
 
      // プログレスバーをくるくる回したいのでメール送信は別スレッドで起動。
      new Thread(new Runnable() {
 
        public void run() {
          try {
            Transport.send(message);
          } catch (MessagingException e) {
            throw new RuntimeException(e);
          }
          // アクティビティを閉じます。
          finish();
        }
      }).start();
 
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

まぁ、おのれ用ですのでサブジェクトなどは指定しません。
その他、主要なとこにはコメント入れてみました。

最後に、必要なライブラリ。
以下の3つが無いと、ビルドエラーにはならなくても実行時エラーになりますので
プロジェクトのビルドパスに追加しておきます。

mail.jar
activation.jar
additionnal.jar

javamail-android

ソーシャルブックマーク
はてな Livedoor del.icio.us
関連してそうな記事
同じカテゴリーの別の記事
タグ
, , ,
トラックバックURL
コメント

コメントをどうぞ

*反映されるまでに時間がかかることがあります。
*メールアドレスはアバターの使用に使います。