ภาพรวม
ตัวอย่างนี้สาธิตการส่งอีเมลโดยใช้ Intent แบบ Implicit Intent เพื่อเปิดแอปอีเมล (Gmail, Outlook, ฯลฯ) พร้อมข้อมูลผู้รับ หัวข้อ และเนื้อหา
ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่
เปิด Android Studio เลือก File → New Project
ขั้นตอนที่ 2: Layout (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Recipient Email"
android:textSize="16sp"
android:textStyle="bold" />
<EditText
android:id="@+id/editTextMail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="example@gmail.com"
android:inputType="textEmailAddress" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Subject"
android:textSize="16sp"
android:textStyle="bold" />
<EditText
android:id="@+id/editTextSubject"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Email subject" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Message"
android:textSize="16sp"
android:textStyle="bold" />
<EditText
android:id="@+id/editTextMessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lines="4"
android:hint="Type your message here"
android:inputType="textMultiLine" />
<Button
android:id="@+id/buttonSend"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="Send Email" />
</LinearLayout>
ขั้นตอนที่ 3: MainActivity.kt
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private lateinit var editTextMail: EditText
private lateinit var editTextSubject: EditText
private lateinit var editTextMessage: EditText
private lateinit var buttonSend: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "KotlinApp"
editTextMail = findViewById(R.id.editTextMail)
editTextSubject = findViewById(R.id.editTextSubject)
editTextMessage = findViewById(R.id.editTextMessage)
buttonSend = findViewById(R.id.buttonSend)
buttonSend.setOnClickListener {
sendEmail()
}
}
private fun sendEmail() {
val email = editTextMail.text.toString().trim()
val subject = editTextSubject.text.toString().trim()
val message = editTextMessage.text.toString().trim()
if (email.isEmpty()) {
Toast.makeText(this, "Please enter recipient email", Toast.LENGTH_SHORT).show()
return
}
// สร้าง Intent สำหรับส่งอีเมล
val intent = Intent(Intent.ACTION_SENDTO).apply {
// ใช้ mailto: URI เพื่อบังคับให้เปิดแอปอีเมลเท่านั้น (ไม่ใช่ Share อื่นๆ)
data = Uri.parse("mailto:$email")
putExtra(Intent.EXTRA_SUBJECT, subject)
putExtra(Intent.EXTRA_TEXT, message)
// สำหรับ CC/BCC
// putExtra(Intent.EXTRA_CC, arrayOf("cc@example.com"))
// putExtra(Intent.EXTRA_BCC, arrayOf("bcc@example.com"))
}
// ตรวจสอบว่ามีแอปรับ Intent นี้ได้
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
} else {
Toast.makeText(this, "No email app found", Toast.LENGTH_SHORT).show()
}
}
}
วิธีแนบไฟล์ (Attachment)
// ต้องใช้ ACTION_SEND แทน ACTION_SENDTO
val intent = Intent(Intent.ACTION_SEND).apply {
type = "message/rfc822"
putExtra(Intent.EXTRA_EMAIL, arrayOf(email))
putExtra(Intent.EXTRA_SUBJECT, subject)
putExtra(Intent.EXTRA_TEXT, message)
// แนบไฟล์ (ต้องใช้ FileProvider สำหรับ Android 7+)
val fileUri = FileProvider.getUriForFile(
this@MainActivity,
"${packageName}.fileprovider",
file
)
putExtra(Intent.EXTRA_STREAM, fileUri)
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
ขั้นตอนที่ 4: Manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.sendemail">
<application ... >
<activity android:name=".MainActivity"> ... </activity>
<!-- FileProvider สำหรับแนบไฟล์ (Android 7+) -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
</manifest>
ความแตกต่าง: ACTION_SENDTO vs ACTION_SEND
| คุณสมบัติ | ACTION_SENDTO (mailto:) | ACTION_SEND |
|---|---|---|
| เปิดเฉพาะแอปอีเมล | ✅ ใช่ | ❌ แสดง Share menu ทั้งหมด |
| รองรับ Attachment | ❌ ไม่รองรับ | ✅ รองรับ |
| URI Scheme | mailto: | ต้องตั้ง type |
| แนะนำสำหรับ | ส่งอีเมลธรรมดา | ส่งพร้อมไฟล์แนบ |
การทดสอบ
รันแอป กรอกอีเมลผู้รับ หัวข้อ ข้อความ กด "Send Email" จะเปิด Gmail (หรือแอปอีเมลอื่น) พร้อมข้อมูลที่กรอกไว้