【javamail附件的问题】

这个问题出现有一阵子了,因为一直忙于开发,不是很在意。

  一位同事在自己的计算机测试邮件发送程序时,出现

  Exception in thread "main" java.lang.NullPointerException

  at javax.mail.internet.MimeUtility.getEncoding(MimeUtility.java:226)

  at javax.mail.internet.MimeUtility.getEncoding(MimeUtility.java:299)

  at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1375)

  at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1021)

  at javax.mail.internet.MimeMultipart.updateHeaders(MimeMultipart.java:419)

  at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1354)

  at javax.mail.internet.MimeMessage.updateHeaders(MimeMessage.java:2107)

  at javax.mail.internet.MimeMessage.saveChanges(MimeMessage.java:2075)

  at javax.mail.Transport.send(Transport.java:123)

  对于javamail 我并不陌生,使用已经超过十年。因为时间的匆忙,发现在电脑公司系统下载线上系统不出问题,所以本机的事情,就忽略了,直到有一天必须本机调试,这才硬着头皮解决问题。

  javamail相对简单,

  出现问题是MimeUtility.getEncoding(MimeUtility.java:226)

  代码如下

  finally {

  // Close the input stream

  try {

  is.close();

  } catch (IOException ioex) { }

  }

  is类型 InputStream is = null;

  is从ds中得来的,

  is = ds.getInputStream();

  当时没有想清楚datasource具体来源,主要还是对源码不熟。片面的认为是使用上出了问题,

  MimeBodyPart.java

  static void updateHeaders(MimePart part) 中

  if (part.getHeader("Content-Transfer-Encoding") == null)

  setEncoding(part, MimeUtility.getEncoding(dh));

  只要设置了Content-Transfer-Encoding了,就不会出现问题,

  message.setHeader("Content-Transfer-Encoding", "quoted-printable");

  最后发现不行。

  冷静的一思考,ds.getInputStream();来源于DataSource,

  /**

  * The DataSource supplying our InputStream.

  */

  protected DataSource ds = null;

  DataSource 构造了

  public synchronized DataHandler getDataHandler()

  throws MessagingException {

  if (dh == null)

  dh = new MimeBodyPart.MimePartDataHandler(

  new MimePartDataSource(this));

  return dh;

  }

  /**

  * The DataHandler object representing this Message's content.

  */

  protected DataHandler dh;

  如此推理,代码出现在内容上面,使用DataSource的只有附件

  messageBodyPart = new MimeBodyPart();

  DataSource source = new FileDataSource(filename);

  messageBodyPart.setDataHandler(new DataHandler(source));

  messageBodyPart.setFileName(filename);

  multipart.addBodyPart(messageBodyPart);

  // Put parts in message

  message.setContent(multipart);

  // Send the message

  Transport.send(message);

  出现问题的原因,就是附件不存在。

  解决问题很简单,先使用File判断一下文件存在不存在,存在后再调用addBodyPart。

  或者 source.getOutputStream().close()

  sun的工程师处理也很不合理,source.getFile(),返回File,直接判断文件存在不存在,不存在的话,直接抛出FileNotFoundException异常。

转载于:https://www.cnblogs.com/qq12345678/p/3284889.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值