メール送信をするAndroidアプリを開発しましたので、最低限の実装を記録しておきます。
gmailにてメール送信する際の設定もあわせて記載します。
この2つの記事を参考に作成しました。
- https://qiita.com/Rabbit_Program/items/9df03bf2c1885561a5bd
- https://it-engineer-info.com/language/android-app/2142/
gmailの設定
gmailはAPIで送信することが推奨されているらしいですが、今回はSMTPでという要件でした。
その際はgmail(googleアカウント)の設定にて「安全性の低いアプリのアクセス」を有効にする必要があります。
- https://myaccount.google.com/ にアクセス(対象のアカウントでログインする)
- 「セキュリティ > 安全性の低いアプリのアクセス」を有効にする
JavaMail のインストール
Android Studio のgradleにJavaMailを追記します。
bundle.gradle(app)
implementation 'com.sun.mail:android-mail:1.6.5'
implementation 'com.sun.mail:android-activation:1.6.5'
バージョンは、1.6.5が最新ではありませんでしたが、参照にした記事がこのバージョンだったのでそのまま使いました。
パーミッションの追加
通信をするアプリなのでマニフェストにパーミッションを追加します。
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
実装
あとは実装するだけです。
レイアウトは省略します。ボタンが一つあるだけです。
MailServiceはメールを送信するクラスです。Serviceという名前はAndroidではややこしいのですが、最近までSpringのプロジェクトやっていたので勢いでこの名前にしてしまいました。
エラー処理もしていません。送信処理のところでExceptionをキャッチしないとパスワード間違えただけでアプリが落ちます。
MainActivity
package jp.co.sankosc.javamail
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<Button>(R.id.button).setOnClickListener {
val service = MailService()
service.send()
}
}
}
MailService
package jp.co.sankosc.javamail
import java.util.*
import javax.mail.*
import javax.mail.internet.InternetAddress
import javax.mail.internet.MimeMessage
import kotlin.concurrent.thread
class MailService {
fun send() {
thread {
val property = Properties()
property.put("mail.smtp.host", "smtp.gmail.com")
property.put("mail.smtp.auth", "true")
property.put("mail.smtp.starttls.enable", "true")
property.put("mail.smtp.port", "587")
property.put("mail.smtp.debug", "true")
val message: Message = MimeMessage(Session.getDefaultInstance(property, object: Authenticator() {
override fun getPasswordAuthentication(): PasswordAuthentication {
return PasswordAuthentication("[gmailのアカウント]", "[gmailのパスワード]")
}
}))
message.setFrom(InternetAddress("[送信元メールアドレス]", "[表示名]"))
message.setRecipient(Message.RecipientType.TO, InternetAddress("[送信先メールアドレス]", "[表示名]"))
message.subject = "タイトル"
message.setText("こんにちは")
Transport.send(message)
}
}
}