You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Gmail API发送带附件邮件报no object DCH for MIME type multipart/mixed错误

问题原因及解决方案

你遇到的no object DCH for MIME type multipart/mixed错误本质是JavaMail框架无法找到对应MIME类型的DataContentHandler处理类,加上代码本身存在附件添加逻辑错误,共同导致发送失败,可按以下步骤修复:

1. 修复JavaMail类加载及配置问题

Android平台的类加载机制和桌面Java环境不同,默认情况下JavaMail无法自动注册MIME类型的处理类,需要手动配置:

  • 不要使用Session.getDefaultInstance,改用Session.getInstance避免复用旧的错误配置
  • 在初始化Properties时手动注册常用MIME类型的处理类
  • 将上下文类加载器设置为JavaMail库的类加载器,配置要放在所有JavaMail相关操作之前

2. 修复附件添加逻辑错误

你当前的代码只在附件遍历结束后添加了最后一个附件,多个附件场景会丢失前面的附件,需要把multipart.addBodyPart逻辑移到附件遍历循环内部。

3. 检查依赖适配

如果运行在Android平台,不要使用Oracle官方的桌面版JavaMail库,改用Android适配版的com.sun.mail:android-mail和com.sun.mail:android-activation依赖,稳定版本可选择1.6.x系列。


修复后核心代码示例

fun sendMail(
    c: Context,
    ac: Account,
    from: String,
    tos: List<String>,
    subject: String,
    content: String,
    vararg f: File
) {
    // 手动注册MIME类型处理类
    val props = Properties().apply {
        put("mail.mime.multipart.ignoreexistingboundaryparameter", "true")
        put("mail.mime.contenthandler.multipart/mixed", "com.sun.mail.handlers.multipart_mixed")
        put("mail.mime.contenthandler.text/plain", "com.sun.mail.handlers.text_plain")
        put("mail.mime.contenthandler.application/octet-stream", "com.sun.mail.handlers.application_octet_stream")
    }
    // 用getInstance替代默认单例,避免配置复用
    val session = Session.getInstance(props, null)
    // 正确设置上下文类加载器
    Thread.currentThread().contextClassLoader = session::class.java.classLoader

    val email = MimeMessage(session)
    try {
        email.setFrom(InternetAddress(from))
        tos.forEach { to ->
            email.addRecipient(javax.mail.Message.RecipientType.TO, InternetAddress(to))
        }
        email.setSubject(subject)

        // 添加文本内容
        val textPart = MimeBodyPart()
        textPart.setContent(content, "text/plain; charset=UTF-8")
        val multipart = MimeMultipart()
        multipart.addBodyPart(textPart)

        // 循环添加所有附件
        f.forEach { file ->
            val attachmentPart = MimeBodyPart()
            val source: DataSource = FileDataSource(file)
            attachmentPart.dataHandler = DataHandler(source)
            attachmentPart.fileName = file.name
            multipart.addBodyPart(attachmentPart)
        }

        email.setContent(multipart)
        // 后续原有逻辑保持不变
        val message = createMessageWithEmail(email)
        val gmailService = getService(c, ac)
        val returnedMessage = gmailService?.users()?.messages()?.send("me", message)?.execute()
        // ... 其余原有代码
    } catch (e: MessagingException) {
        Log.e(TAG, "sendMail: $e")
    } catch (e: IOException) {
        Log.e(TAG, "sendMail: $e")
    }
}

内容的提问来源于stack exchange,提问作者JDevoloper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:57:02