📄 mailimpl.java
字号:
/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/package org.apache.james.core;import org.apache.avalon.framework.activity.Disposable;import org.apache.avalon.framework.container.ContainerUtil;import org.apache.mailet.Mail;import org.apache.mailet.MailAddress;import org.apache.mailet.RFC2822Headers;import javax.mail.Address;import javax.mail.MessagingException;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import javax.mail.internet.ParseException;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.OptionalDataException;import java.io.OutputStream;import java.io.Serializable;import java.util.ArrayList;import java.util.Collection;import java.util.Date;import java.util.HashMap;import java.util.Iterator;/** * <P>Wraps a MimeMessage adding routing information (from SMTP) and some simple * API enhancements.</P> * <P>From James version > 2.2.0a8 "mail attributes" have been added. * Backward and forward compatibility is supported: * messages stored in file repositories <I>without</I> attributes by James version <= 2.2.0a8 * will be processed by later versions as having an empty attributes hashmap; * messages stored in file repositories <I>with</I> attributes by James version > 2.2.0a8 * will be processed by previous versions, ignoring the attributes.</P> * * @version CVS $Revision: 494012 $ $Date: 2007-01-08 11:23:58 +0100 (Mo, 08 Jan 2007) $ */public class MailImpl implements Disposable, Mail { /** * We hardcode the serialVersionUID so that from James 1.2 on, * MailImpl will be deserializable (so your mail doesn't get lost) */ public static final long serialVersionUID = -4289663364703986260L; /** * The error message, if any, associated with this mail. */ private String errorMessage; /** * The state of this mail, which determines how it is processed. */ private String state; /** * The MimeMessage that holds the mail data. */ private MimeMessage message; /** * The sender of this mail. */ private MailAddress sender; /** * The collection of recipients to whom this mail was sent. */ private Collection recipients; /** * The identifier for this mail message */ private String name; /** * The remote host from which this mail was sent. */ private String remoteHost = "localhost"; /** * The remote address from which this mail was sent. */ private String remoteAddr = "127.0.0.1"; /** * The last time this message was updated. */ private Date lastUpdated = new Date(); /** * Attributes added to this MailImpl instance */ private HashMap attributes; /** * A constructor that creates a new, uninitialized MailImpl */ public MailImpl() { setState(Mail.DEFAULT); attributes = new HashMap(); } /** * A constructor that creates a MailImpl with the specified name, * sender, and recipients. * * @param name the name of the MailImpl * @param sender the sender for this MailImpl * @param recipients the collection of recipients of this MailImpl */ public MailImpl(String name, MailAddress sender, Collection recipients) { this(); this.name = name; this.sender = sender; this.recipients = null; // Copy the recipient list if (recipients != null) { Iterator theIterator = recipients.iterator(); this.recipients = new ArrayList(); while (theIterator.hasNext()) { this.recipients.add(theIterator.next()); } } } /** * @param mail * @param newName * @throws MessagingException */ public MailImpl(Mail mail, String newName) throws MessagingException { this(newName, mail.getSender(), mail.getRecipients(), mail.getMessage()); setRemoteHost(mail.getRemoteHost()); setRemoteAddr(mail.getRemoteAddr()); setLastUpdated(mail.getLastUpdated()); try { if (mail instanceof MailImpl) { setAttributesRaw((HashMap) cloneSerializableObject(((MailImpl) mail).getAttributesRaw())); } else { HashMap attribs = new HashMap(); for (Iterator i = mail.getAttributeNames(); i.hasNext(); ) { String hashKey = (String) i.next(); attribs.put(hashKey,cloneSerializableObject(mail.getAttribute(hashKey))); } setAttributesRaw(attribs); } } catch (IOException e) { // should never happen for in memory streams setAttributesRaw(new HashMap()); } catch (ClassNotFoundException e) { // should never happen as we just serialized it setAttributesRaw(new HashMap()); } } /** * A constructor that creates a MailImpl with the specified name, * sender, recipients, and message data. * * @param name the name of the MailImpl * @param sender the sender for this MailImpl * @param recipients the collection of recipients of this MailImpl * @param messageIn a stream containing the message source */ public MailImpl(String name, MailAddress sender, Collection recipients, InputStream messageIn) throws MessagingException { this(name, sender, recipients); MimeMessageSource source = new MimeMessageInputStreamSource(name, messageIn); this.setMessage(new MimeMessageCopyOnWriteProxy(source)); } /** * A constructor that creates a MailImpl with the specified name, * sender, recipients, and MimeMessage. * * @param name the name of the MailImpl * @param sender the sender for this MailImpl * @param recipients the collection of recipients of this MailImpl * @param message the MimeMessage associated with this MailImpl */ public MailImpl(String name, MailAddress sender, Collection recipients, MimeMessage message) throws MessagingException { this(name, sender, recipients); this.setMessage(new MimeMessageCopyOnWriteProxy(message)); } /** * A constructor which will attempt to obtain sender and recipients from the headers of the MimeMessage supplied. * @param message - a MimeMessage from which to construct a Mail */ public MailImpl(MimeMessage message) throws MessagingException { this(); MailAddress sender = getReturnPath(message); Collection recipients = null; Address[] addresses = message.getRecipients(MimeMessage.RecipientType.TO); if (addresses != null) { recipients = new ArrayList(); for (int i = 0; i < addresses.length; i++) { try { recipients.add(new MailAddress(new InternetAddress(addresses[i].toString(), false))); } catch (ParseException pe) { // RFC 2822 section 3.4 allows To: fields without <> // Let's give this one more try with <>. try { recipients.add(new MailAddress("<" + new InternetAddress(addresses[i].toString()).toString() + ">")); } catch (ParseException _) { throw new MessagingException("Could not parse address: " + addresses[i].toString() + " from " + message.getHeader(RFC2822Headers.TO, ", "), pe); } } } } this.name = message.toString(); this.sender = sender; this.recipients = recipients; this.setMessage(message); } /** * Gets the MailAddress corresponding to the existing "Return-Path" of * <I>message</I>. * If missing or empty returns <CODE>null</CODE>, */ private MailAddress getReturnPath(MimeMessage message) throws MessagingException { MailAddress mailAddress = null; String[] returnPathHeaders = message.getHeader(RFC2822Headers.RETURN_PATH); String returnPathHeader = null; if (returnPathHeaders != null) { returnPathHeader = returnPathHeaders[0]; if (returnPathHeader != null) { returnPathHeader = returnPathHeader.trim(); if (!returnPathHeader.equals("<>")) { try { mailAddress = new MailAddress(new InternetAddress(returnPathHeader, false)); } catch (ParseException pe) { throw new MessagingException("Could not parse address: " + returnPathHeader + " from " + message.getHeader(RFC2822Headers.RETURN_PATH, ", "), pe); } } } } return mailAddress; } /** * Duplicate the MailImpl. * * @return a MailImpl that is a duplicate of this one */ public Mail duplicate() { return duplicate(name); } /** * Duplicate the MailImpl, replacing the mail name with the one * passed in as an argument. * * @param newName the name for the duplicated mail * * @return a MailImpl that is a duplicate of this one with a different name */ public Mail duplicate(String newName) { try { return new MailImpl(this, newName); } catch (MessagingException me) { // Ignored. Return null in the case of an error. } return null; } /** * Get the error message associated with this MailImpl. * * @return the error message associated with this MailImpl */ public String getErrorMessage() { return errorMessage; } /** * Get the MimeMessage associated with this MailImpl. * * @return the MimeMessage associated with this MailImpl */ public MimeMessage getMessage() throws MessagingException { return message; } /** * Set the name of this MailImpl. * * @param name the name of this MailImpl */ public void setName(String name) { this.name = name; } /** * Get the name of this MailImpl. * * @return the name of this MailImpl */ public String getName() { return name; } /** * Get the recipients of this MailImpl. * * @return the recipients of this MailImpl */ public Collection getRecipients() {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -