Как использовать spring отправить письмо с вложением, используя InputStream?
ситуация такова:
сначала мы создаем файл в памяти, мы можем получить объект InputStream во-вторых, объект InputStream должен быть отправлен как вложение электронной почты.. язык java, мы используем spring для отправки электронной почты.
Я нахожу много, но я не могу найти, как отправлять вложения электронной почты, используя InputStream... я стараюсь делать это
InputStreamSource iss = null;
iss = new InputStreamResource(new FileInputStream("c:\\a.txt"));
MimeMessageHelper message = new MimeMessageHelper(mimeMessage,
true, "UTF-8");
message.addAttachment("attachment", iss1);
но мы исключение:
Входящий ресурс содержит открытый поток: недопустимый аргумент. JavaMail требует InputStreamSource, который создает новый поток для каждого вызова.
Ответы
Ответ 1
Для файлов, сгенерированных в памяти, вы можете использовать ByteArrayResource. Просто преобразуйте объект InputStream с помощью IOUtils из Apache Commons. Это довольно просто:
helper.addAttachment("attachement",
new ByteArrayResource(IOUtils.toByteArray(inputStream)));
Ответ 2
Посмотрите справочную главу spring 24.3 Использование JavaMail MimeMessageHelper
Пример оттуда, я думаю, он хочет, чтобы вы хотели:
JavaMailSenderImpl sender = new JavaMailSenderImpl();
sender.setHost("mail.host.com");
MimeMessage message = sender.createMimeMessage();
// use the true flag to indicate you need a multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setTo("[email protected]");
helper.setText("Check out this image!");
// let attach the infamous windows Sample file (this time copied to c:/)
FileSystemResource file = new FileSystemResource(new File("c:/Sample.jpg"));
helper.addAttachment("CoolImage.jpg", file);
sender.send(message);
Ответ 3
Вы можете сделать простую реализацию InputStreamSource и передать в нее свежий InputStream, если хотите:
InputStreamSource iss = new InputStreamSource() {
@Override
public InputStream getInputStream() throws IOException {
// provide fresh InputStream
return new FileInputStream("c:\\a.txt");
}
}
MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, "UTF-8");
message.addAttachment("attachment", iss);
Ответ 4
//inlineFileObjectCreated - вы можете создать объект StringBuilder для примера
ByteArrayDataSource source = new ByteArrayDataSource("file name", "contentType", inlineFileObjectCreated.getBytes() );
JavaMailSender mailSender = (JavaMailSender) ServicesHome.getService("javaMailSender");
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setTo(toArray);
mimeMessageHelper.setSubject("");
mimeMessageHelper.setText("");
mimeMessageHelper.addAttachment("filename", source);
mailSender.send(mimeMessageHelper.getMimeMessage());
/////////////////////////////////////////////
import javax.activation.DataSource;
public class ByteArrayDataSource implements DataSource {
byte[] bytes;
String contentType;
String name;
public ByteArrayDataSource( String name, String contentType, byte[] bytes ) {
this.name = name;
this.bytes = bytes;
this.contentType = contentType;
}
public String getContentType() {
return contentType;
}
public InputStream getInputStream() {
return new ByteArrayInputStream(bytes);
}
public String getName() {
return name;
}
public OutputStream getOutputStream() throws IOException {
throw new FileNotFoundException();
}
}