SendMessage.java
上传用户:huihesys
上传日期:2007-01-04
资源大小:3877k
文件大小:10k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /* CVS ID: $Id: SendMessage.java,v 1.3 2000/04/06 08:02:02 wastl Exp $ */
  2. import net.wastl.webmail.server.*;
  3. import net.wastl.webmail.server.http.*;
  4. import net.wastl.webmail.ui.html.*;
  5. import net.wastl.webmail.ui.xml.*;
  6. import net.wastl.webmail.misc.*;
  7. import net.wastl.webmail.config.ConfigurationListener;
  8. import java.io.*;
  9. import java.util.*;
  10. import java.text.*;
  11. import javax.mail.*;
  12. import javax.mail.internet.*;
  13. /*
  14.  * SendMessage.java
  15.  *
  16.  * Created: Tue Sep  7 13:59:30 1999
  17.  *
  18.  * Copyright (C) 1999-2000 Sebastian Schaffert
  19.  * 
  20.  * This program is free software; you can redistribute it and/or
  21.  * modify it under the terms of the GNU General Public License
  22.  * as published by the Free Software Foundation; either version 2
  23.  * of the License, or (at your option) any later version.
  24.  * 
  25.  * This program is distributed in the hope that it will be useful,
  26.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  27.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  28.  * GNU General Public License for more details.
  29.  * 
  30.  * You should have received a copy of the GNU General Public License
  31.  * along with this program; if not, write to the Free Software
  32.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  33.  */
  34. /**
  35.  * Send a message and show a result page.
  36.  * 
  37.  * provides: message send
  38.  * requires: composer
  39.  *
  40.  * @author Sebastian Schaffert
  41.  * @version
  42.  */
  43. public class SendMessage implements Plugin, URLHandler, ConfigurationListener {
  44.     
  45.     public static final String VERSION="1.5";
  46.     public static final String URL="/send";
  47.     
  48.     Storage store;
  49.     WebMailServer parent;
  50.     Session mailsession;
  51.     public SendMessage() {
  52.     }
  53.     public void register(WebMailServer parent) {
  54. parent.getURLHandler().registerHandler(URL,this);
  55. parent.getConfigScheme().configRegisterStringKey(this,"SMTP HOST","localhost","Host used to send messages via SMTP. Should be localhost or your SMTP smarthost");
  56. this.store=parent.getStorage();
  57. this.parent=parent;
  58.     }
  59.     protected void init() {
  60. Properties props=new Properties();
  61. props.put("mail.host",store.getConfig("SMTP HOST"));
  62. props.put("mail.smtp.host",store.getConfig("SMTP HOST"));
  63. mailsession=Session.getDefaultInstance(props,null);
  64.     } 
  65.     public String getName() {
  66. return "SendMessage";
  67.     }
  68.     public String getDescription() {
  69. return "This URL-Handler sends a submitted message.";
  70.     }
  71.     public String getVersion() {
  72. return VERSION;
  73.     }
  74.     public String getURL() {
  75. return URL;
  76.     }
  77.     
  78.     public void notifyConfigurationChange(String key) {
  79. init();
  80.     }
  81.     public HTMLDocument handleURL(String suburl, HTTPSession sess1, HTTPRequestHeader head) throws WebMailException {
  82. if(sess1 == null) {
  83.     throw new WebMailException("No session was given. If you feel this is incorrect, please contact your system administrator");
  84. }
  85. WebMailSession session=(WebMailSession)sess1;
  86. UserData user=session.getUser();
  87. HTMLDocument content;
  88. /* Save message in case there is an error */
  89. session.storeMessage(head);
  90. if(head.isContentSet("SEND")) {
  91.     /* The form was submitted, now we will send it ... */
  92.     try {
  93. MimeMessage msg=new MimeMessage(mailsession);
  94. Address from[]=new Address[1];
  95. try {
  96.     from[0]=new InternetAddress(MimeUtility.encodeText(session.getUser().getEmail()),
  97. MimeUtility.encodeText(session.getUser().getFullName()));
  98. } catch(UnsupportedEncodingException e) {
  99.     store.log(Storage.LOG_WARN,"Unsupported Encoding while trying to send message: "+e.getMessage());
  100.     from[0]=new InternetAddress(session.getUser().getEmail(),session.getUser().getFullName());
  101. }
  102. StringTokenizer t;
  103. try {
  104.     t=new StringTokenizer(MimeUtility.encodeText(head.getContent("TO")).trim(),",");
  105. } catch(UnsupportedEncodingException e) {
  106.     store.log(Storage.LOG_WARN,"Unsupported Encoding while trying to send message: "+e.getMessage());
  107.     t=new StringTokenizer(head.getContent("TO").trim(),",;");
  108. }
  109. /* Check To: field, when empty, throw an exception */
  110. if(t.countTokens()<1) {
  111.     throw new MessagingException("The recipient field must not be empty!");
  112. }
  113. Address to[]=new Address[t.countTokens()];
  114. int i=0;
  115. while(t.hasMoreTokens()) {
  116.     to[i]=new InternetAddress(t.nextToken().trim());
  117.     i++;
  118. }
  119. try {
  120.     t=new StringTokenizer(MimeUtility.encodeText(head.getContent("CC")).trim(),",");
  121. } catch(UnsupportedEncodingException e) {
  122.     store.log(Storage.LOG_WARN,"Unsupported Encoding while trying to send message: "+e.getMessage());
  123.     t=new StringTokenizer(head.getContent("CC").trim(),",;");
  124. }
  125. Address cc[]=new Address[t.countTokens()];
  126. i=0;
  127. while(t.hasMoreTokens()) {
  128.     cc[i]=new InternetAddress(t.nextToken().trim());
  129.     i++;
  130. }
  131. try {
  132.     t=new StringTokenizer(MimeUtility.encodeText(head.getContent("BCC")).trim(),",");
  133. } catch(UnsupportedEncodingException e) {
  134.     store.log(Storage.LOG_WARN,"Unsupported Encoding while trying to send message: "+e.getMessage());
  135.     t=new StringTokenizer(head.getContent("BCC").trim(),",;");
  136. }
  137. Address bcc[]=new Address[t.countTokens()];
  138. i=0;
  139. while(t.hasMoreTokens()) {
  140.     bcc[i]=new InternetAddress(t.nextToken().trim());
  141.     i++;
  142. }
  143. session.setSent(false);
  144. msg.addFrom(from);
  145. if(to.length > 0) {
  146.     msg.addRecipients(Message.RecipientType.TO,to);
  147. }
  148. if(cc.length > 0) {
  149.     msg.addRecipients(Message.RecipientType.CC,cc);
  150. }
  151. if(bcc.length > 0) {
  152.     msg.addRecipients(Message.RecipientType.BCC,bcc);
  153. }
  154. msg.addHeader("X-Mailer",WebMailServer.getVersion()+", "+getName()+" plugin v"+getVersion());
  155. String subject;
  156. if(head.getContent("SUBJECT") == null || head.getContent("SUBJECT").equals("")) {
  157.     subject="no subject";
  158. } else {
  159.     try {
  160. subject=MimeUtility.encodeText(head.getContent("SUBJECT"));
  161.     } catch(UnsupportedEncodingException e) {
  162. store.log(Storage.LOG_WARN,"Unsupported Encoding while trying to send message: "+e.getMessage());
  163. subject=head.getContent("SUBJECT");
  164.     }     
  165. }
  166. msg.addHeader("Subject",subject);
  167. msg.addHeader("Reply-To",head.getContent("REPLY-TO"));
  168. msg.setSentDate(new Date(System.currentTimeMillis()));
  169. String contnt=head.getContent("BODY");
  170. String charset=MimeUtility.mimeCharset(MimeUtility.getDefaultJavaCharset());
  171. MimeMultipart cont=new MimeMultipart();
  172. MimeBodyPart txt=new MimeBodyPart();
  173. try {
  174.     txt.setText(MimeUtility.encodeText(contnt,charset,"base64"));
  175. } catch(UnsupportedEncodingException e) {
  176.     store.log(Storage.LOG_WARN,"Unsupported Encoding while trying to send message: "+e.getMessage());
  177.     txt.setText(contnt);
  178. }
  179. cont.addBodyPart(txt);
  180. Enumeration atts=session.getAttachments().keys();
  181. while(atts.hasMoreElements()) {
  182.     ByteStore bs=session.getAttachment((String)atts.nextElement());
  183.     InternetHeaders ih=new InternetHeaders();
  184.     ih.addHeader("Content-Type",bs.getContentType());
  185.     ih.addHeader("Content-Transfer-Encoding","BASE64");
  186.     InputStream decoded=(ByteArrayInputStream)MimeUtility.decode(new ByteArrayInputStream(bs.getBytes()),bs.getContentEncoding());
  187.     ByteStore bs2=ByteStore.getBinaryFromIS(decoded,decoded.available()+1000);
  188.     
  189.     PipedInputStream pin=new PipedInputStream();
  190.     PipedOutputStream pout=new PipedOutputStream(pin);
  191.     
  192.     /* This is used to write to the Pipe asynchronously to avoid blocking */
  193.     StreamConnector sconn=new StreamConnector(pin,(int)(bs2.getSize()*1.6)+1000);
  194.     BufferedOutputStream encoder=new BufferedOutputStream(MimeUtility.encode(pout,"BASE64"));
  195.     encoder.write(bs.getBytes());
  196.     encoder.flush();
  197.     encoder.close();
  198.     //MimeBodyPart att1=sconn.getResult();
  199.     MimeBodyPart att1=new MimeBodyPart(ih,sconn.getResult().getBytes());
  200.     
  201.     
  202.     att1.addHeader("Content-Type",bs.getContentType());
  203.     att1.setDescription(bs.getDescription());
  204.     att1.setFileName(bs.getName());
  205.     cont.addBodyPart(att1);
  206. }
  207. msg.setContent(cont);
  208. //  }
  209. msg.saveChanges();
  210. boolean savesuccess=true;
  211. msg.setHeader("Message-ID",session.getUserModel().getWorkMessage().getAttribute("msgid"));
  212. if(session.getUser().wantsSaveSent()) {
  213.     String folderhash=session.getUser().getSentFolder();     
  214.     try {
  215. Folder folder=session.getFolder(folderhash);
  216. Message[] m=new Message[1];
  217. m[0]=msg;
  218. folder.appendMessages(m);
  219.     } catch(MessagingException e) {
  220. savesuccess=false;
  221.     } catch(NullPointerException e) {
  222. // Invalid folder:
  223. savesuccess=false;
  224.     }
  225. }
  226. boolean sendsuccess=false;
  227. try {
  228.     Transport.send(msg);
  229.     Address sent[]=new Address[to.length+cc.length+bcc.length];
  230.     int c1=0;int c2=0;
  231.     for(c1=0;c1<to.length;c1++) {
  232. sent[c1]=to[c1];
  233.     }
  234.     for(c2=0;c2<cc.length;c2++) {
  235. sent[c1+c2]=cc[c2];
  236.     }
  237.     for(int c3=0;c3<bcc.length;c3++) {
  238. sent[c1+c2+c3]=bcc[c3];
  239.     }
  240.     sendsuccess=true;
  241.     throw new SendFailedException("success",new Exception("success"),sent,null,null);
  242. } catch(SendFailedException e) {
  243.    session.handleTransportException(e);
  244. }
  245. //session.clearMessage();
  246. //content=new HTMLParsedDocument(store,session,"send result");
  247. content=new XHTMLDocument(session.getModel(),
  248.   store.getStylesheet("sendresult.xsl",
  249.       user.getPreferredLocale(),user.getTheme()));
  250. if(sendsuccess) session.clearWork();
  251.     } catch(Exception e) {
  252. e.printStackTrace();
  253. throw new DocumentNotFoundException("Could not send message. (Reason: "+e.getMessage()+")");
  254.     }
  255.     
  256. } else if(head.isContentSet("ATTACH")) {
  257.     /* Redirect request for attachment (unfortunately HTML forms are not flexible enough to 
  258.        have two targets without Javascript) */
  259.     content=parent.getURLHandler().handleURL("/compose/attach",session,head);
  260. } else {
  261.     throw new DocumentNotFoundException("Could not send message. (Reason: No content given)");
  262. }
  263. return content;
  264.     }
  265.     public String provides() {
  266. return "message send";
  267.     }
  268.     public String requires() {
  269. return "composer";
  270.     }
  271. } // SendMessage