<?xml version="1.0"?>
<!--
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.
-->
<!--
 +======================================================================+
 |****                                                              ****|
 |****      THIS FILE IS GENERATED BY THE COMMONS BUILD PLUGIN      ****|
 |****                    DO NOT EDIT DIRECTLY                      ****|
 |****                                                              ****|
 +======================================================================+
 | TEMPLATE FILE: download-page-template.xml                            |
 | commons-build-plugin/trunk/src/main/resources/commons-xdoc-templates |
 +======================================================================+
 |                                                                      |
 | 1) Re-generate using: mvn commons:download-page                      |
 |                                                                      |
 | 2) Set the following properties in the component's pom:              |
 |    - commons.componentid (required, alphabetic, lower case)          |
 |    - commons.release.version (required)                              |
 |    - commons.binary.suffix (optional)                                |
 |      (defaults to "-bin", set to "" for pre-maven2 releases)         |
 |                                                                      |
 | 3) Example Properties                                                |
 |                                                                      |
 |  <properties>                                                        |
 |    <commons.componentid>math</commons.componentid>                   |
 |    <commons.release.version>1.2</commons.release.version>            |
 |  </properties>                                                       |
 |                                                                      |
 +======================================================================+
-->
<document>
  <properties>
    <title>Download Apache Commons Email</title>
    <author email="dev@commons.apache.org">Commons Documentation Team</author>
  </properties>
  <body>
    <section name="Download Apache Commons Email">
    <subsection name="Using a Mirror">
      <p>
        We recommend you use a mirror to download our release
        builds, but you <strong>must</strong> verify the integrity of
        the downloaded files using signatures downloaded from our main
        distribution directories. Recent releases (48 hours) may not yet
        be available from the mirrors.
      </p>

      <p>
        You are currently using <b>[preferred]</b>.  If you
        encounter a problem with this mirror, please select another
        mirror.  If all mirrors are failing, there are <i>backup</i>
        mirrors (at the end of the mirrors list) that should be
        available.
        <br></br>
        [if-any logo]<a href="[link]"><img align="right" src="[logo]" border="0"></img></a>[end]
      </p>

      <form action="[location]" method="get" id="SelectMirror">
        <p>
          Other mirrors:
          <select name="Preferred">
          [if-any http]
            [for http]<option value="[http]">[http]</option>[end]
          [end]
          [if-any ftp]
            [for ftp]<option value="[ftp]">[ftp]</option>[end]
          [end]
          [if-any backup]
            [for backup]<option value="[backup]">[backup] (backup)</option>[end]
          [end]
          </select>
          <input type="submit" value="Change"></input>
        </p>
      </form>

      <p>
        The <a href="http://www.apache.org/dist/commons/KEYS">KEYS</a>
        link links to the code signing keys used to sign the product.
        The <code>PGP</code> link downloads the OpenPGP compatible signature from our main site.
        The <code>MD5</code> link downloads the checksum from the main site.
      </p>
    </subsection>
    </section>
    <section name="Apache Commons Email 1.3.3 ">
      <subsection name="Binaries">
        <table>
          <tr>
              <td><a href="[preferred]/commons/email/binaries/commons-email-1.3.3-bin.tar.gz">commons-email-1.3.3-bin.tar.gz</a></td>
              <td><a href="http://www.apache.org/dist/commons/email/binaries/commons-email-1.3.3-bin.tar.gz.md5">md5</a></td>
              <td><a href="http://www.apache.org/dist/commons/email/binaries/commons-email-1.3.3-bin.tar.gz.asc">pgp</a></td>
          </tr>
          <tr>
              <td><a href="[preferred]/commons/email/binaries/commons-email-1.3.3-bin.zip">commons-email-1.3.3-bin.zip</a></td>
              <td><a href="http://www.apache.org/dist/commons/email/binaries/commons-email-1.3.3-bin.zip.md5">md5</a></td>
              <td><a href="http://www.apache.org/dist/commons/email/binaries/commons-email-1.3.3-bin.zip.asc">pgp</a></td>
          </tr>
        </table>
      </subsection>
      <subsection name="Source">
        <table>
          <tr>
              <td><a href="[preferred]/commons/email/source/commons-email-1.3.3-src.tar.gz">commons-email-1.3.3-src.tar.gz</a></td>
              <td><a href="http://www.apache.org/dist/commons/email/source/commons-email-1.3.3-src.tar.gz.md5">md5</a></td>
              <td><a href="http://www.apache.org/dist/commons/email/source/commons-email-1.3.3-src.tar.gz.asc">pgp</a></td>
          </tr>
          <tr>
              <td><a href="[preferred]/commons/email/source/commons-email-1.3.3-src.zip">commons-email-1.3.3-src.zip</a></td>
              <td><a href="http://www.apache.org/dist/commons/email/source/commons-email-1.3.3-src.zip.md5">md5</a></td>
              <td><a href="http://www.apache.org/dist/commons/email/source/commons-email-1.3.3-src.zip.asc">pgp</a></td>
          </tr>
        </table>
      </subsection>
    </section>
    <section name="Archives">
        <p>
          Older releases can be obtained from the archives.
        </p>
        <ul>
          <li class="download"><a href="[preferred]/commons/email/">browse download area</a></li>
          <li><a href="http://archive.apache.org/dist/commons/email/">archives...</a></li>
        </ul>
    </section>
  </body>
</document>
