如何用Kotlin发送简单文本邮件:无Java代码及commons email导入解决
Kotlin纯文本邮件发送的可落地方案
完全可以绕开之前commons-email依赖导入失败的问题,实现纯Kotlin逻辑的纯文本邮件发送,不需要混写Java代码。
方案1:基于官方原生邮件API的轻依赖实现
commons-email本质是对Java原生邮件能力的二次封装,导入失败大多是它本身依赖链路长、仓库拉取异常导致的,直接跳过封装层,只引入官方维护的核心邮件依赖即可:
- 只需要在构建配置里加一行核心依赖即可,没有多余传递依赖,极少出现导入失败问题:
implementation("com.sun.mail:jakarta.mail:2.0.1") - 直接用纯Kotlin编写发送逻辑,不需要额外引入commons-email相关包,纯文本内容只需要调用基础方法设置即可,核心实现代码:
import jakarta.mail.Authenticator import jakarta.mail.Message import jakarta.mail.PasswordAuthentication import jakarta.mail.Session import jakarta.mail.Transport import jakarta.mail.internet.InternetAddress import jakarta.mail.internet.MimeMessage import java.util.Properties fun sendPlainMail( smtpServer: String, smtpPort: Int, senderEmail: String, senderAuthCode: String, receiverEmail: String, title: String, content: String ) { val smtpProps = Properties().apply { put("mail.smtp.host", smtpServer) put("mail.smtp.port", smtpPort.toString()) put("mail.smtp.auth", "true") put("mail.smtp.ssl.enable", "true") } val mailSession = Session.getInstance(smtpProps, object : Authenticator() { override fun getPasswordAuthentication() = PasswordAuthentication(senderEmail, senderAuthCode) }) val mailMsg = MimeMessage(mailSession).apply { setFrom(InternetAddress(senderEmail)) setRecipients(Message.RecipientType.TO, InternetAddress.parse(receiverEmail)) subject = title setText(content) } Transport.send(mailMsg) }
方案2:零第三方依赖的SMTP原生交互实现
如果连上面的轻量邮件依赖都不想引入,可以直接用Kotlin标准库自带的Socket能力,按照SMTP协议规则手写交互流程。这个实现完全不需要引入任何第三方类库、不需要混写Java代码,所有逻辑用Kotlin完成,满足无额外Java代码依赖的需求,整个流程覆盖连接建立、身份校验、纯文本投递全链路:
- 优点是完全规避依赖导入失败的问题,所有逻辑都可控
- 缺点是需要自行处理SMTP协议的状态码判断、文本编码转义、连接异常重试,代码量比方案1稍大
注意:发信时的身份校验环节,不要使用邮箱的日常登录密码,要使用对应邮箱服务商生成的SMTP专属授权码,否则会触发认证失败。
内容的提问来源于stack exchange,提问作者mxrvin
相关产品推荐
相关产品推荐

