001: /*
002: * This program is free software; you can redistribute it and/or modify
003: * it under the terms of the GNU General Public License as published by
004: * the Free Software Foundation; either version 2 of the License, or
005: * (at your option) any later version.
006: *
007: * This program is distributed in the hope that it will be useful,
008: * but WITHOUT ANY WARRANTY; without even the implied warranty of
009: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
010: * GNU Library General Public License for more details.
011: *
012: * You should have received a copy of the GNU General Public License
013: * along with this program; if not, write to the Free Software
014: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
015: */
016: package dlog4j.plugins;
017:
018: import java.io.*;
019: import java.util.*;
020:
021: import javax.mail.*;
022: import javax.naming.*;
023: import javax.mail.internet.*;
024: import javax.naming.directory.*;
025: import javax.servlet.ServletException;
026:
027: import org.apache.struts.action.*;
028: import org.apache.commons.logging.*;
029: import org.apache.struts.config.ModuleConfig;
030:
031: import dlog4j.util.mail.Mailer;
032:
033: /**
034: * 直接连接邮件接收者的服务器进行邮件发送
035: * 该插件在struts-config.xml中的配置如下
036: <plug-in className="dlog4j.util.mail.MailPlugin">
037: <!-- 发送者邮件地址 -->
038: <set-property property="sender" value="dlog4j@gmail.com"/>
039: </plug-in>
040: * @author Winter Lau
041: */
042: public class MailPlugin extends Mailer implements PlugIn {
043:
044: private static Log log = LogFactory.getLog(MailPlugin.class);
045:
046: private String sender = "dlog4j@gmail.com";
047: private DirContext context;
048:
049: /* (non-Javadoc)
050: * @see org.apache.struts.action.PlugIn#init(org.apache.struts.action.ActionServlet, org.apache.struts.config.ModuleConfig)
051: */
052: public void init(ActionServlet servlet, ModuleConfig config)
053: throws ServletException {
054: Hashtable env = new Hashtable();
055: env.put(Context.INITIAL_CONTEXT_FACTORY,
056: "com.sun.jndi.dns.DnsContextFactory");
057: env.put(Context.PROVIDER_URL, "dns://");
058: try {
059: context = new InitialDirContext(env);
060: } catch (NamingException e) {
061: log.fatal("Mail Messenger start failed.", e);
062: }
063: mailer = this ;
064: }
065:
066: /**
067: * 邮件发送
068: * @param sn 发送者名称
069: * @param mails
070: * @param title
071: * @param content
072: */
073: public void send(final String sn, final String[] mails,
074: final String title, final String content) {
075: new Thread() {
076: public void run() {
077: for (int i = 0; i < mails.length; i++) {
078: try {
079: String domain = parseDomain(mails[i]);
080: Attributes attr = context.getAttributes(domain,
081: new String[] { "MX" });
082: NamingEnumeration servers = attr.getAll();
083: // 列出所有邮件服务器:
084: while (servers.hasMore()) {
085: Attribute hosts = (Attribute) servers
086: .next();
087: for (int j = 0; j < hosts.size(); j++) {
088: String host = (String) hosts.get(j);
089: host = host
090: .substring(host.indexOf(' ') + 1);
091: sendMail(sn, mails[i], title, content,
092: host);
093: break;
094: }
095: break;
096: }
097: } catch (Exception e) {
098: log.error("Send mail to " + mails[i], e);
099: }
100: }
101: }
102:
103: /**
104: * 发送邮件
105: * @param sender
106: * @param mail
107: * @param title
108: * @param content
109: * @param host
110: * @throws MessagingException
111: * @throws UnsupportedEncodingException
112: */
113: private void sendMail(String sn, String mail, String title,
114: String content, String host)
115: throws UnsupportedEncodingException,
116: MessagingException {
117: Properties props = System.getProperties();
118: props.put("mail.smtp.host", host);
119: props.put("mail.smtp.port", "25");
120: props.put("mail.smtp.auth", "false");
121: Session mailSession = Session.getInstance(props, null);
122:
123: MimeMessage mailMessage = new MimeMessage(mailSession);
124:
125: MimeBodyPart bodyPart = new MimeBodyPart();
126: bodyPart
127: .setContent(content, "text/html;charset=GB2312");
128: Multipart multipart = new MimeMultipart("related");
129: multipart.addBodyPart(bodyPart);
130: mailMessage.setContent(multipart);
131:
132: mailMessage.setSentDate(new Date());
133: mailMessage.setFrom(new InternetAddress(sender, sn));
134: mailMessage.addRecipient(Message.RecipientType.TO,
135: new InternetAddress(mail));
136: mailMessage.setSubject(title);
137:
138: Transport.send(mailMessage);
139: }
140:
141: /**
142: * 从邮件地址中解析出域名
143: * @param email
144: * @return
145: */
146: private String parseDomain(String email) {
147: String domain = null;
148: if (email != null) {
149: int idx = email.indexOf('@');
150: if (idx != -1) {
151: idx++;
152: if (idx < email.length())
153: domain = email.substring(idx);
154: }
155: }
156: return domain;
157: }
158: }.start();
159: }
160:
161: /*
162: * (non-Javadoc)
163: * @see org.apache.struts.action.PlugIn#destroy()
164: */
165: public void destroy() {
166: try {
167: context.close();
168: } catch (Exception e) {
169: log.error("Mail Messenger close context failed.", e);
170: }
171: }
172:
173: public String getSender() {
174: return sender;
175: }
176:
177: public void setSender(String sender) {
178: this.sender = sender;
179: }
180: }
|