発覚の経緯
普段作っている個人アプリでは、ユーザーからのお問い合わせを送ってもらうためにメールを使っています。
機能としてはただメーラーを開くだけでなく、件名や本文に任意の内容を自動で入力するようにすることで基本的な情報の問診の手間を省いていました。
3年位は問題なくお問い合わせメールが届いていたのですが、ある時から急に件名と本文の入力がないメールが来るようになりました。
最初のうちはユーザーが消してから送ってきたのかなと思っていたのですが、日に日に多くなってくる様子から何か起きていると判断しました。
手元で確認したところ、読みどおりにメールアドレスしか入力されていないメールがGmailで生成されるようになっておりました。
修正方法
before
メールを起動するIntentは随分昔から使っている、インターネットのどこからコピーしてきたかも思い出せないものでした。
このコードでも少なくともいっときまでは問題なく動いていたはずです。
fun createMailIntent(address: String, subject: String, text: String): Intent =
Intent(Intent.ACTION_SENDTO).apply {
data = Uri.parse("mailto:$address")
putExtra(Intent.EXTRA_SUBJECT, subject)
putExtra(Intent.EXTRA_TEXT, text)
}
after
何はなくとも困ったときのGoogle公式ドキュメントです。
https://developer.android.com/guide/components/intents-common?hl=ja#Email
いつの間にか Uri#parse
に書くべきは"mailto:"
までになっており、代わりにアドレスはArray<String>
としてIntent#putExtra
にIntent.EXTRA_EMAIL
というキーと共に渡すのが推奨形式となっておりました。
というわけで対応するように修正したのが下記のコードになります。
fun createMailIntent(address: String, subject: String, text: String): Intent =
Intent(Intent.ACTION_SENDTO).apply {
data = Uri.parse("mailto:")
putExtra(Intent.EXTRA_EMAIL, arrayOf(address))
putExtra(Intent.EXTRA_SUBJECT, subject)
putExtra(Intent.EXTRA_TEXT, text)
}
おわりに
そもそもお問い合わせの数が多くないことに加え、クラッシュもしていなかったおかげで発見が遅れてしまいました。
また、外部アプリ連携が必須なため、テストの自動化も難しく防ぐ術があったのかは今でも分かりません。
唯一出来たとするならば(当時のGoogleのドキュメントが正しかったかは分かりませんが)どこの馬の骨ともわからないコードを拾ってこずに、まずはGoogleの公式ドキュメントを参考にするくらいかなと思います。
とても地味ではありますが、アプリにメーラーを起動するIntentの処理がある場合一度見直しておくと良いかもしれません。