Java发送带附件邮件遇异常,已检查权限仍无法解决
Java发送带附件邮件异常问题排查
问题描述
实现Java发送带附件邮件时触发异常,已检查目标文件权限但问题仍存在。
相关代码
private void sendOceanDashboardSummary(String subject, String mailId, Map<String, Object> data) { try { String filePath = "C:\\Users\\Chandana\\File"; String fileName = "Ocean_Dashboard_Summary"; File file = new File(filePath); System.out.println("File exists: " + file.exists()); System.out.println("File is readable: " + file.canRead()); if (file.exists() && file.canRead()) { EmailMessageBuilder message = new EmailMessage.Builder().subject(subject) .withTemplate(PublicanConstants.ALERT_MAIL_TEMPLATE2, data).withHtmlContent(); InputStream stream = Files.newInputStream(Paths.get(filePath)); message.addFileAttachment(stream, fileName, "application/octet-stream"); EmailMessage emailMessage = message.to(mailId).build(); emailService.send(emailMessage); LOGGER.info("Email sent with the Ocean Dashboard Summary attachment."); } else { LOGGER.error("File does not exist or is not readable."); } } catch (Exception e) { LOGGER.error("Error occurred in attaching and sending the Ocean Dashboard Summary file.", e); } } // 调用代码 String subject = "Test mail with attachments"; String mailId = "*****"; Map<String, Object> data = new HashMap<>(); this.sendOceanDashboardSummary(subject, mailId, data);
报错信息
java.io.FileNotFoundException: C:\Users\Chandana\File (拒绝访问) at java.base/java.io.FileInputStream.open0(Native Method) at java.base/java.io.FileInputStream.open(FileInputStream.java:219) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112) at java.base/sun.nio.fs.WindowsFileSystemProvider.newInputStream(WindowsFileSystemProvider.java:123) at java.base/java.nio.file.Files.newInputStream(Files.java:159) at com.example.YourClass.sendOceanDashboardSummary(YourClass.java:XX)
文件权限情况
目标路径C:\Users\Chandana\File对应的权限显示当前用户拥有读取和执行权限,无写入限制。
问题分析与解决方案
1. 路径指向文件夹而非文件
代码中filePath设置为C:\\Users\\Chandana\\File,如果这是一个文件夹路径,Files.newInputStream无法打开文件夹的输入流,会触发拒绝访问异常。
解决: 修改filePath为具体的文件路径,比如:
String filePath = "C:\\Users\\Chandana\\File\\Ocean_Dashboard_Summary.xlsx"; // 根据实际文件后缀调整
2. 权限深层限制
即使文件权限显示可读,Windows系统的UAC(用户账户控制)可能限制程序访问用户目录下的文件。
解决:
- 尝试以管理员身份运行程序;
- 检查目标文件是否被其他应用(如Excel、记事本)占用,关闭占用进程后重试。
3. 输入流未关闭
代码中手动打开InputStream但未关闭,可能导致资源泄漏,也可能影响邮件发送流程。
解决: 使用try-with-resources语法自动关闭流:
try (InputStream stream = Files.newInputStream(Paths.get(filePath))) { message.addFileAttachment(stream, fileName, "application/octet-stream"); // 后续邮件构建与发送逻辑 }
内容的提问来源于stack exchange,提问作者Siva chandana
相关产品推荐
相关产品推荐

