Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีส่งอีเมลผ่าน Gmail จากแอป Android ด้วย Kotlin

ภาพรวม

ตัวอย่างนี้สาธิตการส่งอีเมลโดยใช้ 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 Schememailto:ต้องตั้ง type
แนะนำสำหรับส่งอีเมลธรรมดาส่งพร้อมไฟล์แนบ

การทดสอบ

รันแอป กรอกอีเมลผู้รับ หัวข้อ ข้อความ กด "Send Email" จะเปิด Gmail (หรือแอปอีเมลอื่น) พร้อมข้อมูลที่กรอกไว้