<?xml version="1.0" encoding="UTF-8"?>
<!--
  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.    
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- Generated by Apache Maven Doxia at Apr 18, 2012 -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>
    Mailing lists</title>
    <style type="text/css" media="all">
      @import url("./css/james.css");
      @import url("./css/maven-base.css");
      @import url("./css/maven-theme.css");
      @import url("./css/site.css");
      @import url("./js/jquery/css/custom-theme/jquery-ui-1.8.5.custom.css");
      @import url("./js/jquery/css/print.css");
      @import url("./js/fancybox/jquery.fancybox-1.3.4.css");
    </style>
    <script type="text/javascript" src="./js/jquery/js/jquery-1.4.2.min.js"></script>
    <script type="text/javascript" src="./js/jquery/js/jquery-ui-1.8.5.custom.min.js"></script>
    <script type="text/javascript" src="./js/fancybox/jquery.fancybox-1.3.4.js"></script>
    <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
      <meta name="author" content="James Project Web Team" />
    <meta name="Date-Revision-yyyymmdd" content="20120418" />
    <meta http-equiv="Content-Language" content="en" />
                                                    
<link title="DOAP" rel="meta" type="application/rdf+xml" href="http://james.apache.org//doap_james-project.rdf"/>
                      
          <!-- Google Analytics -->
    <script type="text/javascript">
    
      var _gaq = _gaq || [];
      _gaq.push(['_setAccount', 'UA-1384591-1']);
      _gaq.push(['_trackPageview']);

      (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script').item(0); s.parentNode.insertBefore(ga, s);
      })();

    </script>
    </head>
  <body class="composite">
    <div id="banner">
                                      <a href="index.html" id="bannerLeft" title="james-project-logo.gif">
              
                                                                            
        <img src="images/logos/james-project-logo.gif" alt="James Project" />
                </a>
                              <a href="http://www.apache.org/index.html" id="bannerRight">
              
                                        
        <img src="images/logos/asf-logo-reduced.gif" alt="The Apache Software Foundation" />
                </a>
            <div class="clear">
        <hr/>
      </div>
    </div>
    <div id="breadcrumbs">
            
                
                <div class="xleft">
        <span id="publishDate">Last Published: 2012-04-18</span>
                      </div>
            <div class="xright">                    <a href="index.html" title="Home">Home</a>
            |
                        <a href="server/index.html" title="Server">Server</a>
            |
                        <a href="hupa/index.html" title="Hupa">Hupa</a>
            |
                        <a href="protocols/index.html" title="Protocols">Protocols</a>
            |
                        <a href="mailet/index.html" title="Mailets">Mailets</a>
            |
                        <a href="mailbox/index.html" title="Mailbox">Mailbox</a>
            |
                        <a href="mime4j/index.html" title="Mime4J">Mime4J</a>
            |
                        <a href="jsieve/index.html" title="jSieve">jSieve</a>
            |
                        <a href="jspf/index.html" title="jSPF">jSPF</a>
            |
                        <a href="jdkim/index.html" title="jDKIM">jDKIM</a>
            |
                        <a href="mpt/index.html" title="MPT">MPT</a>
            |
                        <a href="postage/index.html" title="Postage">Postage</a>
              
                
      </div>
      <div class="clear">
        <hr/>
      </div>
    </div>
    <div id="leftColumn">
      <div id="navcolumn">
             
                
                                <h5>About James</h5>
                  <ul>
                  <li class="none">
                          <a href="index.html" title="Overview">Overview</a>
            </li>
                  <li class="none">
                          <a href="newsarchive.html" title="News">News</a>
            </li>
                  <li class="none">
            <strong>Mailing Lists</strong>
          </li>
                  <li class="none">
                          <a href="contribute.html" title="Contributing">Contributing</a>
            </li>
                  <li class="none">
                          <a href="guidelines.html" title="Guidelines">Guidelines</a>
            </li>
                  <li class="none">
                          <a href="http://wiki.apache.org/james" title="Wiki">Wiki</a>
            </li>
                  <li class="none">
                          <a href="team-list.html" title="Who We Are">Who We Are</a>
            </li>
                  <li class="none">
                          <a href="license.html" title="License">License</a>
            </li>
          </ul>
                       <h5>Download</h5>
                  <ul>
                  <li class="none">
                          <a href="download.cgi" title="Releases">Releases</a>
            </li>
                  <li class="none">
                          <a href="https://repository.apache.org/content/repositories/snapshots/org/apache/james/" title=""></a>
            </li>
          </ul>
        <h5>Apache Software Foundation</h5>
  <ul>
    <li>
      <strong>
        <a title="ASF" href="http://www.apache.org/">ASF</a>
      </strong>
    </li>
    <li>
      <a title="Get Involved" href="http://www.apache.org/foundation/getinvolved.html">Get Involved</a>
    </li>
    <li>
      <a title="FAQ" href="http://www.apache.org/foundation/faq.html">FAQ</a>
    </li>
    <li>
      <a title="License" href="http://www.apache.org/licenses/" >License</a>
    </li>
    <li>
      <a title="Sponsorship" href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
    </li>
    <li>
      <a title="Thanks" href="http://www.apache.org/foundation/thanks.html">Thanks</a>
    </li>
    <li>
      <a title="Security" href="http://www.apache.org/security/">Security</a>
    </li>
  </ul>
                       <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
        <img class="poweredBy" alt="Built by Maven" src="./images/logos/maven-feather.png" />
      </a>
                   
                
            </div>
    </div>
    <div id="bodyColumn">
      <div id="contentBox">
        <!-- 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. -->

  

    <div class="section"><h2>James Mailing lists<a name="James_Mailing_lists"></a></h2>
      <p>
        <i>Please read the <a href="#Guidelines">guidelines</a> below</i> before subscribing to our lists and join our 
