KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > dlog4j > util > mail > MailSender


1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation; either version 2 of the License, or
5  * (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU Library General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software
14  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
15  */

16 package dlog4j.util.mail;
17
18 import java.io.File JavaDoc;
19 import java.io.UnsupportedEncodingException JavaDoc;
20 import java.util.ArrayList JavaDoc;
21 import java.util.Date JavaDoc;
22 import java.util.Properties JavaDoc;
23
24 import javax.activation.DataHandler JavaDoc;
25 import javax.activation.DataSource JavaDoc;
26 import javax.activation.FileDataSource JavaDoc;
27 import javax.mail.Authenticator JavaDoc;
28 import javax.mail.BodyPart JavaDoc;
29 import javax.mail.Message JavaDoc;
30 import javax.mail.MessagingException JavaDoc;
31 import javax.mail.Multipart JavaDoc;
32 import javax.mail.PasswordAuthentication JavaDoc;
33 import javax.mail.SendFailedException JavaDoc;
34 import javax.mail.Session JavaDoc;
35 import javax.mail.Transport JavaDoc;
36 import javax.mail.internet.InternetAddress JavaDoc;
37 import javax.mail.internet.MimeBodyPart JavaDoc;
38 import javax.mail.internet.MimeMessage JavaDoc;
39 import javax.mail.internet.MimeMultipart JavaDoc;
40
41 import org.htmlparser.Node;
42 import org.htmlparser.Parser;
43 import org.htmlparser.tags.ImageTag;
44 import org.htmlparser.util.ParserException;
45
46 /**
47  * 邮件发送组件,具体的使用方法参照该类的main方法
48  * @author Liudong
49  */

50 public abstract class MailSender extends Authenticator JavaDoc{
51
52     private String JavaDoc username = null; //邮件发送帐号用户名
53
private String JavaDoc userpasswd = null; //邮件发送帐号用户口令
54
protected BodyPart JavaDoc messageBodyPart = null;
55     protected Multipart JavaDoc multipart = new MimeMultipart JavaDoc("related");
56     protected MimeMessage JavaDoc mailMessage = null;
57     protected Session JavaDoc mailSession = null;
58     protected InternetAddress JavaDoc mailToAddress = null;
59
60     /**
61      * 构造函数
62      * @param smtpHost
63      * @param username
64      * @param password
65      */

66     protected MailSender(String JavaDoc smtpHost, String JavaDoc username, String JavaDoc password) {
67         this(smtpHost,25,username,password);
68     }
69     /**
70      * 构造函数
71      * @param smtpHost
72      * @param smtpPort
73      * @param username
74      * @param password
75      */

76     protected MailSender(String JavaDoc smtpHost, int smtpPort, String JavaDoc username, String JavaDoc password) {
77         this.username = username;
78         this.userpasswd = password;
79         Properties JavaDoc mailProperties = System.getProperties();
80         mailProperties.put("mail.smtp.host", smtpHost);
81         if(smtpPort>0 && smtpPort!=25)
82             mailProperties.put("mail.smtp.port", String.valueOf(smtpPort));
83         mailProperties.put("mail.smtp.auth", "true"); //设置smtp认证,很关键的一句
84
mailSession = Session.getDefaultInstance(mailProperties, this);
85         mailMessage = new MimeMessage JavaDoc(mailSession);
86         messageBodyPart = new MimeBodyPart JavaDoc();
87     }
88     /**
89      * 构造一个纯文本邮件发送实例
90      * @see getTextMailSender(String smtpHost, int smtpPort, String username, String password)
91      * @param smtpHost
92      * @param username
93      * @param password
94      * @return
95      */

96     public static MailSender getTextMailSender(String JavaDoc smtpHost, String JavaDoc username, String JavaDoc password) {
97         return getTextMailSender(smtpHost,25,username,password);
98     }
99     /**
100      * 构造一个纯文本邮件发送实例
101      * @param smtpHost SMTP服务器地址
102      * @param smtpPort SMTP服务器端口
103      * @param username SMTP邮件发送帐号
104      * @param password SMTP邮件发送帐号对应的密码
105      * @return
106      */

107     public static MailSender getTextMailSender(String JavaDoc smtpHost, int smtpPort, String JavaDoc username, String JavaDoc password) {
108         return new MailSender(smtpHost,smtpPort,username,password) {
109             public void setMailContent(String JavaDoc mailContent) throws MessagingException JavaDoc {
110                 messageBodyPart.setText(mailContent);
111                 multipart.addBodyPart(messageBodyPart);
112             }
113         };
114     }
115     /**
116      * 构造一个超文本邮件发送实例
117      * @see getHtmlMailSender(String smtpHost, int smtpPort, String username, String password)
118      * @param smtpHost
119      * @param username
120      * @param password
121      * @return
122      */

123     public static MailSender getHtmlMailSender(String JavaDoc smtpHost, String JavaDoc username, String JavaDoc password) {
124         return getHtmlMailSender(smtpHost,25,username,password);
125     }
126     /**
127      * 构造一个超文本邮件发送实例
128      * @param smtpHost SMTP服务器地址
129      * @param smtpPort SMTP服务器端口
130      * @param username SMTP邮件发送帐号
131      * @param password SMTP邮件发送帐号对应的密码
132      * @return
133      */

134     public static MailSender getHtmlMailSender(String JavaDoc smtpHost, int smtpPort, String JavaDoc username, String JavaDoc password) {
135         return new MailSender(smtpHost,smtpPort,username,password) {
136             private ArrayList JavaDoc arrayList1 = new ArrayList JavaDoc();
137             private ArrayList JavaDoc arrayList2 = new ArrayList JavaDoc();
138
139             public void setMailContent(String JavaDoc mailContent) throws MessagingException JavaDoc {
140                 String JavaDoc htmlContent = getContent(mailContent);
141                 messageBodyPart.setContent(htmlContent, CONTENT_TYPE);
142                 multipart.addBodyPart(messageBodyPart);
143                 //调用处理html文件中的图片方法
144
processHtmlImage(mailContent);
145             }
146
147             //处理html页面上的图片方法如下:
148
private void processHtmlImage(String JavaDoc mailContent) throws MessagingException JavaDoc {
149                 for (int i = 0; i < arrayList1.size(); i++) {
150                     messageBodyPart = new MimeBodyPart JavaDoc();
151                     DataSource JavaDoc source = new FileDataSource JavaDoc((String JavaDoc) arrayList1.get(i));
152                     messageBodyPart.setDataHandler(new DataHandler JavaDoc(source));
153                     String JavaDoc contentId = "<" + (String JavaDoc) arrayList2.get(i) + ">";
154                     messageBodyPart.setHeader("Content-ID", contentId);
155                     messageBodyPart.setFileName((String JavaDoc) arrayList1.get(i));
156                     multipart.addBodyPart(messageBodyPart);
157                 }
158             }
159
160             //处理要发送的html文件,主要是针对html文件中的图片
161
private String JavaDoc getContent(String JavaDoc mailContent) {
162                 try {
163                     Parser parser = Parser.createParser(new String JavaDoc(mailContent.getBytes(), ISO8859_1));
164                     Node[] images = parser.extractAllNodesThatAre(ImageTag.class);
165                     for(int i=0;i<images.length;i++) {
166                         ImageTag imgTag = (ImageTag) images[i];
167                         if(!imgTag.getImageURL().toLowerCase().startsWith("http://"))
168                             arrayList1.add(imgTag.getImageURL());
169                     }
170                 } catch (UnsupportedEncodingException JavaDoc e1) {
171                 } catch (ParserException e) {}
172                 String JavaDoc afterReplaceStr = mailContent;
173                 //在html文件中用"cid:"+Content-ID来替换原来的图片链接
174
for (int m = 0; m < arrayList1.size(); m++) {
175                     arrayList2.add(createRandomStr());
176                     String JavaDoc addString = "cid:" + (String JavaDoc) arrayList2.get(m);
177                     afterReplaceStr = mailContent.replaceAll(
178                             (String JavaDoc) arrayList1.get(m), addString);
179                 }
180                 return afterReplaceStr;
181             }
182
183             //产生一个随机字符串,为了给图片设定Content-ID值
184
private String JavaDoc createRandomStr() {
185                 char[] randomChar = new char[8];
186                 for (int i = 0; i < 8; i++) {
187                     randomChar[i] = (char) (Math.random() * 26 + 'a');
188                 }
189                 String JavaDoc replaceStr = new String JavaDoc(randomChar);
190                 return replaceStr;
191             }
192             private final static String JavaDoc CONTENT_TYPE = "text/html;charset=GB2312";
193             private final static String JavaDoc ISO8859_1 = "8859_1";
194         };
195     }
196     /**
197      * 用于实现邮件发送用户验证
198      * @see javax.mail.Authenticator#getPasswordAuthentication
199      */

200     protected PasswordAuthentication JavaDoc getPasswordAuthentication() {
201         return new PasswordAuthentication JavaDoc(username, userpasswd);
202     }
203     
204     /**
205      * 设置邮件标题
206      * @param mailSubject
207      * @throws MessagingException
208      */

209     public void setSubject(String JavaDoc mailSubject) throws MessagingException JavaDoc {
210         mailMessage.setSubject(mailSubject);
211     }
212
213     /**
214      * 所有子类都需要实现的抽象方法,为了支持不同的邮件类型
215      * @param mailContent
216      * @throws MessagingException
217      */

218     public abstract void setMailContent(String JavaDoc mailContent) throws MessagingException JavaDoc;
219
220     /**
221      * 设置邮件发送日期
222      * @param sendDate
223      * @throws MessagingException
224      */

225     public void setSendDate(Date JavaDoc sendDate) throws MessagingException JavaDoc {
226         mailMessage.setSentDate(sendDate);
227     }
228
229     /**
230      * 设置邮件发送附件
231      * @param attachmentName
232      * @throws MessagingException
233      */

234     public void setAttachments(String JavaDoc attachmentName) throws MessagingException JavaDoc {
235         messageBodyPart = new MimeBodyPart JavaDoc();
236         DataSource JavaDoc source = new FileDataSource JavaDoc(attachmentName);
237         messageBodyPart.setDataHandler(new DataHandler JavaDoc(source));
238         int index = attachmentName.lastIndexOf(File.separator);
239         String JavaDoc attachmentRealName = attachmentName.substring(index + 1);
240         messageBodyPart.setFileName(attachmentRealName);
241         multipart.addBodyPart(messageBodyPart);
242     }
243
244     /**
245      * 设置发件人地址
246      * @param mailFrom
247      * @throws MessagingException
248      * @throws UnsupportedEncodingException
249      */

250     public void setMailFrom(String JavaDoc mailFrom, String JavaDoc sender) throws UnsupportedEncodingException JavaDoc, MessagingException JavaDoc {
251         if(sender!=null)
252             mailMessage.setFrom(new InternetAddress JavaDoc(mailFrom, sender));
253         else
254             mailMessage.setFrom(new InternetAddress JavaDoc(mailFrom));
255     }
256
257     /**
258      * 设置收件人地址,收件人类型为to,cc,bcc(大小写不限)
259      * @param mailTo 邮件接收者地址
260      * @param mailType 值为to,cc,bcc
261      * @author Liudong
262      */

263     public void setMailTo(String JavaDoc[] mailTo, String JavaDoc mailType) throws Exception JavaDoc {
264         for (int i = 0; i < mailTo.length; i++) {
265             mailToAddress = new InternetAddress JavaDoc(mailTo[i]);
266             if (mailType.equalsIgnoreCase("to")) {
267                 mailMessage.addRecipient(Message.RecipientType.TO,mailToAddress);
268             } else if (mailType.equalsIgnoreCase("cc")) {
269                 mailMessage.addRecipient(Message.RecipientType.CC,mailToAddress);
270             } else if (mailType.equalsIgnoreCase("bcc")) {
271                 mailMessage.addRecipient(Message.RecipientType.BCC,mailToAddress);
272             } else {
273                 throw new Exception JavaDoc("Unknown mailType: " + mailType + "!");
274             }
275         }
276     }
277     /**
278      * 开始发送邮件
279      * @throws MessagingException
280      * @throws SendFailedException
281      */

282     public void sendMail() throws MessagingException JavaDoc, SendFailedException JavaDoc {
283         if (mailToAddress == null)
284             throw new MessagingException JavaDoc("请你必须你填写收件人地址!");
285         mailMessage.setContent(multipart);
286         Transport.send(mailMessage);
287     }
288     
289     /**
290      * 邮件发送测试
291      * @param args
292      */

293     public static void main(String JavaDoc args[]) {
294         String JavaDoc mailHost = "smtp.163.com"; //发送邮件服务器地址
295
String JavaDoc mailUser = "user1"; //发送邮件服务器的用户帐号
296
String JavaDoc mailPassword = "password1"; //发送邮件服务器的用户密码
297
String JavaDoc[] toAddress = {"user1@163.com"};
298         //使用超文本格式发送邮件
299
MailSender sendmail = MailSender.getHtmlMailSender(mailHost, mailUser,mailPassword);
300         //使用纯文本格式发送邮件
301
//MailSender sendmail = MailSender.getTextMailSender(mailHost, mailUser,mailPassword);
302
try {
303             sendmail.setSubject("邮件发送测试");
304             sendmail.setSendDate(new Date JavaDoc());
305             String JavaDoc content = "<H1>你好,中国</H1><img SRC=\"http://www.javayou.com/images/logo.gif\">";
306             //请注意如果是本地图片比如使用斜杠作为目录分隔符,如下所示
307
content+="<img SRC=\"D:/EclipseM7/workspace/JDlog/dlog/images/rss200.png\"/>";
308             sendmail.setMailContent(content); //
309
sendmail.setAttachments("E:\\TOOLS\\pm_sn.txt");
310             sendmail.setMailFrom("user1@163.com","发送者");
311             sendmail.setMailTo(toAddress, "to");
312             //sendmail.setMailTo(toAddress, "cc");//设置抄送给...
313
//开始发送邮件
314
System.out.println("正在发送邮件,请稍候.......");
315             sendmail.sendMail();
316             System.out.println("恭喜你,邮件已经成功发送!");
317         } catch (Exception JavaDoc ex) {
318             ex.printStackTrace();
319         }
320     }
321     
322
323 }
Popular Tags