●javamailでメールを送信する


■必要な部品を揃える

まずは、必要となる部品のjarを次のサイトからダウンロードします。
javamail-android

次の3つのファイルが必要となります。
additionnal.jar
mail.jar
activation.jar



3つのファイルをダウンロードしますが、jarはzipでまとめられていますので、開くと中身が見えてしまいますし、 勝手にzipとしてダウンロードしてしまうかもしれません。
その時はダウンロードしたファイルの拡張子をzipからjarにリネームしてください。

▼次にダウンロードした3つのファイルをメール送信したいプロジェクトのlibsフォルダにコピーします。

\AndroidStudioProjects\MyApplicationX\app\libs

その後にandroid studioでプロジェクトを開き直せば自動で読み込まれます。



■プロジェクトの設定


対象となるプロジェクトを開きます
\app\src\main\AndroidManifest.xml を開いて必要な権限を追加します


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="mail.myapplication">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
            </intent-filter>
        </activity>
    </application>
</manifest>
赤文字の部分を追加することによりインターネットのアクセス権限をアプリケーションに追加します。



■gmailで自分自身にメールを送信する


画面にボタンを張り付けて、ボタンを押すとメールが送信されるようにします。
そのためには以下のコードのgmailアカウントとパスワードを自分の物に書き換えてください。


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ((android.widget.Button)findViewById(R.id.button))
                .setOnClickListener(new android.view.View.OnClickListener() {
                    public void onClick(android.view.View view) {
                        asyncTask a=new asyncTask();
                        a.execute((Object)"gmailアカウント名",(Object)"gmailパスワード",new Object()) ;
                    }
                });
    }

    private class asyncTask extends android.os.AsyncTask{
        protected String account;
        protected String password;

        @Override
        protected Object doInBackground(Object... obj){
            //この関数は別スレッドで実行されるため、画面周りに関わる処理は出来ない。
            //また、戻り値はonPostExecuteの引数に渡され、そこで画面周りの処理ができる。
            account=(String)obj[0];
            password=(String)obj[1];

            java.util.Properties properties = new java.util.Properties();
            properties.put("mail.smtp.host", "smtp.gmail.com");
            properties.put("mail.smtp.auth", "true");
            properties.put("mail.smtp.port", "465");
            properties.put("mail.smtp.socketFactory.post", "465");
            properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

            final javax.mail.Message msg = new javax.mail.internet.MimeMessage(javax.mail.Session.getDefaultInstance(properties, new javax.mail.Authenticator(){
                @Override
                protected javax.mail.PasswordAuthentication getPasswordAuthentication() {
                    return new javax.mail.PasswordAuthentication(account,password);
                }
            }));

            try {
                msg.setFrom(new javax.mail.internet.InternetAddress(account + "@gmail.com"));
                //自分自身にメールを送信
                msg.setRecipients(javax.mail.Message.RecipientType.TO, javax.mail.internet.InternetAddress.parse(account + "@gmail.com"));
                msg.setSubject("タイトル");
                msg.setText("内容");

                javax.mail.Transport.send(msg);

            } catch (Exception e) {
                return (Object)e.toString();
            }

            return (Object)"OK";

        }
        @Override
        protected void onPostExecute(Object obj) {
            //doInBackgroundの戻り値が引数に渡される
            //メインスレッドで実行されるため、画面周りの処理ができる。

            //画面にメッセージを表示する
            android.content.Context context = getApplicationContext();
            android.widget.Toast t=android.widget.Toast.makeText(context,(String)obj, android.widget.Toast.LENGTH_LONG);
            t.show();
        }
    }
}

なんだか、ややこしい処理がいくつもあります。
そもそもネットワーク処理はメインスレッドで処理できないためAsyncTaskにより処理してもらう必要があります。
あとsmtp認証の部分ですね。
そこんところで特にややこしくなりますね。

しかし、上のコードのアカウント名とパスワードを書き換えて実行しても、エラーが発生することがあります。



javax.mail.AuthenticationFailedException が出ています。
まずは、アカウント名とパスワードが正しい事を確認してみてください。
次にgmailのメールボックスを見てみると、"ブロックされたログインについて・・・・" というメールが来てると思います。

この場合は最新のセキュリティ標準に対応していないため、セキュリティ上で例外が発生しています。
そこで、自己責任で自分のgoogleアカウントのセキュリティを外すとメールが送信できます。

▼設定用リンク
https://myaccount.google.com/lesssecureapps


そもそも、今の"最新のセキュリティ"って何?っていう感じです。
今は、メールが動いていても、いつgoogleの気分次第でセキュリティが強化されるかわからない訳ですから事前に有効にしておくに越したことはないかもしれません。
あくまで自己責任ですので。



▲トップページ > android