ソースのみのダウンロード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 になりました。前からの内容も含めて整理してます。



▼ javamail-android ライブラリ




