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

WEB邮件程序

开发平台:

C/C++

  1. /*
  2.  * POP3Message.java
  3.  * Copyright (C) 1999 dog <dog@dog.net.uk>
  4.  * 
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Lesser General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2 of the License, or (at your option) any later version.
  9.  * 
  10.  * This library is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Lesser General Public License for more details.
  14.  * 
  15.  * You should have received a copy of the GNU Lesser General Public
  16.  * License along with this library; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  * 
  19.  * You may retrieve the latest version of this library from
  20.  * http://www.dog.net.uk/knife/
  21.  */
  22. package dog.mail.pop3;
  23. import java.io.*;
  24. import java.util.*;
  25. import javax.activation.DataHandler;
  26. import javax.mail.*;
  27. import javax.mail.internet.*;
  28. /**
  29.  * The message class implementing the POP3 mail protocol.
  30.  *
  31.  * @author dog@dog.net.uk
  32.  * @version 1.1
  33.  */
  34. public class POP3Message extends MimeMessage {
  35. /**
  36.  * Creates a POP3 message.
  37.  * This is called by the POP3Store.
  38.  */
  39. protected POP3Message(POP3Folder folder, InputStream in, int msgnum) throws MessagingException {
  40. super(folder, msgnum);
  41. if (!(in instanceof ByteArrayInputStream) && !(in instanceof BufferedInputStream))
  42. in = new BufferedInputStream(in);
  43. headers = new InternetHeaders(in);
  44. try {
  45. int fetchsize = POP3Store.fetchsize;
  46. byte bytes[];
  47. if (in instanceof ByteArrayInputStream) {
  48. fetchsize = in.available();
  49. bytes = new byte[fetchsize];
  50. int len = in.read(bytes, 0, fetchsize);
  51. } else {
  52. ByteArrayOutputStream out = new ByteArrayOutputStream();
  53. bytes = new byte[fetchsize];
  54. int len;
  55. while ((len = in.read(bytes, 0, fetchsize))!=-1)
  56. out.write(bytes, 0, len);
  57. bytes = out.toByteArray();
  58. }
  59. content = bytes;
  60. } catch(IOException e) {
  61. throw new MessagingException("I/O error", e);
  62. }
  63. }
  64. /**
  65.  * Returns the from address.
  66.  */
  67. public Address[] getFrom() throws MessagingException {
  68. Address[] a = getAddressHeader("From");
  69. if (a==null) a = getAddressHeader("Sender");
  70. return a;
  71. }
  72. /**
  73.  * Returns the recipients' addresses.
  74.  */
  75. public Address[] getRecipients(RecipientType type) throws MessagingException {
  76. if (type==RecipientType.NEWSGROUPS) {
  77. String key = getHeader("Newsgroups", ",");
  78. if (key==null) return null;
  79. return NewsAddress.parse(key);
  80. } else {
  81. return getAddressHeader(getHeaderKey(type));
  82. }
  83. }
  84. /**
  85.  * Returns the reply-to address.
  86.  */
  87. public Address[] getReplyTo() throws MessagingException {
  88. Address[] a = getAddressHeader("Reply-To");
  89. if (a==null) a = getFrom();
  90. return a;
  91. }
  92. /**
  93.  * Returns an array of addresses for the specified header key.
  94.  */
  95. protected Address[] getAddressHeader(String key) throws MessagingException {
  96. String header = getHeader(key, ",");
  97. if (header==null) return null;
  98. try {
  99. return InternetAddress.parse(header);
  100. } catch (AddressException e) {
  101.             String message = e.getMessage();
  102. if (message!=null && message.indexOf("@domain")>-1)
  103. try {
  104. return parseAddress(header, ((POP3Store)folder.getStore()).getHostName());
  105. } catch (AddressException e2) {
  106. throw new MessagingException("Invalid address: "+header, e);
  107. }
  108. throw e;
  109. }
  110. }
  111. /**
  112.  * Makes a pass at parsing internet addresses.
  113.  */
  114. protected Address[] parseAddress(String in, String defhost) throws AddressException {
  115.         Vector v = new Vector();
  116. for (StringTokenizer st = new StringTokenizer(in, ","); st.hasMoreTokens(); ) {
  117.             String s = st.nextToken().trim();
  118. try {
  119. v.addElement(new InternetAddress(s));
  120. } catch (AddressException e) {
  121. int index = s.indexOf('>');
  122. if (index>-1) { // name <address>
  123. StringBuffer buffer = new StringBuffer();
  124. buffer.append(s.substring(0, index));
  125. buffer.append('@');
  126. buffer.append(defhost);
  127. buffer.append(s.substring(index));
  128. v.addElement(new InternetAddress(buffer.toString()));
  129. } else {
  130. index = s.indexOf(" (");
  131. if (index>-1) { // address (name)
  132. StringBuffer buffer = new StringBuffer();
  133. buffer.append(s.substring(0, index));
  134. buffer.append('@');
  135. buffer.append(defhost);
  136. buffer.append(s.substring(index));
  137. v.addElement(new InternetAddress(buffer.toString()));
  138. } else // address
  139. v.addElement(new InternetAddress(s+"@"+defhost));
  140. }
  141. }
  142. }
  143.         Address[] a = new Address[v.size()]; v.copyInto(a);
  144. return a;
  145. }
  146. /**
  147.  * Returns the header key for the specified RecipientType.
  148.  */
  149. protected String getHeaderKey(RecipientType type) throws MessagingException {
  150. if (type==RecipientType.TO)
  151. return "To";
  152. if (type==RecipientType.CC)
  153. return "Cc";
  154. if (type==RecipientType.BCC)
  155. return "Bcc";
  156. if (type==RecipientType.NEWSGROUPS)
  157. return "Newsgroups";
  158. throw new MessagingException("Invalid recipient type: "+type);
  159. }
  160. // -- Need to override these since we are read-only --
  161. /**
  162.  * POP3 messages are read-only.
  163.  */
  164. public void setFrom(Address address) throws MessagingException {
  165. throw new IllegalWriteException("POP3Message is read-only");
  166. }
  167. /**
  168.  * POP3 messages are read-only.
  169.  */
  170. public void addFrom(Address aaddress[]) throws MessagingException {
  171. throw new IllegalWriteException("POP3Message is read-only");
  172. }
  173. /**
  174.  * POP3 messages are read-only.
  175.  */
  176. public void setRecipients(javax.mail.Message.RecipientType recipienttype, Address aaddress[]) throws MessagingException {
  177. throw new IllegalWriteException("POP3Message is read-only");
  178. }
  179. /**
  180.  * POP3 messages are read-only.
  181.  */
  182. public void addRecipients(javax.mail.Message.RecipientType recipienttype, Address aaddress[]) throws MessagingException {
  183. throw new IllegalWriteException("POP3Message is read-only");
  184. }
  185. /**
  186.  * POP3 messages are read-only.
  187.  */
  188. public void setReplyTo(Address aaddress[]) throws MessagingException {
  189. throw new IllegalWriteException("POP3Message is read-only");
  190. }
  191. /**
  192.  * POP3 messages are read-only.
  193.  */
  194. public void setSubject(String s, String s1) throws MessagingException {
  195. throw new IllegalWriteException("POP3Message is read-only");
  196. }
  197. /**
  198.  * POP3 messages are read-only.
  199.  */
  200. public void setSentDate(Date date) throws MessagingException {
  201. throw new IllegalWriteException("POP3Message is read-only");
  202. }
  203. /**
  204.  * POP3 messages are read-only.
  205.  */
  206. public void setDisposition(String s) throws MessagingException {
  207. throw new IllegalWriteException("POP3Message is read-only");
  208. }
  209. /**
  210.  * POP3 messages are read-only.
  211.  */
  212. public void setContentID(String s) throws MessagingException {
  213. throw new IllegalWriteException("POP3Message is read-only");
  214. }
  215. /**
  216.  * POP3 messages are read-only.
  217.  */
  218. public void setContentMD5(String s) throws MessagingException {
  219. throw new IllegalWriteException("POP3Message is read-only");
  220. }
  221. /**
  222.  * POP3 messages are read-only.
  223.  */
  224. public void setDescription(String s, String s1) throws MessagingException {
  225. throw new IllegalWriteException("POP3Message is read-only");
  226. }
  227. /**
  228.  * POP3 messages are read-only.
  229.  */
  230. public void setDataHandler(DataHandler datahandler) throws MessagingException {
  231. throw new IllegalWriteException("POP3Message is read-only");
  232. }
  233. }