ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
Android Studio 1.5 : メール送信とダイアログフラグメント
日時: 2015/11/21 17:56
名前: lightbox



ダウンロード : https://code.google.com/p/javamail-android/downloads/list

package sample.lightbox.dialogtemplate;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private static Android_Sendmail as = null;

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

        // メール送信オブジェクトを作成
        as = new Android_Sendmail(
// https://myaccount.google.com/security?pli=1#connectedapps
// Gmail 側で安全性の低いアプリの許可を『有効』にする
                "smtp.gmail.com",

//                "smtp.mail.yahoo.co.jp",
//                "smtp.live.com",

                "465", // 465 または 587
                "", // アカウント
                "", // パスワード
                "日本語ユーザ名"
        );

        MainActivity.this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // ダイアログ( フラグメントに渡す情報 )
                ArrayList<String> dialog_param = new ArrayList<String>();
                dialog_param.add("確認");
                dialog_param.add("実行しますか?");
                dialog_param.add("YES");
                dialog_param.add("NO");

                // ダイアログフラグメントを作成して表示
                MyDialogFragment dialog = MyDialogFragment.builder(dialog_param);
                // フラグメントとしてキャンセル可能
                dialog.setCancelable(true);
                // ダイアログの表示
                dialog.show(getFragmentManager(), "dialog");
            }
        });

    }

    // ダイアログから呼び出されるイベント
    public void dialogYesClick() {
        Log.i("lightbox", "YES");

        EditText et = (EditText) MainActivity.this.findViewById(R.id.editText);
        String message = et.getText().toString();

        as.SendMail(
                "宛先メールアドレス",
                "差出人メールアドレス",
                "こんにちは",
                message, new Android_Sendmail.SendMailed() {

                    @Override
                    public void onSendMailResult(String result) {
                        Log.i("lightbox", "結果:" + result);

                    }
                });
    }

    // ダイアログから呼び出されるイベント
    public void dialogNoClick() {
        Log.i("lightbox", "NO");
    }

    // ダイアログフラグメント( static )
    public static class MyDialogFragment extends DialogFragment {

        // このメソッドは、MainActivity からインスタンスを作成する為に使用します
        // ※ ユーザ専用のメソッドです( 名前まなんでもいいです )
        // ※ フラグメントでは、通常のコンストラクタは使用不可
        public static MyDialogFragment builder(ArrayList<String> param) {
            MyDialogFragment f = new MyDialogFragment();
            Bundle args = new Bundle();
            // 情報をセット
            args.putStringArrayList("param", param);
            f.setArguments(args);

            return f;
        }

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {

            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

            // 外部からの情報( システムが Daialog を再構築した時の為 )
            ArrayList<String> param = getArguments().getStringArrayList("param");

            builder.setTitle(param.get(0));
            builder.setMessage(param.get(1));

            builder.setPositiveButton(param.get(2),
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // MainActivity を呼び出す
                            ((MainActivity)getActivity()).dialogYesClick();
                        }
                    });

            builder.setNegativeButton(param.get(3),
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // MainActivity を呼び出す
                            ((MainActivity)getActivity()).dialogNoClick();
                        }
                    });

            return builder.create();
        }
    }
}
<uses-permission android:name="android.permission.INTERNET"/>
モジュールの build.gradle
apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.0"

    defaultConfig {
        applicationId "sample.lightbox.dialogtemplate"
        minSdkVersion 19
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:22.2.1'
    compile files('libs/mail.jar')
    compile files('libs/additionnal.jar')
    compile files('libs/activation.jar')
}
メンテナンス

メール送信クラス ( No.1 )
日時: 2015/11/21 17:53
名前: lightbox


日時: 2015/11/21 17:53
名前: lightbox
Android_Sendmail.java
package sample.lightbox.dialogtemplate;

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;

public class Android_Sendmail {

	private String _server;
	private String _port;
	private String _userid;
	private String _password;
	private String _username;

	// **************************************************************
	// コンストラクタ
	// **************************************************************
	public Android_Sendmail(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;
	}

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

	// **************************************************************
	// Twitter 投稿
	// **************************************************************
	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) {

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

					// *****************************************************
					// * 連想配列に送信用サーバのアドレスをセット
					// *****************************************************
					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 ) {
					System.out.println(e.toString());
					result_string = e.toString();
				}

				return result_string;
			}

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

}
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
画面 ( No.2 )
日時: 2015/11/21 17:58
名前: lightbox
<?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="sample.lightbox.dialogtemplate.MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="ダイアログ表示"
        android:id="@+id/button"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:background="@drawable/border"
        android:inputType="textMultiLine"
        android:ems="10"
        android:id="@+id/editText"
        android:layout_below="@+id/button"
        android:layout_alignParentStart="true"
        android:layout_marginTop="31dp"
        android:gravity="left|top"
        android:padding="20dp"/>

</RelativeLayout>
drawable\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>
このアーティクルの参照用URLをクリップボードにコピー メンテナンス