1 package com.ozacc.mail.fetch;
\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
9 import javax.mail.Flags;
\r
10 import javax.mail.MessagingException;
\r
11 import javax.mail.internet.MimeMessage;
\r
13 import com.ozacc.mail.Mail;
\r
18 * <code>FetchMail</code>、<code>FetchMailPro</code>の実装クラスで受信したメールが、
\r
19 * インターネットメールとしての仕様を満たしていないヘッダ(FromやToなど)の値がセットされていた場合、
\r
20 * そのヘッダに該当する<code>ReceivedMail</code>インスタンスのプロパティには何もセットされません。
\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
26 public class ReceivedMail extends Mail {
\r
28 private String replySubjectPrefix = "Re: ";
\r
32 private String messageId;
\r
36 private List receivedHeaders;
\r
38 private MimeMessage message;
\r
43 public ReceivedMail() {
\r
52 public ReceivedMail(String charset) {
\r
61 public ReceivedMail(Mail original) {
\r
68 * 注: メールの受信日時ではありません。
\r
72 public Date getDate() {
\r
81 public void setDate(Date date) {
\r
86 * 前後に<>が付いたメッセージIDを返します。
\r
87 * 受信メールにメッセージIDが存在しない場合はnullを返します。
\r
89 * @return 前後に<>が付いたメッセージID、またはnull
\r
91 public String getMessageId() {
\r
92 if (messageId == null || messageId.length() == 0) {
\r
95 if (messageId.startsWith("<") && messageId.endsWith(">")) {
\r
98 return "<" + messageId + ">";
\r
102 * メッセージIDを返します。前後に<>は付きません。
\r
103 * 受信メールにメッセージIDが存在しない場合はnullを返します。
\r
105 * @return メッセージID、またはnull
\r
107 public String getMessageIdWithoutBracket() {
\r
108 if (messageId == null || messageId.length() == 0) {
\r
111 if (messageId.startsWith("<") && messageId.endsWith(">")) {
\r
112 return messageId.substring(1, messageId.length() - 1);
\r
120 * @param messageId メッセージID
\r
122 public void setMessageId(String messageId) {
\r
123 this.messageId = messageId;
\r
127 * In-Reply-Toヘッダの値を返します。
\r
128 * In-Reply-Toヘッダがない場合はnullを返します。
\r
130 * @return In-Reply-Toヘッダの値
\r
132 public String getInReplyTo() {
\r
133 return (String)headers.get("In-Reply-To");
\r
137 * Referencesヘッダの値を返します。
\r
138 * Referencesヘッダがない場合はnullを返します。
\r
140 * @return Referencesヘッダの値
\r
142 public String getRefereces() {
\r
143 return (String)headers.get("References");
\r
147 * @return 返信時の件名に付ける接頭辞
\r
149 public String getReplySubjectPrefix() {
\r
150 return replySubjectPrefix;
\r
154 * 返信時の件名に付ける接頭辞をセットします。
\r
157 * @param replySubjectPrefix 返信時の件名に付ける接頭辞
\r
159 public void setReplySubjectPrefix(String replySubjectPrefix) {
\r
160 this.replySubjectPrefix = replySubjectPrefix;
\r
165 * メールのソースに似たフォーマットで出力されます。
\r
167 * @see java.lang.Object#toString()
\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
181 buf.append("Subject: ").append(subject).append("\n");
\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
194 if (htmlText != null) {
\r
195 buf.append("\n\n-----\n\n");
\r
196 buf.append(htmlText);
\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
207 return buf.toString();
\r
211 * @return Returns the message.
\r
213 public MimeMessage getMessage() {
\r
218 * @param message The message to set.
\r
220 public void setMessage(MimeMessage message) {
\r
221 this.message = message;
\r
225 * メールサーバとの接続切断時に、このメールをメールサーバから削除します。
\r
226 * 削除できるように設定ができた場合に true を返します。
\r
228 * このメソッドは、<code>FetchMailPro</code>のメソッドによって取得された
\r
229 * <code>ReceivedMail</code>インスタンスでのみ有効です。
\r
230 * また、<code>FetchMailPro</code>インスタンスがメールサーバに
\r
231 * 接続されている状態での呼び出しのみ有効です。<br>
\r
232 * これらの条件が満たされない時にこのメソッドが呼び出された場合
\r
237 * @see FetchMailPro
\r
238 * @param delete 削除するように設定する場合 true
\r
239 * @return 削除設定が正常に行われた場合 true
\r
241 public boolean setDelete(boolean delete) {
\r
242 if (message != null) {
\r
244 message.setFlag(Flags.Flag.DELETED, delete);
\r
245 } catch (MessagingException e) {
\r
254 * メールのサイズ(容量)を返します。単位はbyte。
\r
255 * この値は厳密なものではないので注意してください。
\r
257 * @see MimeMessage#getSize()
\r
258 * @return メールのサイズ(単位はbyte)
\r
260 public int getSize() {
\r
265 * メールのサイズ(容量)をセットします。単位はbyte。
\r
267 * @param size メールのサイズ(単位はbyte)
\r
269 public void setSize(int size) {
\r
274 * 添付ファイルのFileインスタンス配列を返します。
\r
275 * 添付ファイルがない場合は空の配列を返します。
\r
277 * @return 添付ファイルのFileインスタンス配列
\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
290 * このメールの返信メール用Mailインスタンスを生成して返します。
\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
299 * @return 返信用のMailインスタンス
\r
301 public Mail reply() {
\r
302 Mail mail = new Mail();
\r
305 if (getReplyTo() != null) {
\r
306 mail.addTo(getReplyTo());
\r
308 mail.addTo(getFrom());
\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
317 mail.setSubject(subject);
\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
328 references = messageId;
\r
330 mail.addHeader("References", references);
\r
331 mail.addHeader("In-Reply-To", messageId);
\r
338 * Receivedヘッダフィールドを追加します。
\r
340 * @param rh Receivedヘッダフィールド
\r
342 public void addReceviedHeader(ReceivedHeader rh) {
\r
343 if (receivedHeaders == null) {
\r
344 receivedHeaders = new ArrayList();
\r
346 receivedHeaders.add(rh);
\r
350 * Receivedヘッダフィールドの配列を返します。<br>
\r
351 * 自分のサーバ(このメールが届いたサーバ)から送信元のメールサーバを辿る順で並んでいます。<br>
\r
352 * 受信メールがReceivedヘッダフィールドを持たない、または解析できなかった場合は空の配列を返します。
\r
354 * @return Receivedヘッダフィールドの配列
\r
356 public ReceivedHeader[] getReceivedHeaders() {
\r
357 if (receivedHeaders == null) {
\r
358 return new ReceivedHeader[0];
\r
360 return (ReceivedHeader[])receivedHeaders
\r
361 .toArray(new ReceivedHeader[receivedHeaders.size()]);
\r
365 * Receviedヘッダフィールドを表すクラス。
\r
367 public static class ReceivedHeader {
\r
369 private String from;
\r
374 * @param from メールを送信したサーバのホスト名
\r
375 * @param by メールを受信したサーバのホスト名
\r
377 public ReceivedHeader(String from, String by) {
\r
383 * @see java.lang.Object#toString()
\r
385 public String toString() {
\r
386 return "Sent from " + from + " and received by " + by;
\r
390 * メールを受信したサーバのホスト名を返します。
\r
392 * @return メールを受信したサーバのホスト名
\r
394 public String getBy() {
\r
399 * メールを送信したサーバのホスト名を返します。
\r
401 * @return メールを送信したサーバのホスト名
\r
403 public String getFrom() {
\r