⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tomultirepository.java

📁 java mail,java mailjava mailjava mailjava mail
💻 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.transport.mailets;import org.apache.avalon.cornerstone.services.store.Store;import org.apache.avalon.framework.configuration.DefaultConfiguration;import org.apache.avalon.framework.container.ContainerUtil;import org.apache.avalon.framework.service.ServiceException;import org.apache.avalon.framework.service.ServiceManager;import org.apache.james.Constants;import org.apache.james.James;import org.apache.james.core.MailImpl;import org.apache.james.services.MailRepository;import org.apache.james.services.MailServer;import org.apache.mailet.RFC2822Headers;import org.apache.mailet.GenericMailet;import org.apache.mailet.Mail;import org.apache.mailet.MailAddress;import javax.mail.Header;import javax.mail.MessagingException;import javax.mail.internet.MimeMessage;import javax.mail.internet.InternetHeaders;import java.util.Collection;import java.util.Enumeration;import java.util.HashSet;import java.util.Iterator;import java.util.Vector;/** * Receives a Mail from JamesSpoolManager and takes care of delivery of the * message to local inboxes or a specific repository. *  * Differently from LocalDelivery this does not lookup the UserRepository This * simply store the message in a repository named like the local part of the * recipient address. *  * If no repository is specified then this fallback to MailServer.getUserInbox. * Otherwise you can add your own configuration for the repository *  * e.g: <repositoryUrl>file://var/spool/userspools/</repositoryUrl> * <repositoryType>SPOOL</repositoryType> *  * <repositoryUrl>file://var/mail/inboxes/</repositoryUrl> <repositoryType>MAIL</repositoryType> *  * Header "Delivered-To" can be added to every message adding the * <addDeliveryHeader>Delivered-To</addDeliveryHeader> *  */public class ToMultiRepository extends GenericMailet {    /**     * The number of mails generated. Access needs to be synchronized for thread     * safety and to ensure that all threads see the latest value.     */    private static long count;    /**     * The mailserver reference     */    private MailServer mailServer;    /**     * The mailstore     */    private Store store;    /**     * The optional repositoryUrl     */    private String repositoryUrl;    /**     * The optional repositoryType     */    private String repositoryType;    /**     * The delivery header     */    private String deliveryHeader;    /**     * resetReturnPath     */    private boolean resetReturnPath;    /**     * Delivers a mail to a local mailbox.     *      * @param mail     *            the mail being processed     *      * @throws MessagingException     *             if an error occurs while storing the mail     */    public void service(Mail mail) throws MessagingException {        Collection recipients = mail.getRecipients();        Collection errors = new Vector();        MimeMessage message = null;        if (deliveryHeader != null || resetReturnPath) {            message = mail.getMessage();        }        if (resetReturnPath) {            // Set Return-Path and remove all other Return-Path headers from the            // message            // This only works because there is a placeholder inserted by            // MimeMessageWrapper            message.setHeader(RFC2822Headers.RETURN_PATH,                    (mail.getSender() == null ? "<>" : "<" + mail.getSender()                            + ">"));        }        Enumeration headers;        InternetHeaders deliveredTo = new InternetHeaders();        if (deliveryHeader != null) {            // Copy any Delivered-To headers from the message            headers = message                    .getMatchingHeaders(new String[] { deliveryHeader });            while (headers.hasMoreElements()) {                Header header = (Header) headers.nextElement();                deliveredTo.addHeader(header.getName(), header.getValue());            }        }        for (Iterator i = recipients.iterator(); i.hasNext();) {            MailAddress recipient = (MailAddress) i.next();            try {                if (deliveryHeader != null) {                    // Add qmail's de facto standard Delivered-To header                    message.addHeader(deliveryHeader, recipient.toString());                }                storeMail(mail.getSender(), recipient, message);                if (deliveryHeader != null) {                    if (i.hasNext()) {                        // Remove headers but leave all placeholders                        message.removeHeader(deliveryHeader);                        headers = deliveredTo.getAllHeaders();                        // And restore any original Delivered-To headers                        while (headers.hasMoreElements()) {                            Header header = (Header) headers.nextElement();                            message.addHeader(header.getName(), header                                    .getValue());                        }                    }                }            } catch (Exception ex) {                getMailetContext().log("Error while storing mail.", ex);                errors.add(recipient);            }        }        if (!errors.isEmpty()) {            // If there were errors, we redirect the email to the ERROR            // processor.            // In order for this server to meet the requirements of the SMTP            // specification, mails on the ERROR processor must be returned to            // the sender. Note that this email doesn't include any details            // regarding the details of the failure(s).            // In the future we may wish to address this.            getMailetContext().sendMail(mail.getSender(), errors, mail.getMessage(),                    Mail.ERROR);        }        // We always consume this message        mail.setState(Mail.GHOST);    }    /**     * Return a string describing this mailet.     *      * @return a string describing this mailet     */    public String getMailetInfo() {        return "ToMultiRepository Mailet";    }    /**     *      * @param sender     * @param recipient     * @param message     * @throws MessagingException     */    public void storeMail(MailAddress sender, MailAddress recipient,            MimeMessage message) throws MessagingException {        String username;        if (recipient == null) {            throw new IllegalArgumentException(                    "Recipient for mail to be spooled cannot be null.");        }        if (message == null) {            throw new IllegalArgumentException(                    "Mail message to be spooled cannot be null.");        }        username = recipient.getUser();        Collection recipients = new HashSet();        recipients.add(recipient);        MailImpl mail = new MailImpl(getId(), sender, recipients, message);        try {            MailRepository userInbox = getRepository(username);            if (userInbox == null) {                StringBuffer errorBuffer = new StringBuffer(128).append(                        "The repository for user ").append(username).append(                        " was not found on this server.");                throw new MessagingException(errorBuffer.toString());            }            userInbox.store(mail);        } finally {            mail.dispose();        }    }    /**     * Return a new mail id.     *      * @return a new mail id     */    public String getId() {        long localCount = -1;        synchronized (James.class) {            localCount = count++;        }        StringBuffer idBuffer = new StringBuffer(64).append("Mail").append(                System.currentTimeMillis()).append("-").append(localCount);        return idBuffer.toString();    }    /**     * @see org.apache.mailet.GenericMailet#init()     */    public void init() throws MessagingException {        super.init();        ServiceManager compMgr = (ServiceManager) getMailetContext()                .getAttribute(Constants.AVALON_COMPONENT_MANAGER);        try {            // Instantiate the a MailRepository for outgoing mails            mailServer = (MailServer) compMgr.lookup(MailServer.ROLE);        } catch (ServiceException cnfe) {            log("Failed to retrieve MailServer component:" + cnfe.getMessage());        } catch (Exception e) {            log("Failed to retrieve MailServer component:" + e.getMessage());        }        try {            // Instantiate the a MailRepository for outgoing mails            store = (Store) compMgr.lookup(Store.ROLE);        } catch (ServiceException cnfe) {            log("Failed to retrieve Store component:" + cnfe.getMessage());        } catch (Exception e) {            log("Failed to retrieve Store component:" + e.getMessage());        }        repositoryUrl = getInitParameter("repositoryUrl");        if (repositoryUrl != null) {            repositoryType = getInitParameter("repositoryType");            if (repositoryType == null)                repositoryType = "MAIL";        }        deliveryHeader = getInitParameter("addDeliveryHeader");        String resetReturnPathString = getInitParameter("resetReturnPath");        resetReturnPath = "true".equalsIgnoreCase(resetReturnPathString);    }    /**     * Get the user inbox: if the repositoryUrl is null then get the userinbox     * from the mailserver, otherwise lookup the store with the given      * repositoryurl/type     *        * @param userName     * @return     */    private MailRepository getRepository(String userName) {        MailRepository userInbox;        if (repositoryUrl == null) {            userInbox = mailServer.getUserInbox(userName);        } else {            StringBuffer destinationBuffer = new StringBuffer(192).append(                    repositoryUrl).append(userName).append("/");            String destination = destinationBuffer.toString();            DefaultConfiguration mboxConf = new DefaultConfiguration(                    "repository", "generated:ToMultiRepository.getUserInbox()");            mboxConf.setAttribute("destinationURL", destination);            mboxConf.setAttribute("type", repositoryType);            try {                userInbox = (MailRepository) store.select(mboxConf);            } catch (Exception e) {                log("Cannot open repository " + e);                userInbox = null;            }        }        return userInbox;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -