使用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
相关产品推荐
相关产品推荐

