.. 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.


项目邮件列表
=====================

这些是为这个项目建立的邮件列表. 对于每个列表，都有一个订阅，取消订阅和一个存档链接.

.. csv-table:: 邮件列表
	:header: "名称", "岗位", "订阅", "退订", "档案"

        "开发", "dev@singa.incubator.apache.org", "`订阅 <mailto:dev-subscribe@singa.incubator.apache.org>`_", "`退订 <mailto:dev-unsubscribe@singa.incubator.apache.org.>`_", "`mail-archives.apache.org <http://mail-archives.apache.org/mod_mbox/singa-dev/>`_"
        "提交", "commits@singa.incubator.apache.org", "`订阅 <mailto:commits-subscribe@singa.incubator.apache.org>`_", "`退订 <mailto:commits-unsubscribe@singa.incubator.apache.org>`_", "`mail-archives.apache.org  <http://mail-archives.apache.org/mod_mbox/singa-commits/>`_"
