📄 commandlistservprocessor.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.framework.service.ServiceManager;import org.apache.avalon.framework.configuration.Configuration;import org.apache.james.Constants;import org.apache.james.services.UsersRepository;import org.apache.james.services.UsersStore;import org.apache.mailet.RFC2822Headers;import org.apache.james.util.XMLResources;import org.apache.mailet.GenericMailet;import org.apache.mailet.Mail;import org.apache.mailet.MailAddress;import org.apache.mailet.MailetException;import javax.mail.MessagingException;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeMultipart;import javax.mail.internet.ParseException;import java.io.IOException;import java.lang.reflect.Field;import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;import java.util.Properties;/** * CommandListservProcessor processes messages intended for the list serv mailing list. * For command handling, see {@link CommandListservManager} <br /> * * This class is based on the existing list serv processor shipped with James. * <br /> * <br /> * * To configure the CommandListservProcessor place this configuratin in the root processor: * <pre> * <mailet match="RecipientIs=announce@localhost" class="CommandListservProcessor"> * <membersonly>false</membersonly> * <attachmentsallowed>true</attachmentsallowed> * <replytolist>true</replytolist> * <repositoryName>list-announce</repositoryName> * <subjectprefix>Announce</subjectprefix> * <autobracket>true</autobracket> * <listOwner>owner@localhost</listOwner> * <listName>announce</listName> * </mailet> * * </pre> * * @version CVS $Revision: 494012 $ $Date: 2007-01-08 11:23:58 +0100 (Mo, 08 Jan 2007) $ * @since 2.2.0 */public class CommandListservProcessor extends GenericMailet { /** * Whether only members can post to the list specified by the config param: 'membersonly'. * <br /> * eg: <pre><membersonly>false</membersonly></pre> * * Defaults to false */ protected boolean membersOnly; /** * Whether attachments can be sent to the list specified by the config param: 'attachmentsallowed'. * <br /> * eg: <pre><attachmentsallowed>true</attachmentsallowed></pre> * * Defaults to true */ protected boolean attachmentsAllowed; /** * Whether the reply-to header should be set to the list address * specified by the config param: 'replytolist'. * <br /> * eg: <pre><replytolist>true</replytolist></pre> * * Defaults to true */ protected boolean replyToList; /** * A String to prepend to the subject of the message when it is sent to the list * specified by the config param: 'subjectPrefix'. * <br /> * eg: <pre><subjectPrefix>MyList</subjectPrefix></pre> * * For example: MyList */ protected String subjectPrefix; /** * Whether the subject prefix should be bracketed with '[' and ']' * specified by the config param: 'autoBracket'. * <br /> * eg: <pre><autoBracket>true</autoBracket></pre> * * Defaults to true */ protected boolean autoBracket; /** * The repository containing the users on this list * specified by the config param: 'repositoryName'. * <br /> * eg: <pre><repositoryName>list-announce</repositoryName></pre> */ protected UsersRepository usersRepository; /** * The list owner * specified by the config param: 'listOwner'. * <br /> * eg: <pre><listOwner>owner@localhost</listOwner></pre> */ protected MailAddress listOwner; /** * Name of the mailing list * specified by the config param: 'listName'. * <br /> * eg: <pre><listName>announce</listName></pre> * */ protected String listName; /** * The list serv manager */ protected ICommandListservManager commandListservManager; /** * Mailet that will add the footer to the message */ protected CommandListservFooter commandListservFooter; /** * @see XMLResources */ protected XMLResources xmlResources; protected boolean specificPostersOnly; protected Collection allowedPosters; /** * Initialize the mailet */ public void init() throws MessagingException { try { Configuration configuration = (Configuration) getField(getMailetConfig(), "configuration"); membersOnly = getBoolean("membersonly", false); attachmentsAllowed = getBoolean("attachmentsallowed", true); replyToList = getBoolean("replytolist", true); subjectPrefix = getString("subjectprefix", null); listName = getString("listName", null); autoBracket = getBoolean("autobracket", true); listOwner = new MailAddress(getString("listOwner", null)); specificPostersOnly = getBoolean("specifiedpostersonly", false); //initialize resources initializeResources(); //init user repos initUsersRepository(); initAllowedPosters(configuration); } catch (Exception e) { throw new MessagingException(e.getMessage(), e); } } /** * A message was sent to the list serv. Broadcast if appropriate... * @param mail * @throws MessagingException */ public void service(Mail mail) throws MessagingException { try { Collection members = getMembers(); MailAddress listservAddr = (MailAddress) mail.getRecipients().iterator().next(); // Check if allowed to post if (!checkAllowedPoster(mail, members)) { return; } //Check for no attachments if (!checkAnnouncements(mail)) { return; } //check been there if (!checkBeenThere(listservAddr, mail)) { return; } //addfooter addFooter(mail); //prepare the new message MimeMessage message = prepareListMessage(mail, listservAddr); //Set the subject if set setSubject(message); //Send the message to the list members //We set the list owner as the sender for now so bounces go to him/her getMailetContext().sendMail(listOwner, members, message); } catch (IOException ioe) { throw new MailetException("Error creating listserv message", ioe); } finally { //Kill the old message mail.setState(Mail.GHOST); } } /** * Add the footer using {@link CommandListservFooter} * @param mail * @throws MessagingException */ protected void addFooter(Mail mail) throws MessagingException { getCommandListservFooter().service(mail); } protected void setSubject(MimeMessage message) throws MessagingException { String prefix = subjectPrefix; if (prefix != null) { if (autoBracket) { StringBuffer prefixBuffer = new StringBuffer(64) .append("[") .append(prefix) .append("]"); prefix = prefixBuffer.toString(); } String subj = message.getSubject(); if (subj == null) { subj = ""; } subj = normalizeSubject(subj, prefix); AbstractRedirect.changeSubject(message, subj); } } /** * Create a new message with some set headers * @param mail * @param listservAddr * @return a prepared List Message * @throws MessagingException */ protected MimeMessage prepareListMessage(Mail mail, MailAddress listservAddr) throws MessagingException { //Create a copy of this message to send out MimeMessage message = new MimeMessage(mail.getMessage()); //We need tao remove this header from the copy we're sending around message.removeHeader(RFC2822Headers.RETURN_PATH); //We're going to set this special header to avoid bounces // getting sent back out to the list message.setHeader("X-been-there", listservAddr.toString()); //If replies should go to this list, we need to set the header if (replyToList) { message.setHeader(RFC2822Headers.REPLY_TO, listservAddr.toString()); } return message; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -