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());
解决方法
经过一番排查,终于找到问题根源并解决了,分享给遇到同样问题的朋友:
Android权限配置问题:首先要确保你的应用已经获取了读取外部存储的权限。如果是Android 6.0及以上版本,除了在
AndroidManifest.xml中声明权限,还需要在运行时动态申请权限——没有权限的话,应用无法正常读取文件内容,自然会在发送附件时抛出异常。附件的Content-Type设置:给附件对应的
MimeBodyPart添加如下代码:
attachmentPart.setHeader("Content-Type", "application/octet-stream");
这里需要注意:如果把Content-Type设置为image/jpeg,SMTP服务器可能会把这封邮件判定为垃圾邮件,所以使用application/octet-stream作为通用的二进制流类型会更稳妥。
内容的提问来源于stack exchange,提问作者Andrew6299E
相关产品推荐
相关产品推荐

