在 Kotlin 中发送电子邮件:库、示例和 SMTP 配置

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 Kotlin 中发送电子邮件:工具概览与代码示例



发送电子邮件是 Web 开发、通知和后台服务中的典型任务之一。在运行于 JVM 的 Kotlin 生态系统中,您既可以使用经典的 Java 库,也可以使用现代的 Kotlin 原生解决方案。在本文中,我们将介绍三种主要方法:javax.mail (Jakarta Mail)、Ktor Client 和 Apache Commons Email。您将了解如何配置 SMTP 客户端、发送简单邮件以及添加附件。



1. javax.mail (Jakarta Mail) — 经典标准

这是 Java 和 Kotlin 中最常用的电子邮件处理库。它完全支持 SMTP、IMAP 和 POP3 协议。对于 Kotlin 项目,只需在 build.gradle.kts 中添加依赖即可:

dependencies {    implementation("com.sun.mail:javax.mail:1.6.2")}


发送简单文本邮件的示例:

import javax.mail.*import javax.mail.internet.InternetAddressimport javax.mail.internet.MimeMessageimport java.util.Properties

fun sendSimpleEmail() { val props = Properties().apply { put("mail.smtp.auth", "true") put("mail.smtp.starttls.enable", "true") put("mail.smtp.host", "smtp.gmail.com") put("mail.smtp.port", "587") }

val session = Session.getInstance(props, object : Authenticator() { override fun getPasswordAuthentication(): PasswordAuthentication { return PasswordAuthentication("your-email@gmail.com", "your-password") } })

val message = MimeMessage(session).apply { setFrom(InternetAddress("from-email@gmail.com")) setRecipients(Message.RecipientType.TO, InternetAddress.parse("to-email@example.com")) subject = "来自 Kotlin 的问候!" setText("这是一封使用 javax.mail 发送的测试邮件。") }

Transport.send(message) println("邮件发送成功!")}


重要提示:对于 Gmail,您需要使用应用专用密码或 OAuth2。请勿将凭据硬编码在代码中——应使用环境变量。



发送带附件的邮件

import javax.activation.DataHandlerimport javax.activation.FileDataSourceimport javax.mail.internet.MimeBodyPartimport javax.mail.internet.MimeMultipart

fun sendEmailWithAttachment() { // ... 如上配置 session ... val message = MimeMessage(session).apply { setFrom(InternetAddress("from@gmail.com")) setRecipients(Message.RecipientType.TO, InternetAddress.parse("to@example.com")) subject = "带附件的邮件" }

val multipart = MimeMultipart()

// 文本部分 val textPart = MimeBodyPart().apply { setText("请查看附件。") } multipart.addBodyPart(textPart)

// 附件 val attachmentPart = MimeBodyPart().apply { dataHandler = DataHandler(FileDataSource("/path/to/file.pdf")) fileName = "文档.pdf" } multipart.addBodyPart(attachmentPart)

message.setContent(multipart) Transport.send(message)}


2. Ktor Client — 现代异步方法

如果您的项目已经在使用 Ktor 进行 HTTP 请求,您可以通过 ktor-client-smtp 插件使用 SMTP 发送电子邮件。这带来了协程和异步执行的优势。依赖配置:

dependencies {    implementation("io.ktor:ktor-client-core:2.3.0")    implementation("io.ktor:ktor-client-smtp:2.3.0")}


发送示例:

import io.ktor.client.*import io.ktor.client.smtp.*import io.ktor.client.request.*import io.ktor.client.statement.*

suspend fun sendViaKtor() { val client = HttpClient {

推荐