英文:
How to send a file via email without storing it in storage first using spring boot?
问题
我正在开发一个Spring Boot应用程序。在我的项目中,我正在创建一个 .xlsx 文件,然后我需要使用 Spring Boot 通过电子邮件发送它。
我可以使用 Apache POI 创建文件,但是后来要将其作为附件通过邮件发送,我应该将文件保存在本地的某个位置,然后在发送附件时将文件移回来。
是否有任何方式可以直接创建 .xlsx 文件并通过电子邮件发送它,而无需先将其保存在某个地方?
对于邮件部分,我使用的是 'org.springframework.boot:spring-boot-starter-mail'。
对于 .xlsx 文件部分,我使用的是 'org.apache.poi', name: 'poi', version: '4.1.2' 和 'org.apache.poi', name: 'poi-ooxml', version: '4.1.2'。
源代码:
public void test() throws IOException, MessagingException {
XSSFWorkbook workbook = new XSSFWorkbook();
List<String> s = Arrays.asList("person", "animal");
CellStyle style = workbook.createCellStyle();
style.setWrapText(true);
int n = 1;
String source = s.get(0);
Sheet sheet = workbook.createSheet(source);
for (String i : s) {
if (!source.equalsIgnoreCase(i)) {
sheet = workbook.createSheet(i);
Row header = sheet.createRow(0);
CellStyle headerStyle = workbook.createCellStyle();
XSSFFont font = workbook.createFont();
font.setFontName("Arial");
font.setBold(true);
headerStyle.setFont(font);
Cell headerCell = header.createCell(0);
headerCell.setCellValue("Name");
headerCell.setCellStyle(headerStyle);
headerCell = header.createCell(1);
headerCell.setCellValue("Age");
headerCell.setCellStyle(headerStyle);
source = i;
}
Row row = sheet.createRow(n);
Cell cell = row.createCell(0);
cell.setCellValue("Udhav Mohata");
cell.setCellStyle(style);
cell = row.createCell(1);
cell.setCellValue(22);
cell.setCellStyle(style);
n++;
}
FileOutputStream outputStream = new FileOutputStream(Path_to_the_file);
workbook.write(outputStream);
workbook.close();
sendMail();
}
public void sendMail() throws MessagingException, IOException {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom("spidercodie@gmail.com");
helper.setTo("udhavmohata1@gmail.com");
helper.setSubject("Test Mail");
helper.setText("Hello world");
FileSystemResource file = new FileSystemResource(path_to_the_file);
helper.addAttachment("Invoice.xlsx", file);
mailSender.send(message);
}
英文:
I am working on a spring boot application. In my project I am creating a .xlsx file and then i have to send via email using spring boot.
I am able to create the file using apache poi but later to send it via mail as an attachment, i should save the file somewhere in local and then move the file back in while sending it as an attachment.
Is there any way in which I can create a .xlsx file and directly send it via email, without saving it somewhere first?
For mail I am using 'org.springframework.boot:spring-boot-starter-mail'
For .xlsx I am using 'org.apache.poi', name: 'poi', version: '4.1.2' and 'org.apache.poi', name: 'poi-ooxml', version: '4.1.2'.
Source Code
XSSFWorkbook workbook = new XSSFWorkbook();
List<String> s = Arrays.asList("person","animal");
CellStyle style = workbook.createCellStyle();
style.setWrapText(true);
int n = 1;
String source = s.get(0);
Sheet sheet = workbook.createSheet(source);
for (String i : s) {
if(!source.equalsIgnoreCase(i)) {
sheet = workbook.createSheet(i);
Row header = sheet.createRow(0);
CellStyle headerStyle = workbook.createCellStyle();
XSSFFont font = workbook.createFont();
font.setFontName("Arial");
font.setBold(true);
headerStyle.setFont(font);
Cell headerCell = header.createCell(0);
headerCell.setCellValue("Name");
headerCell.setCellStyle(headerStyle);
headerCell = header.createCell(1);
headerCell.setCellValue("Age");
headerCell.setCellStyle(headerStyle);
source = i;
}
Row row = sheet.createRow(n);
Cell cell = row.createCell(0);
cell.setCellValue("Udhav Mohata");
cell.setCellStyle(style);
cell = row.createCell(1);
cell.setCellValue(22);
cell.setCellStyle(style);
n++;
}
FileOutputStream outputStream = new FileOutputStream(Path_to_the_file);
workbook.write(outputStream);
workbook.close();
sendMail();
}
public void sendMail() throws MessagingException, IOException {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom("spidercodie@gmail.com");
helper.setTo("udhavmohata1@gmail.com");
helper.setSubject("Test Mail");
helper.setText("Hello world");
FileSystemResource file = new FileSystemResource(path_to_the_file));
helper.addAttachment("Invoice.xlsx", file);
mailSender.send(message);
}
</details>
# 答案1
**得分**: 5
这是我的建议,基于我提供的链接中的方法,这本质上也是Gagravarr在他的评论中提到的。
(这个方法在我使用Gmail时有效。)
**创建Excel文件**
我使用了您的代码,除了最后一部分。我没有将您的工作簿写入文件系统,而是通过`java.io.ByteArrayOutputStream`将其写入字节数组。
```java
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
workbook.write(bos);
} finally {
bos.close();
}
byte[] excelFileAsBytes = bos.toByteArray();
使用我的字节数组作为附件
在我的邮件代码中(几乎与您的代码相同,但我不想意外复制/粘贴您的电子邮件地址),我替换了这些行:
FileSystemResource file = new FileSystemResource(path_to_the_file));
helper.addAttachment("Invoice.xlsx", file);
使用org.springframework.core.io.ByteArrayResource
的以下行:
ByteArrayResource resource = new ByteArrayResource(excelFileAsBytes);
helper.addAttachment("Invoice.xlsx", resource);
这样就会得到一封包含Excel文件附件的电子邮件。
英文:
Here is my suggestion, based on the approach in the link I provided - which is essentially what Gagravarr also mentioned in his comments.
(This approach works fine for me, using gmail.)
Creating the Excel File
I used your code, except for the final part. Instead of writing your workbook to the filesystem, I wrote it to a byte array via java.io.ByteArrayOutputStream
.
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
workbook.write(bos);
} finally {
bos.close();
}
byte[] excelFileAsBytes = bos.toByteArray();
Using my Byte Array as an Attachment
In my e-mailer code (which is almost identical to yours, but I did not want to copy/paste your e-mail address by accident), I replaced these lines:
FileSystemResource file = new FileSystemResource(path_to_the_file));
helper.addAttachment("Invoice.xlsx", file);
with these lines, using a org.springframework.core.io.ByteArrayResource
:
ByteArrayResource resource = new ByteArrayResource(excelFileAsBytes);
helper.addAttachment("Invoice.xlsx", resource);
That gives me an e-mail containing the Excel file as an attachment.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论