1 package org.apache.turbine.util.mail;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import java.net.URL;
20
21 import javax.activation.DataHandler;
22 import javax.activation.URLDataSource;
23
24 import javax.mail.MessagingException;
25 import javax.mail.internet.MimeBodyPart;
26 import javax.mail.internet.MimeMultipart;
27
28 import org.apache.commons.lang.StringUtils;
29
30 import org.apache.ecs.Document;
31 import org.apache.ecs.ElementContainer;
32 import org.apache.ecs.html.Body;
33 import org.apache.ecs.html.Html;
34 import org.apache.ecs.html.PRE;
35
36 /***
37 * An HTML multipart email.
38 *
39 * <p>This class is used to send HTML formatted email. A text message
40 * can also be set for HTML unaware email clients, such as text-based
41 * email clients.
42 *
43 * <p>This class also inherits from MultiPartEmail, so it is easy to
44 * add attachents to the email.
45 *
46 * <p>To send an email in HTML, one should create a HtmlEmail, then
47 * use the setFrom, addTo, etc. methods. The HTML content can be set
48 * with the setHtmlMsg method. The alternate text content can be set
49 * with setTextMsg.
50 *
51 * <p>Either the text or HTML can be omitted, in which case the "main"
52 * part of the multipart becomes whichever is supplied rather than a
53 * multipart/alternative.
54 *
55 * @author <a href="mailto:unknown">Regis Koenig</a>
56 * @author <a href="mailto:sean@informage.net">Sean Legassick</a>
57 * @version $Id: HtmlEmail.java 264148 2005-08-29 14:21:04Z henning $
58 * @deprecated Use org.apache.commons.mail.HtmlEmail instead.
59 */
60 public class HtmlEmail extends MultiPartEmail
61 {
62 protected MimeMultipart htmlContent;
63
64 protected String text;
65 protected String html;
66
67 /***
68 * Basic constructor.
69 *
70 * @exception MessagingException.
71 */
72 public HtmlEmail()
73 throws MessagingException
74 {
75 this.init();
76 }
77
78 /***
79 * Instantiates a new MimeMultipart object if it isn't already
80 * instantiated.
81 *
82 * @return A MimeMultipart object
83 */
84 public MimeMultipart getHtmlContent()
85 {
86 if (htmlContent == null)
87 {
88 htmlContent = new MimeMultipart();
89 }
90 return htmlContent;
91 }
92
93 /***
94 * Set the text content.
95 *
96 * @param text A String.
97 * @return An HtmlEmail.
98 * @exception MessagingException.
99 */
100 public HtmlEmail setTextMsg(String text)
101 throws MessagingException
102 {
103 this.text = text;
104 return this;
105 }
106
107 /***
108 * Set the HTML content.
109 *
110 * @param html A String.
111 * @return An HtmlEmail.
112 * @exception MessagingException.
113 */
114 public HtmlEmail setHtmlMsg(String html)
115 throws MessagingException
116 {
117 this.html = html;
118 return this;
119 }
120
121 /***
122 * Set the HTML content based on an ECS document.
123 *
124 * @param doc A Document.
125 * @return An HtmlEmail.
126 * @exception MessagingException.
127 */
128 public HtmlEmail setHtmlMsg(Document doc)
129 throws MessagingException
130 {
131 return setHtmlMsg(doc.toString());
132 }
133
134 /***
135 * Set the message.
136 *
137 * <p>This method overrides the MultiPartEmail setMsg() method in
138 * order to send an HTML message instead of a full text message in
139 * the mail body. The message is formatted in HTML for the HTML
140 * part of the message, it is let as is in the alternate text
141 * part.
142 *
143 * @param msg A String.
144 * @return An Email.
145 * @exception MessagingException.
146 */
147 public Email setMsg(String msg)
148 throws MessagingException
149 {
150 setTextMsg(msg);
151 setHtmlMsg(new ElementContainer(new Html(new Body()
152 .addElement(new PRE(msg)))).toString());
153 return this;
154 }
155
156 /***
157 * Embeds an URL in the HTML.
158 *
159 * <p>This method allows to embed a file located by an URL into
160 * the mail body. It allows, for instance, to add inline images
161 * to the email. Inline files may be referenced with a
162 * <code>cid:xxxxxx</code> URL, where xxxxxx is the Content-ID
163 * returned by the embed function.
164 *
165 * <p>Example of use:<br><code><pre>
166 * HtmlEmail he = new HtmlEmail();
167 * he.setHtmlMsg("<html><img src=cid:"+embed("file:/my/image.gif","image.gif")+"></html>");
168 * // code to set the others email fields (not shown)
169 * </pre></code>
170 *
171 * @param url The URL of the file.
172 * @param name The name that will be set in the filename header
173 * field.
174 * @return A String with the Content-ID of the file.
175 * @exception MessagingException.
176 */
177 public String embed(URL url, String name)
178 throws MessagingException
179 {
180 MimeBodyPart mbp = new MimeBodyPart();
181
182 mbp.setDataHandler(new DataHandler(new URLDataSource(url)));
183 mbp.setFileName(name);
184 mbp.setDisposition("inline");
185 String cid = org.apache.turbine.util.GenerateUniqueId.getIdentifier();
186 mbp.addHeader("Content-ID", cid);
187
188 getHtmlContent().addBodyPart(mbp);
189 return mbp.getContentID();
190 }
191
192 /***
193 * Does the work of actually sending the email.
194 *
195 * @exception MessagingException, if there was an error.
196 */
197 public void send()
198 throws MessagingException
199 {
200 MimeBodyPart msgText = null;
201 MimeBodyPart msgHtml = null;
202
203 if (StringUtils.isNotEmpty(text) && StringUtils.isNotEmpty(html))
204 {
205
206 MimeMultipart msg = getHtmlContent();
207 msg.setSubType("alternative");
208 main.setContent(msg);
209
210 msgText = new MimeBodyPart();
211 msgHtml = new MimeBodyPart();
212 msg.addBodyPart(msgText);
213 msg.addBodyPart(msgHtml);
214
215 }
216 else if (StringUtils.isNotEmpty(text))
217 {
218
219 msgText = main;
220 }
221 else if (StringUtils.isNotEmpty(html))
222 {
223
224 msgHtml = main;
225 }
226 else
227 {
228 msgText = main;
229 text = "NO BODY";
230 }
231
232 if (msgText != null)
233 {
234
235 if (charset != null)
236 {
237 msgText.setText(text, charset);
238 }
239 else
240 {
241 msgText.setText(text);
242 }
243 }
244
245 if (msgHtml != null)
246 {
247
248 if (charset != null)
249 {
250 msgHtml.setContent(html, TEXT_HTML + ";charset=" + charset);
251 }
252 else
253 {
254 msgHtml.setContent(html, TEXT_HTML);
255 }
256 }
257
258 super.send();
259 }
260 }