在Java应用程序中,通过amazon服务器上的JavaMail API发送带有附件的邮件时出现空指针异常
在amazon服务器上使用javamail API发送带有pdf附件的邮件时,其在日志中引发空指针异常。但同样的代码在本地工作在Java应用程序中,通过amazon服务器上的JavaMail API发送带有附件的邮件时出现空指针异常,java,amazon-ec2,jakarta-mail,Java,Amazon Ec2,Jakarta Mail,在amazon服务器上使用javamail API发送带有pdf附件的邮件时,其在日志中引发空指针异常。但同样的代码在本地工作 public void sendMail(final String mailTo, final String mailSubject, final String mailText, final String filePath, final String fileName) { logger.info("Inside sendMail Method...");
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服务器应用程序日志上生成的异常
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
文件路径是“文件:”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());
}
空指针异常问题得到了解决,得到了一个新的异常,称为SSLProtocol异常,并了解了两台机器上安装的java jdk的区别,本地机器上安装了1.6,amazon云上安装了1.7。接下来,邮件将按预期在两台服务器中触发。检查
DataSource
和DataHandler
是否初始化为正确的值,并将所需的值传递给它。此行给出异常:Transport.send(message);amazon服务器中的文件路径类似于“”,我们可以通过浏览器和代码库在本地访问此文件路径。我也尝试使用FileDataSource,但出现了相同的错误。你能建议其他的方法吗?谢谢。这个文件和JavaMail应用程序在同一台机器上,对吗?假设它确实是存储在服务器上的文件。。。确保可以在应用程序中使用FileInputStream访问该文件,然后在创建消息时使用FileDataSource。如果无法使用FileInputStream访问该文件,则需要调试该问题。如果它实际上不是存储在服务器上的文件,而是使用URL访问的资源,请确保您可以使用URLConnection.getInputStream访问它。我有相同的堆栈跟踪。。。更新到最近的mail.jar后,我收到了一条更有用的消息——该文件不存在。