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

WEB邮件程序

开发平台:

C/C++

  1. /*
  2.  * Article.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.nntp;
  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 NNTP mail protocol.
  30.  *
  31.  * @author dog@dog.net.uk
  32.  * @version 1.2
  33.  */
  34. public class Article extends MimeMessage {
  35. /**
  36.  * The unique message-id of this message.
  37.  */
  38. protected String messageId;
  39.     // Whether the headers for this article were retrieved using xover.
  40. boolean xoverHeaders = false;
  41. /**
  42.  * Creates an NNTP message with the specified article number.
  43.  */
  44. protected Article(Newsgroup folder, int msgnum) throws MessagingException {
  45. super(folder, msgnum);
  46. checkNewsrc(folder.newsrcline);
  47. }
  48. /**
  49.  * Creates an NNTP message with the specified message-id.
  50.  */
  51. protected Article(Newsgroup folder, String messageId) throws MessagingException {
  52. super(folder, 0);
  53. this.messageId = messageId;
  54. checkNewsrc(folder.newsrcline);
  55. }
  56.     // Adds headers retrieved by an xover call to this article.
  57. void addXoverHeaders(InternetHeaders headers) {
  58. this.headers = headers;
  59. xoverHeaders = true;
  60. headers.addHeader("Newsgroups", folder.getName());
  61. }
  62. void checkNewsrc(String newsrcline) throws MessagingException {
  63. if (newsrcline!=null) {
  64. int articlenum = getArticleNumber();
  65. StringTokenizer st = new StringTokenizer(newsrcline, ",");
  66. while (st.hasMoreTokens()) {
  67. String token = st.nextToken();
  68. int hyphenIndex = token.indexOf('-');
  69. if (hyphenIndex>-1) { // range
  70. try {
  71. int lo = Integer.parseInt(token.substring(0, hyphenIndex));
  72. int hi = Integer.parseInt(token.substring(hyphenIndex+1));
  73. if (articlenum>=lo && articlenum<=hi) {
  74. setFlag(Flags.Flag.SEEN, true);
  75. return;
  76. }
  77. } catch (NumberFormatException e) {
  78. }
  79. } else { // single number
  80. try {
  81. int num = Integer.parseInt(token);
  82. if (articlenum==num) {
  83. setFlag(Flags.Flag.SEEN, true);
  84. return;
  85. }
  86. } catch (NumberFormatException e) {
  87. }
  88. }
  89. }
  90. }
  91. }
  92. int getArticleNumber() {
  93. return getMessageNumber();
  94. }
  95. /**
  96.  * Returns the message content.
  97.  */
  98. public Object getContent() throws IOException, MessagingException {
  99. if (content==null) content = ((NNTPStore)folder.getStore()).getContent(this);
  100. /*
  101. // check for embedded uuencoded content
  102. BufferedReader reader = new BufferedReader(new InputStreamReader(ByteArrayInputStream(content)));
  103. Hashtable parts = null;
  104. try {
  105. StringBuffer buffer = new StringBuffer();
  106. int count = 1;
  107. for (String line = reader.readLine(); line!=null; line = reader.readLine()) {
  108. if (line.startsWith("begin")) {
  109. StringTokenizer st = new StringTokenizer(line, " ");
  110. if (st.countTokens()==3) {
  111. String ignore = st.nextToken();
  112. int lines = Integer.parseInt(st.nextToken());
  113. String name = st.nextToken();
  114. String contentType = guessContentType(name, count++);
  115. if (contentType!=null) {
  116. parts = new Hashtable();
  117. if (buffer.length>0) {
  118. parts.put("text/plain; partid="+(count++), buffer.toString());
  119. buffer = new StringBuffer();
  120. }
  121. ByteArrayOutputStream bout = new ByteArrayOutputStream();
  122. }
  123. }
  124. } else
  125. buffer.append(line);
  126. }
  127. } catch (NumberFormatException e) {
  128. } finally {
  129. reader.close();
  130. }
  131.  */
  132. return super.getContent();
  133. }
  134. String guessContentType(String name, int count) {
  135. String lname = name.toLowerCase();
  136. if (lname.indexOf(".jpg")>-1 || lname.indexOf(".jpeg")>-1)
  137. return "image/jpeg; name=""+name+"", partid="+count;
  138. if (lname.indexOf(".gif")>-1)
  139. return "image/gif; name=""+name+"", partid="+count;
  140. if (lname.indexOf(".au")>-1)
  141. return "audio/basic; name=""+name+"", partid="+count;
  142. return null;
  143. }
  144. /**
  145.  * Returns the from address.
  146.  */
  147. public Address[] getFrom() throws MessagingException {
  148.         NNTPStore s = (NNTPStore)folder.getStore();
  149. if (xoverHeaders && !s.validateOverviewHeader("From")) headers = null;
  150. if (headers==null) headers = s.getHeaders(this);
  151. Address[] a = getAddressHeader("From");
  152. if (a==null) a = getAddressHeader("Sender");
  153. return a;
  154. }
  155. /**
  156.  * Returns the recipients' addresses for the specified RecipientType.
  157.  */
  158. public Address[] getRecipients(RecipientType type) throws MessagingException {
  159. NNTPStore s = (NNTPStore)folder.getStore();
  160. if (xoverHeaders && !s.validateOverviewHeader(getHeaderKey(type))) headers = null;
  161. if (headers==null) headers = s.getHeaders(this);
  162. if (type==RecipientType.NEWSGROUPS) {
  163. String key = getHeader("Newsgroups", ",");
  164. if (key==null) return null;
  165. return NewsAddress.parse(key);
  166. } else {
  167. return getAddressHeader(getHeaderKey(type));
  168. }
  169. }
  170. /**
  171.  * Returns all the recipients' addresses.
  172.  */
  173. public Address[] getAllRecipients() throws MessagingException {
  174. if (headers==null || xoverHeaders) headers = ((NNTPStore)folder.getStore()).getHeaders(this);
  175. return super.getAllRecipients();
  176. }
  177. /**
  178.  * Returns the reply-to address.
  179.  */
  180. public Address[] getReplyTo() throws MessagingException {
  181.         NNTPStore s = (NNTPStore)folder.getStore();
  182. if (xoverHeaders && !s.validateOverviewHeader("Reply-To")) headers = null;
  183. if (headers==null) headers = s.getHeaders(this);
  184. Address[] a = getAddressHeader("Reply-To");
  185. if (a==null) a = getFrom();
  186. return a;
  187. }
  188. /**
  189.  * Returns the subject line.
  190.  */
  191. public String getSubject() throws MessagingException {
  192.         NNTPStore s = (NNTPStore)folder.getStore();
  193. if (xoverHeaders && !s.validateOverviewHeader("Subject")) headers = null;
  194. if (headers==null) headers = s.getHeaders(this);
  195. return super.getSubject();
  196. }
  197. /**
  198.  * Returns the sent date.
  199.  */
  200. public Date getSentDate() throws MessagingException {
  201.         NNTPStore s = (NNTPStore)folder.getStore();
  202. if (xoverHeaders && !s.validateOverviewHeader("Date")) headers = null;
  203. if (headers==null) headers = s.getHeaders(this);
  204. return super.getSentDate();
  205. }
  206. /**
  207.  * Returns the received date.
  208.  */
  209. public Date getReceivedDate() throws MessagingException {
  210. if (headers==null || xoverHeaders) headers = ((NNTPStore)folder.getStore()).getHeaders(this);
  211. return super.getReceivedDate();
  212. }
  213. /**
  214.  * Returns an array of addresses for the specified header key.
  215.  */
  216. protected Address[] getAddressHeader(String key) throws MessagingException {
  217. String header = getHeader(key, ",");
  218. if (header==null) return null;
  219. try {
  220. return InternetAddress.parse(header);
  221. } catch (AddressException e) {
  222.             String message = e.getMessage();
  223. if (message!=null && message.indexOf("@domain")>-1)
  224. try {
  225. return parseAddress(header, ((NNTPStore)folder.getStore()).getHostName());
  226. } catch (AddressException e2) {
  227. throw new MessagingException("Invalid address: "+header, e);
  228. }
  229. //throw e;
  230. return null;
  231. }
  232. }
  233. /**
  234.  * Makes a pass at parsing internet addresses.
  235.  */
  236. protected Address[] parseAddress(String in, String defhost) throws AddressException {
  237.         Vector v = new Vector();
  238. for (StringTokenizer st = new StringTokenizer(in, ","); st.hasMoreTokens(); ) {
  239.             String s = st.nextToken().trim();
  240. try {
  241. v.addElement(new InternetAddress(s));
  242. } catch (AddressException e) {
  243. int index = s.indexOf('>');
  244. if (index>-1) { // name <address>
  245. StringBuffer buffer = new StringBuffer();
  246. buffer.append(s.substring(0, index));
  247. buffer.append('@');
  248. buffer.append(defhost);
  249. buffer.append(s.substring(index));
  250. v.addElement(new InternetAddress(buffer.toString()));
  251. } else {
  252. index = s.indexOf(" (");
  253. if (index>-1) { // address (name)
  254. StringBuffer buffer = new StringBuffer();
  255. buffer.append(s.substring(0, index));
  256. buffer.append('@');
  257. buffer.append(defhost);
  258. buffer.append(s.substring(index));
  259. v.addElement(new InternetAddress(buffer.toString()));
  260. } else // address
  261. v.addElement(new InternetAddress(s+"@"+defhost));
  262. }
  263. }
  264. }
  265.         Address[] a = new Address[v.size()]; v.copyInto(a);
  266. return a;
  267. }
  268. /**
  269.  * Returns the header key for the specified RecipientType.
  270.  */
  271. protected String getHeaderKey(RecipientType type) throws MessagingException {
  272. if (type==RecipientType.TO)
  273. return "To";
  274. if (type==RecipientType.CC)
  275. return "Cc";
  276. if (type==RecipientType.BCC)
  277. return "Bcc";
  278. if (type==RecipientType.NEWSGROUPS)
  279. return "Newsgroups";
  280. throw new MessagingException("Invalid recipient type: "+type);
  281. }
  282. // -- Need to override these since we are read-only --
  283. /**
  284.  * NNTP messages are read-only.
  285.  */
  286. public void setFrom(Address address) throws MessagingException {
  287. throw new IllegalWriteException("Article is read-only");
  288. }
  289. /**
  290.  * NNTP messages are read-only.
  291.  */
  292. public void addFrom(Address a[]) throws MessagingException {
  293. throw new IllegalWriteException("Article is read-only");
  294. }
  295. /**
  296.  * NNTP messages are read-only.
  297.  */
  298. public void setRecipients(javax.mail.Message.RecipientType recipienttype, Address a[]) throws MessagingException {
  299. throw new IllegalWriteException("Article is read-only");
  300. }
  301. /**
  302.  * NNTP messages are read-only.
  303.  */
  304. public void addRecipients(javax.mail.Message.RecipientType recipienttype, Address a[]) throws MessagingException {
  305. throw new IllegalWriteException("Article is read-only");
  306. }
  307. /**
  308.  * NNTP messages are read-only.
  309.  */
  310. public void setReplyTo(Address a[]) throws MessagingException {
  311. throw new IllegalWriteException("Article is read-only");
  312. }
  313. /**
  314.  * NNTP messages are read-only.
  315.  */
  316. public void setSubject(String s, String s1) throws MessagingException {
  317. throw new IllegalWriteException("Article is read-only");
  318. }
  319. /**
  320.  * NNTP messages are read-only.
  321.  */
  322. public void setSentDate(Date date) throws MessagingException {
  323. throw new IllegalWriteException("Article is read-only");
  324. }
  325. /**
  326.  * NNTP messages are read-only.
  327.  */
  328. public void setDisposition(String s) throws MessagingException {
  329. throw new IllegalWriteException("Article is read-only");
  330. }
  331. /**
  332.  * NNTP messages are read-only.
  333.  */
  334. public void setContentID(String s) throws MessagingException {
  335. throw new IllegalWriteException("Article is read-only");
  336. }
  337. /**
  338.  * NNTP messages are read-only.
  339.  */
  340. public void setContentMD5(String s) throws MessagingException {
  341. throw new IllegalWriteException("Article is read-only");
  342. }
  343. /**
  344.  * NNTP messages are read-only.
  345.  */
  346. public void setDescription(String s, String s1) throws MessagingException {
  347. throw new IllegalWriteException("Article is read-only");
  348. }
  349. /**
  350.  * NNTP messages are read-only.
  351.  */
  352. public void setDataHandler(DataHandler datahandler) throws MessagingException {
  353. throw new IllegalWriteException("Article is read-only");
  354. }
  355. }