]> git.basschouten.com Git - openhab-addons.git/commitdiff
[mail] Fix sending HTML/Multipart mails (#13108)
authorHans-Jörg Merk <github@hmerk.de>
Sun, 10 Jul 2022 13:21:56 +0000 (15:21 +0200)
committerGitHub <noreply@github.com>
Sun, 10 Jul 2022 13:21:56 +0000 (15:21 +0200)
Signed-off-by: Hans-Jörg Merk <github@hmerk.de>
bundles/org.openhab.binding.mail/src/main/java/org/openhab/binding/mail/internal/SMTPHandler.java

index dbf271e5ad43faf64133e907ce2a7570f74e776c..f95dc033a13dc1613a05df5bbb246266197172c9 100644 (file)
  */
 package org.openhab.binding.mail.internal;
 
+import java.lang.reflect.Field;
 import java.util.Collection;
 import java.util.List;
 
+import javax.activation.DataHandler;
+import javax.activation.DataSource;
 import javax.activation.PatchedMailcapCommandMap;
 import javax.mail.MessagingException;
+import javax.mail.Part;
+import javax.mail.internet.MimeMultipart;
 
 import org.apache.commons.mail.DefaultAuthenticator;
 import org.apache.commons.mail.Email;
@@ -39,6 +44,7 @@ import org.slf4j.LoggerFactory;
  *
  * @author Jan N. Klug - Initial contribution
  * @author Hans-Jörg Merk - Fixed UnsupportedDataTypeException - Originally by Jan N. Klug
+ *         - Fix sending HTML/Multipart mail - Originally by Jan N. Klug
  */
 @NonNullByDefault
 public class SMTPHandler extends BaseThingHandler {
@@ -100,7 +106,25 @@ public class SMTPHandler extends BaseThingHandler {
             }
 
             mail.buildMimeMessage();
-            mail.getMimeMessage().getDataHandler().setCommandMap(commandMap);
+
+            // fix command map not available
+            DataHandler dataHandler = mail.getMimeMessage().getDataHandler();
+            dataHandler.setCommandMap(commandMap);
+            try {
+                DataSource dataSource = dataHandler.getDataSource();
+                Field dataField = dataSource.getClass().getDeclaredField("data");
+                dataField.setAccessible(true);
+                Object data = dataField.get(dataSource);
+                if (data instanceof MimeMultipart) {
+                    MimeMultipart mimeMultipart = (MimeMultipart) data;
+                    for (int i = 0; i < mimeMultipart.getCount(); i++) {
+                        Part mimePart = mimeMultipart.getBodyPart(i);
+                        mimePart.getDataHandler().setCommandMap(commandMap);
+                    }
+                }
+            } catch (NoSuchFieldException | IllegalAccessException ignored) {
+            }
+
             mail.sendMimeMessage();
         } catch (MessagingException | EmailException e) {
             Throwable cause = e.getCause();