OSDN Git Service

CVS最新版の全ファイルを追加
[spring-ext/ozacc-mail.git] / src / java / com / ozacc / mail / fetch / ReceivedMail.java
1 package com.ozacc.mail.fetch;\r
2 \r
3 import java.io.File;\r
4 import java.util.ArrayList;\r
5 import java.util.Date;\r
6 import java.util.Iterator;\r
7 import java.util.List;\r
8 \r
9 import javax.mail.Flags;\r
10 import javax.mail.MessagingException;\r
11 import javax.mail.internet.MimeMessage;\r
12 \r
13 import com.ozacc.mail.Mail;\r
14 \r
15 /**\r
16  * 受信メール。\r
17  * <p>\r
18  * <code>FetchMail</code>、<code>FetchMailPro</code>の実装クラスで受信したメールが、\r
19  * インターネットメールとしての仕様を満たしていないヘッダ(FromやToなど)の値がセットされていた場合、\r
20  * そのヘッダに該当する<code>ReceivedMail</code>インスタンスのプロパティには何もセットされません。\r
21  * \r
22  * @since 1.2\r
23  * @author Tomohiro Otsuka\r
24  * @version $Id: ReceivedMail.java,v 1.1.2.9 2005/01/23 07:13:13 otsuka Exp $\r
25  */\r
26 public class ReceivedMail extends Mail {\r
27 \r
28         private String replySubjectPrefix = "Re: ";\r
29 \r
30         private Date date;\r
31 \r
32         private String messageId;\r
33 \r
34         private int size;\r
35 \r
36         private List receivedHeaders;\r
37 \r
38         private MimeMessage message;\r
39 \r
40         /**\r
41          * コンストラクタ。\r
42          */\r
43         public ReceivedMail() {\r
44                 super();\r
45         }\r
46 \r
47         /**\r
48          * コンストラクタ。\r
49          * \r
50          * @param charset \r
51          */\r
52         public ReceivedMail(String charset) {\r
53                 super(charset);\r
54         }\r
55 \r
56         /**\r
57          * コピーコンストラクタ。\r
58          * \r
59          * @param original \r
60          */\r
61         public ReceivedMail(Mail original) {\r
62                 super(original);\r
63         }\r
64 \r
65         /**\r
66          * 送信日時を返します。\r
67          * <p>\r
68          * 注: メールの受信日時ではありません。\r
69          * \r
70          * @return 送信日時\r
71          */\r
72         public Date getDate() {\r
73                 return date;\r
74         }\r
75 \r
76         /**\r
77          * 送信日時をセットします。\r
78          * \r
79          * @param date 送信日時\r
80          */\r
81         public void setDate(Date date) {\r
82                 this.date = date;\r
83         }\r
84 \r
85         /**\r
86          * 前後に&lt;&gt;が付いたメッセージIDを返します。\r
87          * 受信メールにメッセージIDが存在しない場合はnullを返します。\r
88          * \r
89          * @return 前後に&lt;&gt;が付いたメッセージID、またはnull\r
90          */\r
91         public String getMessageId() {\r
92                 if (messageId == null || messageId.length() == 0) {\r
93                         return null;\r
94                 }\r
95                 if (messageId.startsWith("<") && messageId.endsWith(">")) {\r
96                         return messageId;\r
97                 }\r
98                 return "<" + messageId + ">";\r
99         }\r
100 \r
101         /**\r
102          * メッセージIDを返します。前後に&lt;&gt;は付きません。\r
103          * 受信メールにメッセージIDが存在しない場合はnullを返します。\r
104          * \r
105          * @return メッセージID、またはnull\r
106          */\r
107         public String getMessageIdWithoutBracket() {\r
108                 if (messageId == null || messageId.length() == 0) {\r
109                         return null;\r
110                 }\r
111                 if (messageId.startsWith("<") && messageId.endsWith(">")) {\r
112                         return messageId.substring(1, messageId.length() - 1);\r
113                 }\r
114                 return messageId;\r
115         }\r
116 \r
117         /**\r
118          * メッセージIDをセットします。\r
119          * \r
120          * @param messageId メッセージID\r
121          */\r
122         public void setMessageId(String messageId) {\r
123                 this.messageId = messageId;\r
124         }\r
125 \r
126         /**\r
127          * In-Reply-Toヘッダの値を返します。\r
128          * In-Reply-Toヘッダがない場合はnullを返します。\r
129          * \r
130          * @return In-Reply-Toヘッダの値\r
131          */\r
132         public String getInReplyTo() {\r
133                 return (String)headers.get("In-Reply-To");\r
134         }\r
135 \r
136         /**\r
137          * Referencesヘッダの値を返します。\r
138          * Referencesヘッダがない場合はnullを返します。\r
139          * \r
140          * @return Referencesヘッダの値\r
141          */\r
142         public String getRefereces() {\r
143                 return (String)headers.get("References");\r
144         }\r
145 \r
146         /**\r
147          * @return 返信時の件名に付ける接頭辞\r
148          */\r
149         public String getReplySubjectPrefix() {\r
150                 return replySubjectPrefix;\r
151         }\r
152 \r
153         /**\r
154          * 返信時の件名に付ける接頭辞をセットします。\r
155          * デフォルトは「Re: 」。\r
156          * \r
157          * @param replySubjectPrefix 返信時の件名に付ける接頭辞\r
158          */\r
159         public void setReplySubjectPrefix(String replySubjectPrefix) {\r
160                 this.replySubjectPrefix = replySubjectPrefix;\r
161         }\r
162 \r
163         /**\r
164          * メール内容を出力します。<br>\r
165          * メールのソースに似たフォーマットで出力されます。\r
166          * \r
167          * @see java.lang.Object#toString()\r
168          */\r
169         public String toString() {\r
170                 StringBuffer buf = new StringBuffer(1000);\r
171                 buf.append("Mail\n");\r
172                 buf.append("Return-Path: ").append(returnPath).append("\n");\r
173                 buf.append("Message-ID: ").append(messageId).append("\n");\r
174                 buf.append("Date: ").append(date).append("\n");\r
175                 buf.append("From: ").append(from != null ? from.toUnicodeString() : null).append("\n");\r
176                 buf.append("To: ").append(arrayToCommaDelimitedString(to)).append("\n");\r
177                 buf.append("Cc: ").append(arrayToCommaDelimitedString(cc)).append("\n");\r
178                 buf.append("Bcc: ").append(arrayToCommaDelimitedString(bcc)).append("\n");\r
179                 buf.append("Reply-To: ").append(replyTo != null ? replyTo.toUnicodeString() : null).append(\r
180                                 "\n");\r
181                 buf.append("Subject: ").append(subject).append("\n");\r
182 \r
183                 if (headers != null) {\r
184                         for (Iterator itr = headers.keySet().iterator(); itr.hasNext();) {\r
185                                 String header = (String)itr.next();\r
186                                 String value = (String)headers.get(header);\r
187                                 buf.append(header).append(": ").append(value).append("\n");\r
188                         }\r
189                 }\r
190 \r
191                 buf.append("\n");\r
192                 buf.append(text);\r
193 \r
194                 if (htmlText != null) {\r
195                         buf.append("\n\n-----\n\n");\r
196                         buf.append(htmlText);\r
197                 }\r
198 \r
199                 if (isFileAttached()) {\r
200                         buf.append("\n\nAttachments\n");\r
201                         for (int i = 0, num = attachmentFiles.size(); i < num; i++) {\r
202                                 AttachmentFile f = (AttachmentFile)attachmentFiles.get(i);\r
203                                 buf.append("[").append(i + 1).append("] ").append(f.getName()).append("\n");\r
204                         }\r
205                 }\r
206 \r
207                 return buf.toString();\r
208         }\r
209 \r
210         /**\r
211          * @return Returns the message.\r
212          */\r
213         public MimeMessage getMessage() {\r
214                 return message;\r
215         }\r
216 \r
217         /**\r
218          * @param message The message to set.\r
219          */\r
220         public void setMessage(MimeMessage message) {\r
221                 this.message = message;\r
222         }\r
223 \r
224         /**\r
225          * メールサーバとの接続切断時に、このメールをメールサーバから削除します。\r
226          * 削除できるように設定ができた場合に true を返します。\r
227          * <p>\r
228          * このメソッドは、<code>FetchMailPro</code>のメソッドによって取得された\r
229          * <code>ReceivedMail</code>インスタンスでのみ有効です。\r
230          * また、<code>FetchMailPro</code>インスタンスがメールサーバに\r
231          * 接続されている状態での呼び出しのみ有効です。<br>\r
232          * これらの条件が満たされない時にこのメソッドが呼び出された場合\r
233          * false を返します。\r
234          * \r
235          * TODO: うまく動いてない。\r
236          * \r
237          * @see FetchMailPro\r
238          * @param delete 削除するように設定する場合 true\r
239          * @return 削除設定が正常に行われた場合 true\r
240          */\r
241         public boolean setDelete(boolean delete) {\r
242                 if (message != null) {\r
243                         try {\r
244                                 message.setFlag(Flags.Flag.DELETED, delete);\r
245                         } catch (MessagingException e) {\r
246                                 return false;\r
247                         }\r
248                         return true;\r
249                 }\r
250                 return false;\r
251         }\r
252 \r
253         /**\r
254          * メールのサイズ(容量)を返します。単位はbyte。\r
255          * この値は厳密なものではないので注意してください。\r
256          * \r
257          * @see MimeMessage#getSize()\r
258          * @return メールのサイズ(単位はbyte)\r
259          */\r
260         public int getSize() {\r
261                 return size;\r
262         }\r
263 \r
264         /**\r
265          * メールのサイズ(容量)をセットします。単位はbyte。\r
266          * \r
267          * @param size メールのサイズ(単位はbyte)\r
268          */\r
269         public void setSize(int size) {\r
270                 this.size = size;\r
271         }\r
272 \r
273         /**\r
274          * 添付ファイルのFileインスタンス配列を返します。\r
275          * 添付ファイルがない場合は空の配列を返します。\r
276          * \r
277          * @return 添付ファイルのFileインスタンス配列\r
278          */\r
279         public File[] getFiles() {\r
280                 AttachmentFile[] aFiles = getAttachmentFiles();\r
281                 File[] files = new File[aFiles.length];\r
282                 for (int i = 0; i < aFiles.length; i++) {\r
283                         AttachmentFile aFile = aFiles[i];\r
284                         files[i] = aFile.getFile();\r
285                 }\r
286                 return files;\r
287         }\r
288 \r
289         /**\r
290          * このメールの返信メール用Mailインスタンスを生成して返します。\r
291          * <ul>\r
292          * <li>宛先(Toアドレス)には、このメールのReply-To、またはFromがセットされます。</li>\r
293          * <li>件名には、このメールの件名が大文字小文字問わず「Re:」で始まっていなければ、「Re: 」を頭に付けた件名がセットされます。「Re:」で始まっている場合には、その件名をそのままセットします。</li>\r
294          * <li>本文には、何もセットされません。</li>\r
295          * <li>このメールにMessage-IDがセットされていれば、In-Reply-Toヘッダにその値がセットされます。</li>\r
296          * <li>このメールにMessage-IDがセットされていれば、Referencesヘッダにその値が加えられます。</li>\r
297          * </ul>\r
298          * \r
299          * @return 返信用のMailインスタンス\r
300          */\r
301         public Mail reply() {\r
302                 Mail mail = new Mail();\r
303 \r
304                 // 宛先\r
305                 if (getReplyTo() != null) {\r
306                         mail.addTo(getReplyTo());\r
307                 } else {\r
308                         mail.addTo(getFrom());\r
309                 }\r
310 \r
311                 // 件名\r
312                 String subject = getSubject();\r
313                 if ((subject.length() >= 3 && !"Re:".equalsIgnoreCase(subject.substring(0, 3)))\r
314                                 || subject.length() < 3) {\r
315                         subject = replySubjectPrefix + subject;\r
316                 }\r
317                 mail.setSubject(subject);\r
318 \r
319                 // In-Reply-To, References\r
320                 String messageId = getMessageId();\r
321                 if (messageId != null && !"<>".equals(messageId)) {\r
322                         String references = getRefereces();\r
323                         if (references != null) {\r
324                                 references = messageId + " " + references;\r
325                         } else if (getInReplyTo() != null) {\r
326                                 references = messageId + " " + getInReplyTo();\r
327                         } else {\r
328                                 references = messageId;\r
329                         }\r
330                         mail.addHeader("References", references);\r
331                         mail.addHeader("In-Reply-To", messageId);\r
332                 }\r
333 \r
334                 return mail;\r
335         }\r
336 \r
337         /**\r
338          * Receivedヘッダフィールドを追加します。\r
339          * \r
340          * @param rh Receivedヘッダフィールド\r
341          */\r
342         public void addReceviedHeader(ReceivedHeader rh) {\r
343                 if (receivedHeaders == null) {\r
344                         receivedHeaders = new ArrayList();\r
345                 }\r
346                 receivedHeaders.add(rh);\r
347         }\r
348 \r
349         /**\r
350          * Receivedヘッダフィールドの配列を返します。<br>\r
351          * 自分のサーバ(このメールが届いたサーバ)から送信元のメールサーバを辿る順で並んでいます。<br>\r
352          * 受信メールがReceivedヘッダフィールドを持たない、または解析できなかった場合は空の配列を返します。\r
353          * \r
354          * @return Receivedヘッダフィールドの配列\r
355          */\r
356         public ReceivedHeader[] getReceivedHeaders() {\r
357                 if (receivedHeaders == null) {\r
358                         return new ReceivedHeader[0];\r
359                 }\r
360                 return (ReceivedHeader[])receivedHeaders\r
361                                 .toArray(new ReceivedHeader[receivedHeaders.size()]);\r
362         }\r
363 \r
364         /**\r
365          * Receviedヘッダフィールドを表すクラス。\r
366          */\r
367         public static class ReceivedHeader {\r
368 \r
369                 private String from;\r
370 \r
371                 private String by;\r
372 \r
373                 /**\r
374                  * @param from メールを送信したサーバのホスト名\r
375                  * @param by メールを受信したサーバのホスト名\r
376                  */\r
377                 public ReceivedHeader(String from, String by) {\r
378                         this.from = from;\r
379                         this.by = by;\r
380                 }\r
381 \r
382                 /**\r
383                  * @see java.lang.Object#toString()\r
384                  */\r
385                 public String toString() {\r
386                         return "Sent from " + from + " and received by " + by;\r
387                 }\r
388 \r
389                 /**\r
390                  * メールを受信したサーバのホスト名を返します。\r
391                  * \r
392                  * @return メールを受信したサーバのホスト名\r
393                  */\r
394                 public String getBy() {\r
395                         return by;\r
396                 }\r
397 \r
398                 /**\r
399                  * メールを送信したサーバのホスト名を返します。\r
400                  * \r
401                  * @return メールを送信したサーバのホスト名\r
402                  */\r
403                 public String getFrom() {\r
404                         return from;\r
405                 }\r
406         }\r
407 }