Clover icon

Magnolia Mail module 5.5.2

  1. Project Clover database Mon May 6 2019 07:05:59 CEST
  2. Package info.magnolia.module.mail.templates

File MgnlMultipartEmail.java

 

Coverage histogram

../../../../../img/srcFileCovDistChart9.png
16% of files have more coverage

Code metrics

16
43
4
1
180
92
14
0.33
10.75
4
3.5
6% of code in this file is excluded from these metrics.

Classes

Class Line # Actions
MgnlMultipartEmail 63 43 6% 14 7
0.888888988.9%
 

Contributing tests

This file is covered by 15 tests. .

Source view

1    /**
2    * This file Copyright (c) 2003-2018 Magnolia International
3    * Ltd. (http://www.magnolia-cms.com). All rights reserved.
4    *
5    *
6    * This file is dual-licensed under both the Magnolia
7    * Network Agreement and the GNU General Public License.
8    * You may elect to use one or the other of these licenses.
9    *
10    * This file is distributed in the hope that it will be
11    * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
12    * implied warranty of MERCHANTABILITY or FITNESS FOR A
13    * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
14    * Redistribution, except as permitted by whichever of the GPL
15    * or MNA you select, is prohibited.
16    *
17    * 1. For the GPL license (GPL), you can redistribute and/or
18    * modify this file under the terms of the GNU General
19    * Public License, Version 3, as published by the Free Software
20    * Foundation. You should have received a copy of the GNU
21    * General Public License, Version 3 along with this program;
22    * if not, write to the Free Software Foundation, Inc., 51
23    * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24    *
25    * 2. For the Magnolia Network Agreement (MNA), this file
26    * and the accompanying materials are made available under the
27    * terms of the MNA which accompanies this distribution, and
28    * is available at http://www.magnolia-cms.com/mna.html
29    *
30    * Any modifications to this file must keep this entire header
31    * intact.
32    *
33    */
34    package info.magnolia.module.mail.templates;
35   
36    import info.magnolia.module.mail.MailException;
37    import info.magnolia.module.mail.MailTemplate;
38   
39    import java.net.URL;
40    import java.util.List;
41   
42    import javax.activation.DataHandler;
43    import javax.activation.DataSource;
44    import javax.activation.FileDataSource;
45    import javax.activation.URLDataSource;
46    import javax.mail.BodyPart;
47    import javax.mail.internet.MimeBodyPart;
48    import javax.mail.internet.MimeMultipart;
49   
50   
51    /**
52    * A base class for sending mails with attachments.
53    * The class contains hierarchical structure of MimeMultipart and MimeBodyPart:
54    * - MimeMultipart multipartMixed - multipart/mixed
55    * -- MimeMultipart multipartRelated - multipart/related
56    * --- MimeBodyPart messageBodyPart - text/plain, text/html - the text part of email
57    * --- MimeBodyPart attachmentBodyPart - the attachments which are shown in text part of message
58    * -- MimeBodyPart attachmentBodyPart - attachments connected only like attachments in mail clients
59    *
60    * Date: Apr 1, 2006 Time: 9:00:35 PM
61    * @author <a href="mailto:niko@macnica.com">Nicolas Modrzyk</a>
62    */
 
63    public abstract class MgnlMultipartEmail extends MgnlEmail {
64   
65    private static final String CONTENT_ID = "Content-ID";
66   
67    private static final String RELATED = "related";
68   
69    private static final String MIXED = "mixed";
70   
71    protected MimeMultipart multipartMixed;
72   
73    protected MimeMultipart multipartRelated;
74   
 
75    toggle public boolean isMultipart() {
76    // if exist top level MimeMultipart of email hierarchy -> then the email is multipart
77    return (this.multipartMixed != null);
78    }
79   
 
80    toggle public MimeMultipart getMailMultipart() {
81    // return top level MimeMultipart of email hierarchy
82    return this.multipartMixed;
83    }
84   
 
85  19 toggle public MgnlMultipartEmail(MailTemplate template) {
86  19 super(template);
87    }
88   
 
89  12 toggle @Override
90    public MimeBodyPart addAttachment(MailAttachment attachment) throws MailException {
91   
92  12 try {
93  12 if (!isMultipart()) {
94  7 turnOnMultipart();
95    }
96  12 MimeBodyPart attachmentBodyPart = new MimeBodyPart();
97  12 String key = attachment.getName();
98  12 log.info("Found new attachment with name :" + key);
99   
100    // get info on the attachment
101  12 URL url = attachment.getUrl();
102  12 String name = attachment.getFileName();
103  12 String contentType = attachment.getContentType();
104   
105    // set the disposition of the file.
106  12 attachmentBodyPart.setDisposition(attachment.getDisposition() + "; filename=\"" + name + "\"");
107   
108    // Fetch the image and associate to part
109  12 DataSource fds = url.getProtocol().startsWith("file:")
110    ? new FileDataSource(url.getFile())
111    : new URLDataSource(url);
112    // DataSource fd = new FileDataSource(file);
113  12 attachmentBodyPart.setDataHandler(new DataHandler(fds));
114    // Add a header to connect to the HTML
115   
116    // MAGNOLIA-1649 this is really important!
117  12 if (!key.startsWith("<")) {
118  12 key = "<" + key + ">";
119    }
120  12 attachmentBodyPart.setHeader(CONTENT_ID, key);
121   
122    // set the header as well as the content type do this AFTER setting the data source
123  12 attachmentBodyPart.setHeader(CONTENT_TYPE, contentType + "; name=\"" + name + "\"");
124   
125    // add attachment to appropriate part of email structure
126  12 if (attachment.getMimeMultipart().equals(RELATED)) {
127  4 this.multipartRelated.addBodyPart(attachmentBodyPart);
128    } else {
129  8 this.multipartMixed.addBodyPart(attachmentBodyPart);
130    }
131   
132  12 return attachmentBodyPart;
133    } catch (Exception e) {
134  0 throw new MailException(e.getMessage(), e);
135    }
136    }
137   
 
138  7 toggle private void turnOnMultipart() {
139   
140  7 try {
141  7 if (this.multipartMixed == null) {
142  7 this.multipartMixed = new MimeMultipart(MIXED);
143  7 this.multipartRelated = new MimeMultipart(RELATED);
144  7 MimeBodyPart relatedBodyPart = new MimeBodyPart();
145  7 relatedBodyPart.setContent(multipartRelated);
146  7 this.multipartMixed.addBodyPart(relatedBodyPart);
147    }
148  5 if (this.getContent() != null) {
149   
150  5 Object o = this.getContent();
151  5 if (o instanceof String) {
152  5 BodyPart messageBodyPart = new MimeBodyPart();
153  5 messageBodyPart.setContent(o, getContentType());
154  5 this.multipartRelated.addBodyPart(messageBodyPart, 0);
155    }
156    }
157  5 this.setContent(this.multipartMixed);
158    } catch (Exception e) {
159  2 log.info(e.getMessage());
160    }
161    }
162   
 
163  13 toggle @Override
164    public void setBody(String body) throws Exception {
165   
166  13 this.setContent(body, getContentType());
167   
168    // If we didn't do this then if we call setBody twice or more -> it leads to add attachments multiple times.
169    // Also in another calls. The template may not have attachments, then we don't need send mail like MultipartEmail
170  13 this.multipartMixed = null;
171  13 this.multipartRelated = null;
172   
173    // process the attachments
174  13 final List<MailAttachment> attachments = super.getTemplate().getAttachments();
175  13 if (attachments != null) {
176  13 setAttachments(attachments);
177    }
178    }
179   
180    }