通过Java应用程序中的amazon服务器上的JavaMail API发送带附件的邮件时出现空指针exception

使用javamail API在亚马逊服务器上发送带有pdf附件的邮件时,它会在日志中抛出空指针exception。 但是同样的代码在本地工作。

public void sendMail(final String mailTo, final String mailSubject, final String mailText, final String filePath, final String fileName) { logger.info("Inside sendMail Method..."); final Properties config = createConfiguration(); // Creates a mail session. We need to supply username and password for Gmail authentication. final Session session = Session.getInstance(config, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(mailFrom, mailPassword); } }); // Creates email message final MimeMessage message = new MimeMessage(session); try { message.setFrom(new InternetAddress(mailFrom)); message.setRecipient(Message.RecipientType.TO, new InternetAddress(mailTo)); message.setSubject(mailSubject); final BodyPart messagePart = new MimeBodyPart(); messagePart.setContent(mailText, contentType); final MimeMultipart multipart = new MimeMultipart(); multipart.addBodyPart(messagePart); if (filePath != null) { final MimeBodyPart attachmentPart = new MimeBodyPart(); final URL url; try { url = new URL(filePath); final DataSource source = new URLDataSource(url); attachmentPart.setDataHandler(new DataHandler(source)); attachmentPart.setFileName(fileName); multipart.addBodyPart(attachmentPart); } catch (MalformedURLException e) { logger.error("Malformed URL Exception: " + e.getMessage()); } } message.setContent(multipart); // Send a message Transport.send(message); logger.info("Mail triggered successfully"); } catch (final AddressException e) { logger.error("Address Exception: " + e.getMessage()); } catch (final MessagingException e) { logger.error("Messaging Exception: " + e.getMessage()); } } 

请在下面找到amozon服务器应用程序日志中生成的exception。

 2014-03-20 19:01:30,936 [DefaultQuartzScheduler_Worker-2] INFO net.app.api.jobs.MailJob - Error in triggering the mail : null 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) at net.app.api.mail.MailTrigger.sendMail(MailTrigger.java:104) at net.app.api.jobs.MailJob.execute(MailJob.java:41) at org.quartz.core.JobRunShell.run(JobRunShell.java:213) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557) 

有人请为此提供一些可行的解决方案。 提前致谢。

问题可能是您无法访问filePath中的URL。

filePath是“file:”URL吗? 如果是这样,为什么不使用FileDataSource呢?

我已将附件代码库部分更改为

 final MimeBodyPart attachmentPart = new MimeBodyPart(); final URL url; try { url = new URL(filePath); final DataSource source = new URLDataSource(url); attachmentPart.setDataHandler(new DataHandler(source)); attachmentPart.setFileName(fileName); attachmentPart.setDisposition(Part.ATTACHMENT); attachmentPart.setHeader("Content-Transfer-Encoding", "base64"); multipart.addBodyPart(attachmentPart); } catch (final MalformedURLException e) { logger.error("Malformed URL Exception: " + e.getMessage()); } 

空指针exception问题得到解决,并获得了一个新的exception,因为SSLProtocolexception,并开始了解在本地机器中安装在两台机器上的java jdk与1.6亚马逊云中的差异。 因此遵循SSL握手警报:自升级到Java 1.7.0以来,unrecognized_name错误 ,现在邮件正在两个服务器中按预期触发。