community.</p>
      <div class="section"><h3>Server User List<a name="Server_User_List"></a></h3>
        <p>
          <b>Low Traffic</b>&#160;
          <a class="externalLink" href="mailto:server-user-subscribe@james.apache.org">Subscribe</a>
          <a class="externalLink" href="mailto:server-user-unsubscribe@james.apache.org">Unsubscribe</a>
          <a class="externalLink" href="http://www.mail-archive.com/server-user@james.apache.org/">Archive</a>
        </p>
        <p> This is the list where users of the Apache James 
(Server) meet and discuss issues. Developers are also expected to be 
subscribed to this list to offer support to users of Apache James 
(Server). </p>
      </div>
      <div class="section"><h3>Server Developer List<a name="Server_Developer_List"></a></h3>
        <p>
          <b>High Traffic</b>&#160;
          <a class="externalLink" href="mailto:server-dev-subscribe@james.apache.org">Subscribe</a>
          <a class="externalLink" href="mailto:server-dev-unsubscribe@james.apache.org">Unsubscribe</a>
          <a class="externalLink" href="http://www.mail-archive.com/server-dev@james.apache.org/">Archive</a>
        </p>
        <p> This is the list where participating developers of 
the the Apache James Project meet and discuss issues, code 
changes/additions, etc. Subscribers to this list get notices of each and 
every code change, build results, testing notices, etc. <b>Do not send 
mail to this list with usage questions or configuration problems</b> -- 
that's what server-user@james is for. </p>
      </div>
      <div class="section"><h3>Mime4j<a name="Mime4j"></a></h3>
        <p>
          <b>Medium Traffic</b>&#160;
          <a class="externalLink" href="mailto:mime4j-dev-subscribe@james.apache.org">Subscribe</a>
          <a class="externalLink" href="mailto:mime4j-dev-unsubscribe@james.apache.org">Unsubscribe</a>
          <a class="externalLink" href="http://mail-archives.apache.org/mod_mbox/james-mime4j-dev">Archive</a>
        </p>
        <p>Discussions on the <a class="externalLink" href="http://james.apache.org/mime4j">Mime4j</a> 
        parser library.</p>
      </div>
      <div class="section"><h3>Site Developer List<a name="Site_Developer_List"></a></h3>
        <p>
          <b>Very Low Traffic</b>&#160;
          <a class="externalLink" href="mailto:site-dev-subscribe@james.apache.org">Subscribe</a>
          <a class="externalLink" href="mailto:site-dev-unsubscribe@james.apache.org">Unsubscribe</a>
          <a class="externalLink" href="http://www.mail-archive.com/site-dev@james.apache.org/">Archive</a>
        </p>
        <p> This is the list where participating developers of 
the the Apache James project discuss changes/additions to the James 
websites etc. Subscribers to this list get notifications of every commit 
of the website reaources<b>Do not send mail to this list with James 
software problems</b> -- that's what server-user@james is for. </p>
      </div>
      <div class="section"><h3>James General List<a name="James_General_List"></a></h3>
        <p>
          <b>Low Traffic</b>&#160;
          <a class="externalLink" href="mailto:general-subscribe@james.apache.org">Subscribe</a>
          <a class="externalLink" href="mailto:general-unsubscribe@james.apache.org">Unsubscribe</a>
          <!-- <a 
