2011年12月18日日曜日

JavaMailで送信:Android インターネット

JavaMail の準備

JavaMailのダウンロード
http://code.google.com/p/javamail-android/

mail.jar
additionnal.jar
activation.jar

Javaのビルドパスに設定する。

エラー
android.os.NetworkOnMainThreadException

上記のエラーが出た場合の対策
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());

メールアドレスとパスワードはそれぞれ設定して下さい。

package com.android;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import android.app.Activity;
import android.os.Bundle;
//import android.os.StrictMode;

public class AndroidTestActivity extends Activity {
 /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());

        final String mUser = "kameji2000@gmail.com";
        final String mPassword = "xxxx";

        Properties props = new Properties();

        props.put("mail.smtp.host", "smtp.gmail.com");// SMTPサーバ名
        props.put("mail.smtp.port", "587"); // SMTPサーバポート
        props.put("mail.smtp.auth", "true");// smtp auth
        props.put("mail.smtp.starttls.enable", "true");// STTLS

        Session sess = Session.getInstance(props);

        MimeMessage mimeMsg = new MimeMessage(sess);


        try {
           /*
            final MimeMessage mimeMsg = new MimeMessage(Session.getDefaultInstance(props, new Authenticator() {
                @Override
                // 認証データ。アカウント名とパスワードを指定して下さい。
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(mUser, mPassword);
                }
            }));
 */

      mimeMsg.setFrom(new InternetAddress(mUser));//Fromアドレス
      mimeMsg.setRecipient(Message.RecipientType.TO, new InternetAddress(mUser));//送信先アドレス
      mimeMsg.setContent("body", "text/plain; utf-8");
      mimeMsg.setHeader("Content-Transfer-Encoding", "7bit");
      mimeMsg.setSubject("テスト送信");//件名
      mimeMsg.setText("アンドロイドからの送信", "utf-8");//本文

      Transport transport = sess.getTransport("smtp");
      transport.connect(mUser, mPassword);
      transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients());// メール送信
      transport.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

  setContentView(R.layout.main);
    }

}


マニフェストの設定
<uses-permission android:name="android.permission.INTERNET" />

エラー対策
java.lang.NoClassDefFoundError: javax.mail.Session
のエラーがでた、外部jarファイルの場所が悪いみたい、
プロジェクトに libs フォルダを作って、そこに jar ファイルを入れて、そこからビルドパスに追加する。

関連記事

5 件のコメント:

  1. いつもお世話になってます。
    上記のコードを書いたところ、javax.mail.Messageのimportの行で「インポート javax.mail.Message は、別の import 文と一致しません」というエラーが出てしまいます。
    原因は何でしょうか?
    お手数をおかけしますが、お教えください。

    返信削除
    返信
    1. 同じエラーが出た事がないので、わかりませんが、
      3つのjarファイルをダウンロードして、
      メニューのプロジェクト、プロパティー、javaのビルドパス、ライブラリに3つのファイルを追加が完了して、eclipseのパッケージエクスプローラでエラーがでたプロジェクトの参照ライブラリでも追加したjarファイルが確認できるか調べてはどうでしょうか。

      削除
  2. お世話になります。
    返信が遅くなり申し訳ありません。

    調査の結果、
    import javax.mail.Message;
    より前に、記述している
    import android.os.Message;
    が影響しているようです(GPSで位置を取得するための処理に必要なため)。

    何か解決策などありますでしょうか。
    お手数をおかけして申し訳ありませんが、お教えください。

    返信削除
    返信
    1. import android.os.Message;をコメントアウトして、
      Message を MimeMessage にしても動きました。

      //import javax.mail.Message;
      mimeMsg.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(mUser));//送信先アドレス

      削除
    2. ありがとうございます。
      早速試してみます。

      削除