SQLの窓

2016年06月06日


javamail-android + AsyncTask でメール送信を行う為のテンプレート

ソースのみのダウンロード


Gmail を使用する場合は、安全性の低いアプリの許可を『有効』にする 必要があります。

Gmail のサーバ : smtp.gmail.com
▼ 以下参考
Yahoo メールのサーバ : smtp.mail.yahoo.co.jp
Microsoft のサーバ : smtp.live.com

※ AndroidManifest.xml で、インターネットアクセスの許可が必要です。

▼ 実行画面



▼ javamail-android ライブラリ

ダウンロード
libs フォルダに 3つとも ダウンロードして、mail.jar のみ 右クリックから Add as Library で登録します

▼ AndroidSendmail クラス
package lightbox.june.mailpost;

import android.os.AsyncTask;

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;

/**
 * Created by lightbox on 2016/06/06.
 */
public class AndroidSendmail {

	// AsyncTask のインラインで参照する為の final
	private final String server;
	private final String port;
	private final String userid;
	private final String password;
	private final String username;

	// ************************************
	// コンストラクタ
	// ************************************
	public AndroidSendmail(
		String server,
		String port,
		String userid,
		String password,
		String username) {

		this.server = server;
		this.port = port;
		this.userid = userid;
		this.password = password;
		this.username = username;

//		Log.i("lightbox","コンストラクタ");
//		Log.i("lightbox",server);
//		Log.i("lightbox",port);
//		Log.i("lightbox",userid);
	}

	// ************************************
	// AsyncTask の onPostExecute から外部イベントとして
	// 呼び出す為のインターフェイス
	// ************************************
	public interface SendMailed {
		public void onMailResult(String result);
	}

	// ************************************
	// メール送信
	// ************************************
	public void SendMail(String to, String from, String subject, String body,final SendMailed sm) {

		new AsyncTask<String, Void, String>() {

			// ************************************
			// 非同期処理
			// ************************************
			@Override
			protected String doInBackground(String... params) {

//				Log.i("lightbox","開始");

				String result_string = "";
				try {
					// ************************************
					// プロパティオブジェクトを作成
					// プロパティオブジェクトは、extends Hashtable(連想配列)
					// ************************************
					Properties props = new Properties();

					// ************************************
					// * 連想配列に送信用サーバのアドレスをセット
					// ************************************
//					props.put("mail.smtp.host","smtp.mail.yahoo.co.jp");	// Yahoo
//					props.put("mail.smtp.host","smtp.live.com");	// Microsoft
					props.put("mail.smtp.host", server);
					props.put("mail.smtp.port", port);
					props.put("mail.smtp.auth", "true" );	// SMTP 認証を行う

					// ************************************
					// SSL関連設定
					// ************************************
					if ( port.equals("465") ) {
						props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
						props.put("mail.smtp.socketFactory.fallback", "false");
						props.put("mail.smtp.socketFactory.port", port);
					}

					// ************************************
					// 暗号化
					// ************************************
					if ( port.equals("587") ) {
						props.put("mail.smtp.starttls.enable", "true");
					}


					// ************************************
					// メール用のセッションを作成
					// ************************************
					SimpleAuthenticator sa =
						new SimpleAuthenticator(userid, password);
					Session MailSession =
						Session.getInstance( props, sa );

					// ************************************
					// メール用のメッセージオブジェクトを作成
					// ************************************
					MimeMessage msg = new MimeMessage(MailSession);

					// ************************************
					// 宛先
					// ( 第一引数では、CC や BCC を指定できます。)
					// ( 第二引数は、配列も使えます / その場合は、setFrom に準じます )
					// ************************************
					msg.setRecipients(
						Message.RecipientType.TO,
						params[0]
					);

					// ************************************
					// 送信者
					// ************************************
					msg.setFrom(
						new InternetAddress( params[1], username, "ISO-2022-JP" )
					);

					// ************************************
					// 件名
					// ************************************
					msg.setSubject(
						MimeUtility.encodeText(
							params[2],
							"iso-2022-jp",
							"B"
						)
					);

					// ************************************
					// 本文
					// ************************************
					msg.setContent(
						params[3],
						"text/plain; charset=\"iso-2022-jp\""
					);

					// ************************************
					// 送信
					// ************************************
					Transport.send( msg );

					result_string = "メールの送信を完了しました";

				}
				catch( Exception e ) {
					e.printStackTrace();
					result_string = "メールの送信に失敗しました";
				}

//				Log.i("lightbox","終了");

				return result_string;
			}

			// ************************************
			// 非同期処理終了後の処理( 画面へのアクセスが可能 )
			// ************************************
			@Override
			protected void onPostExecute(String result) {
				// 引数のインターフェイス内のメソッドを呼び出す
				sm.onMailResult(result);
			}

		}.execute(to, from, subject, body);

	}