href="http://www.mail-archive.com/general@james.apache.org/"> 
Archive</a> -->
        </p>
        <p> This is the list for general discussions 
relating to the running of the project, it is the public list of the 
James project management committee (PMC) and is a public list open to 
all. <b>Do not send mail to this list with James software problems</b> 
-- that's what server-user@james is for. </p>
      </div>
      <div class="section"><h3>Mailet API List<a name="Mailet_API_List"></a></h3>
        <p>
          <b>Very Low Traffic</b>&#160;
          <a class="externalLink" href="mailto:mailet-api-subscribe@james.apache.org">Subscribe</a>
          <a class="externalLink" href="mailto:mailet-api-unsubscribe@james.apache.org">Unsubscribe</a>
        </p>
        <p> This is the public list for the Mailet API subproject, discussing all <a class="externalLink" href="http://james.apache.org/mailet/index.html">Mailet API</a> design and implementation related topics. Questions about using Mailets and their configuration should be addressed to the server-user list.</p>
      </div>
    </div>
	
    <div class="section"><h2>How to unsubscribe your old email address<a name="How_to_unsubscribe_your_old_email_address"></a></h2>
        <p>
        First, find out the particular email adress to which ezmlm is sending.
        The email headers are visible in Microsoft Outlook via the messages menu
        &quot;View | Options&quot;.
        </p>
        <div><pre>
        Microsoft Mail Internet Headers Version 2.0
        ...
        List-Unsubscribe: &lt;mailto:server-user-unsubscribe@james.apache.org&gt;
        List-Help: &lt;mailto:server-user-help@james.apache.org&gt;
        List-Post: &lt;mailto:server-user@james.apache.org&gt;
        List-Id: &quot;James Server Users List&quot; &lt;server-user.james.apache.org&gt;
        Reply-To: &quot;James Server Users List&quot; &lt;server-user@james.apache.org&gt;
        Delivered-To: mailing list server-user@james.apache.org
        ...
        Return-Path: server-user-return-12345-<i>john=host.domain</i>@james.apache.org
        ...
        </pre></div>
        <p>
        The <i>Return-Path</i> header contains the email address which is subscribed. 
        </p>      
        <p>To stop subscription for the address john@host.domain , send an email to </p><div><pre>server-dev-unsubscribe-john=host.domain@james.apache.org</pre></div>
          or to  <div><pre>server-user-unsubscribe-john=host.domain@james.apache.org</pre></div>.
          
    </div>

    <div class="section"><h2>Archives<a name="Archives"></a></h2>
      <p> There are several sites on the net that archive and 
provide searching for our mailing lists in HTML readable format.
</p>
      <p>
        </p><ul>
          <li>Archives with many Jakarta lists: <ul>
              <li>
                <a class="externalLink" href="http://mail-archives.apache.org/mod_mbox/#james">List 
Index on mail-archives.apache.org</a>
              </li>
              <li>
                <a href="/mail/">Full mbox archives of all lists.</a>
              </li>
              <li>
                <a class="externalLink" href="http://www.mail-archive.com/">Mail-Archive</a>
              </li>
              <li>
                <a class="externalLink" href="http://geocrawler.com/">Geocrawler</a>
              </li>
              <li>
                <a class="externalLink" href="http://marc.theaimsgroup.com/">Mailing list Archives</a>
              </li>
              <li>
                <a class="externalLink" href="http://www.servlets.com/archive/">Servlets.com 
servlet and JSP list archives</a>
              </li>
            </ul>
          </li>
        </ul>
      
    </div>
    
    <div class="section"><h2>Guidelines<a name="Guidelines"></a></h2>
      <p>A mailing list is an electronic discussion forum 
that anyone can subscribe to. When someone sends an email message to the 
mailing list, a copy of that message is broadcast to everyone who is 
subscribed to that mailing list. Mailing lists provide a simple and 
effective communication mechanism for discussion and decision making. 
</p>
      <p> The Apache Software Foundation has well established reasons for 
using email and not other types of forum. <br /> We are 
<b>not</b> interested in hearing proposals to use NNTP (news 
groups) or web forums or any other medium.<br /> You may use a mail-news 
gateway, gmail or anything else you like but email is, and will remain, 
the official medium. </p>
      <p> With potentially thousands of subscribers, 
there is a common etiquette that you should observe. Please keep on 
reading. </p>
      <p>
        <b> Respect the mailing list type </b>
      </p>
      <p>
        </p><ul>
          <li> &quot;User&quot; lists are lists where you can send questions 
