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

Android平台下JavaMail无法添加附件,抛出IOException问题求助

问题:Android邮件添加附件发送时抛出IOException,无附件正常发送

我在开发Android邮件发送功能时碰到了一个头疼的问题:当给邮件添加附件时,发送过程会抛出IOException,但如果不添加附件,邮件就能正常发送出去。我已经通过File.exists()确认过要附加的文件确实存在,试了好几种调整代码的方式,结果都一样。

我的相关代码如下:

... 
Properties props = new Properties(); 
props.put("mail.transport.protocol", "smtp"); 
props.put("mail.smtp.host", mailhost); 
props.put("mail.smtp.port", port); 
props.put("mail.smtp.ssl.enable", "true"); 
props.put("mail.smtp.auth", "true"); 
Session session = Session.getInstance(props); 
MimeMessage msg = new MimeMessage(session); 
Multipart multipart = new MimeMultipart(); 
Transport transport = session.getTransport(); 
msg.setSender(new InternetAddress(sender)); 
msg.setSubject(subject); 
MimeBodyPart part = new MimeBodyPart(); 
part.setText(body); 
String file = new String("/sdcard/DCIM/2.jpg"); 
FileDataSource fileDataSource = new FileDataSource(file); 
MimeBodyPart attachmentPart = new MimeBodyPart(); 
attachmentPart.setDataHandler(new DataHandler(fileDataSource)); 
attachmentPart.setFileName(fileDataSource.getName()); 
if (new File(file).exists()) Log.e("sendMail", "file exists"); 
multipart.addBodyPart(part); 
multipart.addBodyPart(attachmentPart); 
msg.setContent(multipart); 
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients)); 
transport.connect(mailhost, username, password); 
transport.sendMessage(msg, msg.getAllRecipients()); 
解决方法

经过一番排查,终于找到问题根源并解决了,分享给遇到同样问题的朋友:

  1. Android权限配置问题:首先要确保你的应用已经获取了读取外部存储的权限。如果是Android 6.0及以上版本,除了在AndroidManifest.xml中声明权限,还需要在运行时动态申请权限——没有权限的话,应用无法正常读取文件内容,自然会在发送附件时抛出异常。

  2. 附件的Content-Type设置:给附件对应的MimeBodyPart添加如下代码:

attachmentPart.setHeader("Content-Type", "application/octet-stream");

这里需要注意:如果把Content-Type设置为image/jpeg,SMTP服务器可能会把这封邮件判定为垃圾邮件,所以使用application/octet-stream作为通用的二进制流类型会更稳妥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:51:49