	// ************************************
	// 認証用のプライベートクラス
	// ************************************
	private class SimpleAuthenticator extends Authenticator {

		private String user_string = null;
		private String pass_string = null;

		public SimpleAuthenticator( String user_s, String pass_s ) {
			super();
			user_string = user_s;
			pass_string = pass_s;
		}

		protected PasswordAuthentication getPasswordAuthentication(){
			return new PasswordAuthentication( this.user_string, this.pass_string );
		}
	}
}

通常の Javamail と仕様は同じ(のよう)です。

ポートの 465(SSL) を使うか 587(TSL) を使うかで設定するプロパティが変わって来ます。テストは、Yahoo メールとHotmailで行いましたが、それぞれ 465 と 587 です。Gmail は両方可能だと思います。

Hotmail は、Outlook エイリアスという呼び名で名前を追加できますが、その名前を使用する事ができました( メールヘッダはオリジナルに戻ってました )

※ 『メール アカウント』受信トレイ>オプション>メール アカウント

呼び出し
package lightbox.june.mailpost;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

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

		MainActivity.this.findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {

				EditText passText = (EditText)MainActivity.this.findViewById(R.id.passText);
				String pass = passText.getText().toString();

				AndroidSendmail as = new AndroidSendmail(
					"smtp.gmail.com", // サーバ( 例 : "smtp.mail.yahoo.co.jp" or "smtp.live.com" )
					"465", // 465 または 587
					"", // アカウント
					pass, // パスワード
					"日本語ユーザ名"
				);

				// 宛先
				EditText to = (EditText)MainActivity.this.findViewById(R.id.editText2);
				String atesaki = to.getText().toString();

				// from の メールアドレス
				String myAddress = "";

				// 件名
				EditText subject = (EditText)MainActivity.this.findViewById(R.id.editText3);
				String kenmei = subject.getText().toString();

				// 本文
				EditText body = (EditText)MainActivity.this.findViewById(R.id.editText1);
				String honbun = body.getText().toString();

				as.SendMail(
					atesaki,
					myAddress,
					kenmei,
					honbun,
					new AndroidSendmail.SendMailed() {
						@Override
						public void onMailResult(String result) {
							Log.i("lightbox", result);
						}
					}
				);


			}
		});

	}
}


画面定義

エミュレータ上でパスワードを入れる事を想定して、入力時にパスが解らないように android:textColor="#efefef" となっています。

枠線は、drawable に border.xml を定義して android:background="@drawable/border" と指定しています
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="lightbox.june.mailpost.MainActivity">

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:text="送信" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="2dp"
        android:background="@drawable/border"
        android:ems="10"
        android:gravity="top|left"
        android:paddingBottom="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:paddingTop="10dp"
        android:inputType="textMultiLine">

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_below="@+id/button1"
        android:layout_marginTop="15dp"
        android:background="@drawable/border"
        android:paddingLeft="10dp"
        android:text="メール送信"
        android:textSize="30sp" />

    <EditText
        android:id="@+id/editText2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText1"
        android:layout_marginTop="2dp"
        android:background="@drawable/border"
        android:ems="10"
        android:paddingBottom="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:paddingTop="10dp"
        android:layout_alignEnd="@+id/editText1"
        android:layout_toRightOf="@+id/textView2"
        android:layout_marginLeft="18dp"
        />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="宛先"
        android:textSize="20sp"
        android:layout_below="@+id/editText1"
        android:gravity="center_vertical"
        android:layout_alignBottom="@+id/editText2"/>

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView2"
        android:text="件名"
        android:textSize="20sp"
        android:layout_alignEnd="@+id/textView2"
        android:layout_marginTop="2dp"/>

    <EditText
        android:id="@+id/editText3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView3"
        android:background="@drawable/border"
        android:ems="10"
        android:textSize="20sp"
        android:paddingBottom="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:paddingTop="10dp"
        android:layout_alignEnd="@+id/editText2"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="パス"
        android:id="@+id/textView"
        android:layout_below="@+id/editText3"
        android:textSize="20dp"
        android:layout_marginTop="2dp"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPassword"
        android:ems="10"
        android:id="@+id/passText"
        android:background="@drawable/border"
        android:padding="10dp"
        android:layout_below="@+id/textView"
        android:textColor="#efefef"/>

</RelativeLayout>


border.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">

    <corners
        android:radius="4dp" />

    <stroke
        android:width="1dp"
        android:color="@android:color/black" />

</shape>

関連する記事

VS2010(C#) : TKMP.DLL(3.1.2)を使った、メール送信テンプレート
javamail 1.4.4 でメール送信




【Android Studio 2の最新記事】
posted by lightbox at 2016-06-06 14:54 | Android Studio 2 | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
PHP正規表現チェッカー
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり