在 Kotlin 中发送电子邮件:库概览与实践示例
Kotlin 是一种现代编程语言,广泛用于构建服务器端应用程序、后端和微服务。能够以编程方式发送电子邮件是许多项目的关键功能之一:通知、注册确认、邮件群发。在本文中,我们将探讨如何在 Kotlin 中组织电子邮件发送,使用哪些库,以及如何配置 SMTP 连接。
在 Kotlin 中发送电子邮件的主要方法
由于 Kotlin 运行在 JVM 上,您可以使用任何 Java 库。最流行且经过验证的方法是 JavaMail (Jakarta Mail)。另一种选择是 Ktor Client(Ktor 框架的一部分),它可以直接与 SMTP 配合使用。让我们来研究这两种方法。
1. 使用 Jakarta Mail (JavaMail) 发送电子邮件
Jakarta Mail(以前称为 JavaMail)是 Java 生态系统中用于处理电子邮件的标准库。它非常适合 Kotlin,因为它与 JVM 完全兼容。您需要在 build.gradle.kts 中添加依赖项:
dependencies { implementation("com.sun.mail:jakarta.mail:2.0.1")}添加库后,您可以编写一个简单的发送函数:
import jakarta.mail.*import jakarta.mail.internet.InternetAddressimport jakarta.mail.internet.MimeMessageimport java.util.*
fun sendEmail( host: String, port: Int, username: String, password: String, from: String, to: String, subject: String, body: String) { val props = Properties().apply { put("mail.smtp.host", host) put("mail.smtp.port", port.toString()) put("mail.smtp.auth", "true") put("mail.smtp.starttls.enable", "true") }
val session = Session.getInstance(props, object : Authenticator() { override fun getPasswordAuthentication(): PasswordAuthentication { return PasswordAuthentication(username, password) } })
try { val message = MimeMessage(session).apply { setFrom(InternetAddress(from)) setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)) setSubject(subject) setText(body) } Transport.send(message) println("电子邮件已成功发送至 $to") } catch (e: MessagingException) { println("发送错误:${e.message}") }}函数调用:
fun main() { sendEmail( host = "smtp.gmail.com", port = 587, username = "youremail@gmail.com", password = "your-app-password", from = "youremail@gmail.com", to = "recipient@example.com", subject = "来自 Kotlin 的问候!", body = "这是一封通过 Kotlin 和 Jakarta Mail 发送的测试邮件。" )}2. 发送带附件的电子邮件 (Jakarta Mail)
要发送带文件的邮件,需要使用 MimeBodyPart 和 MimeMultipart:
import jakarta.mail.internet.MimeBodyPartimport jakarta.mail.internet.MimeMultipartimport java.io.File
fun sendEmailWithAttachment( session: Session, from: String, to: String, subject: String, body: String, attachmentPath: String) { val message = MimeMessage(session).apply { setFrom(InternetAddress(from)) setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)) setSubject(subject) }
// 文本部分 val textPart = MimeBodyPart().apply { setText(body) }
// 附件 val attachmentPart = MimeBodyPart().apply { attachFile(File(attachmentPath)) }
// 组装 multipart val multipart = MimeMultipart().apply { addBodyPart(textPart)