5
5
import jakarta .mail .MessagingException ;
6
6
import jakarta .mail .internet .MimeMessage ;
7
7
import jakarta .mail .util .ByteArrayDataSource ;
8
+
9
+ import java .io .BufferedInputStream ;
8
10
import java .io .IOException ;
9
11
import java .io .InputStream ;
10
12
import java .util .Map ;
11
13
import lombok .RequiredArgsConstructor ;
12
14
import lombok .extern .slf4j .Slf4j ;
15
+ import org .apache .tika .Tika ;
13
16
import org .springframework .mail .javamail .JavaMailSender ;
14
17
import org .springframework .mail .javamail .MimeMessageHelper ;
15
18
import org .springframework .stereotype .Service ;
20
23
public class MailAdapter implements SendMailOutPort {
21
24
private final JavaMailSender mailSender ;
22
25
private final MailProperties mailProperties ;
26
+ private final Tika tika = new Tika ();
23
27
24
28
@ Override
25
29
public void sendMail (final MailMessage mailMessage ) {
26
30
final MimeMessage mimeMessage = mailSender .createMimeMessage ();
27
31
try {
28
- final MimeMessageHelper helper = new MimeMessageHelper (mimeMessage , true , "utf-8" );
32
+ final MimeMessageHelper helper = new MimeMessageHelper (mimeMessage , MimeMessageHelper . MULTIPART_MODE_MIXED );
29
33
helper .setFrom (mailProperties .getFromAddress ());
30
34
helper .setTo (mailMessage .getRecipient ());
31
35
helper .setSubject (mailMessage .getSubject ());
32
36
helper .setText (mailMessage .getBody (), true );
33
37
for (final Map .Entry <String , InputStream > entry : mailMessage .getAttachments ().entrySet ()) {
34
38
//TODO is there a way to do this with streaming? The following line loads the attachment into RAM...
35
- final DataSource dataSource = new ByteArrayDataSource (entry .getValue (), "application/octet-stream" );
39
+ InputStream bis = new BufferedInputStream (entry .getValue ());
40
+ String mime = detectMimeType (bis );
41
+ log .debug ("Mime-Type for " + entry .getKey () + " found " + mime );
42
+ final DataSource dataSource = new ByteArrayDataSource (bis , mime );
36
43
helper .addAttachment (entry .getKey (), dataSource );
37
44
//maybe like this?
38
45
//helper.addAttachment(e.getKey(), new InputStreamSourceImpl(e.getValue()));
@@ -43,6 +50,10 @@ public void sendMail(final MailMessage mailMessage) {
43
50
}
44
51
}
45
52
53
+ public String detectMimeType (InputStream inputStream ) throws IOException {
54
+ return tika .detect (inputStream );
55
+ }
56
+
46
57
// private class InputStreamSourceImpl implements InputStreamSource {
47
58
// private final InputStream inputStream;
48
59
//
0 commit comments