and comments about configuration, setup, usage and other &quot;user&quot; types of 
questions. </li>
          <li> &quot;Developer&quot; lists are lists where you can send 
questions, comments and contributions about the project's software 
source code and general &quot;development&quot; types of questions. </li>
        </ul>
      
      <p>Some questions are appropriate for posting on both the 
&quot;user&quot; and the &quot;developer&quot; lists. In this case, pick one and only one. 
Do not cross post.</p>
      <p>Asking a configuration question on the 
developers list is frowned upon because developers' time is as precious 
as yours. By contacting them directly instead of the users list you are 
abusing resources. It is unlikely that you will get a quicker answer 
this way, those developers who have time to devote to providing support 
are also subscribed to the users list. If you contact individuals 
directly, or post your user issues to the developer list you may get no 
answer at all.</p>
      <p>
        <b> Join the lists that are appropriate for 
your discussion. </b>
        <br /> Please make sure that you are joining 
the list that is appropriate for the topic that you would like to 
discuss. The general list is for discussions about the management and 
direction of the James project, not for &quot;general support&quot;. </p>
      <p>
        <b> Ask smart questions. </b>
        <br /> 

Every volunteer project obtains its strength from the people involved in 
it. You are welcome to join any of our mailing lists. You can choose to 
lurk, or actively participate; it's up to you. The level of community 
responsiveness to specific questions is generally directly proportional 
to the amount of effort you spend formulating your question. Eric 
Raymond and Rick Moen have even written an essay entitled <a class="externalLink" href="http://www.catb.org/~esr/faqs/smart-questions.html">&quot;<b>Asking 
Smart Questions</b>&quot;</a> precisely on this topic. Although somewhat 
militant, it is definitely worth reading.<br />
        <b>Note</b>: Please do 
NOT send your Java problems to the two authors. They welcome feedback on 
the FAQ's contents, but are simply not a Java help resource. Follow the 
essay's advice and <a class="externalLink" href="http://www.catb.org/~esr/faqs/smart-questions.html#forum">choose 
your forum</a> carefully. </p>
      <p>
        <b> Keep your email short and to the point. </b>
        <br /> If your email is more than about a page of 
text, chances are that it won't get read by very many people. It is much 
better to try to pack a lot of informative information (see above about 
asking smart questions) into as small of an email as possible. If you 
are replying to a previous email only quote the parts that you are 
replying to and to remove the unnecessary bits. This makes it easier for 
people to follow a thread as well as making the email archives easier to 
search and read. </p>
      <p>
        <b> Do your best to ensure that you are 
not sending HTML or &quot;Stylelized&quot; email to the list. </b>
        <br /> If 
you are using Outlook or Outlook Express or Eudora, chances are that you 
are sending HTML email by default. There is usually a setting that will 
allow you to send &quot;Plain Text&quot; email. If you are using Microsoft 
products to send email, there are several bugs in the software that 
prevent you from turning off the sending of HTML email.</p>
      <p>
        <b> Watch where you are sending email. </b>
        <br /> The majority of our mailing 
lists have set the Reply-To to go back to the list. That means that when 
you Reply to a message, it will go to the list and not to the original 
author directly. The reason is because it helps facilitate discussion on 
the list for everyone to benefit from. Be careful of this as sometimes 
you may intend to reply to a message directly to someone instead of the 
entire list. <i> The appropriate contents of the Reply-To header is an 
age-old debate that should not be brought up on the mailing lists. You 
can examine opposing points of view <a class="externalLink" href="http://www.unicom.com/pw/reply-to-harmful.html">condemning</a> our 
convention and <a class="externalLink" href="http://www.metasystema.org/essays/reply-to-useful.mhtml"> 
condoning</a> it. Bringing this up for debate on a mailing list will add 
nothing new and is considered off-topic. </i>
      </p>
      <p>
        <b> Do not cross post messages. </b>
        <br /> In other words, pick one mailing 
list and send your messages to that mailing list only. Do not send your 
messages to multiple mailing lists. The reason is that people may be 
subscribed to one list and not to the other. Therefore, some people will 
only see part of the conversation. </p>
</div>

  


      </div>
    </div>
    <div class="clear">
      <hr/>
    </div>
    <div id="footer">
      <div class="xright">Copyright &#169;                    2006-2012
                        <a href="http://www.apache.org/">The Apache Software Foundation</a>.
            All Rights Reserved.      
                
      </div>
      <div class="clear">
        <hr/>
      </div>
    </div>
  </body>
</html>
