ソースのみのダウンロード 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の最新記事】
- Android : WebView 経由のデータベースアプリケーション
- Android で WebView を使ってWEBにあるデータベースのデータを取得する為のクラス
- WebView で JavaScript にデータを渡したい時に注意する事
- シンプル Android Data Binding : Android Studio 2.2 / 古い定義との違いと、以前のプロジェクトでエラーが出る場合の対処
- Android Studio で、ListView アプリケーションを作成するテンプレート
- Android : Data Binding で ListView へのデータ表示を凄く簡単にする
- Android Studio で理解不能なエラーが出た時の対処方法 : Invalidate Caches / Restart
- Android : TabHost のタブに下から上へのアニメーションを設定して、include で同一画面を使用するので 回転しないように AndroidMainfest で設定する
- Android : TabHost 内の各 TabSpec 内にある TextView の 端末回転時における保存と復帰
- Android の 端末回転時の EditText と TextView の違い
- ViewPager 内のイベントで設定した TextView の値を保持する Fragment 処理
- ExpandableListView を使用して、タップした時に明細データ表示する
- カスタム・リストビュー・ダイアログ : DialogFragment 内の ListView を ArrayAdapter でカスタムする
- カスタム・リストビュー・ダイアログ : ダイアログ内の ListView を ArrayAdapter でカスタムする
- AlertDialog.Builder の setItems(int itemsId, DialogInterface .OnClickListener listener) を使用した、ListVie..
- AsyncTask<Params, Progress, Result> の Progress を無しにして、onPostExecute 内の処理を interface を使って MainA..
- tools.jar の callHttpGet のテストと include による画面再利用と HttpPost クラスで掲示板書き込み / Android Studio
- Android の Spinner に関するいろいろな実装と知識 / Android Studio
- AsyncTask を継承して、Drawable を取得する専用クラスを作成する : Android Studio
- Android Studio が 2.0 になりました。前からの内容も含めて整理してます。