• 邮件服务器 之 利用debian sarge和postfix 2.1构建媲美ISP的邮件系统


    非常简明的debian sarge + postfix + mysql + webmail + web admin安装配置指南
    想在debian上安装postfix邮件系统很多年了,参考了许多网上的资料,看得最多的是以下几个:
    王兴宇的:http://cngnu.org/technology/Postfix_I.html
    陈景峰的:http://www.huihoo.com/internet/postfix/pis/book1.html

    但一直不是很成功。原因有以下几个:
    1、所需软件很多,全都要自行重头编译,对于我这些菜鸟非常困难,各个软件之间的依赖关系一头雾水。
    2、配置过程复杂,让人忘而生畏。有时候看着几百行的配置文件头皮发麻。
    3、工作原理懵里懵懂,许多参数不知道干什么用的,只能依葫芦画瓢,错了不知从哪里改。

    前几天看了http://workaround.org/articles/ispmail-sarge/,突然明白了许多道理,居然一下子成功了!我还根据自己的了解改进了webmail部分,增加了邮件系统的web管理。不敢独自享用,编译出来,供与我有同样的困惑的fans共享。

    利用debian sarge和postfix 2.1构建媲美ISP的邮件系统
    作者:Dipl.-Inform. Christoph Haas
    原文出处:http://workaround.org/articles/ispmail-sarge/
    译者:一致连续
    翻译时间:2005-07-18
    版权所有:Copyright ? 2002-2005 Christoph Haas
    翻译和改动未经作者同意。

    最新版本请见:http://workaround.org.

    摘要:
    你可能见过web主机所有者出租虚拟主机让你建立自己域来收发邮件。你想知道他们怎样处理数以千计的域名的?不可能所有域和别名都放在 “main.cf” 配置文件中来手工管理。Postfix 提两个特性来简化工作:
    虚拟域
    除你的本地域外(一般定义在/etc/defaultdomain中),所有收邮件的其它域都称为虚拟域。虚拟域的数量没有限制。
    数据库查询
    你不必将所有用户名和邮件地址存在文本文件中。Postfix支持通常的关系型数据库系统的查询,如MySQL和PostgreSQL. 这个特性非常有用,尤其是你开发基于WEB的GUI管理程序时。你甚至可以允许用户自己管理他们的邮件帐号。

    注意!本指南重新作了修订,虽然我仔细测试过,但仍可能存在bug。如果有疑问,请参考老一点的版本:http://workaround.org/articles/ispmail-sarge/old/,如果你发现错误,请发邮件给:workaround-chitchat@workaround.org.如果你想通过以前的指南来升级,请参考这一节:http://workaround.org/articles/ispmail-sarge/#migrating

    注意!本指南适合于Debian Sarge。如果你运行的是Woody,建议你阅读[http://workaround.org/articles/ispmail/

    本指南介绍了一个邮件系统的基本配置。如果你认真做完本文中的所有步骤后,你将拥有一个可以处理数以千计的域名的和用户的邮件系统。以下是邮件系统能提供的特性:
    POP3/IMAP访问
    WebMail访问
    病毒扫描
    垃圾邮件预防
    安全的邮件中继
    容易的域名管理

    虽然我会给一个简单说明,但以下知识你应预先准备好:
    MySQL(创建数据库,授权用户访问权限和SQL查询语言)
    SMTP,POP3,IMAP(我假定你对这些协议有基本的了解)
    Postfix的基本配置(你应熟悉“mail.cf”配置文件)
    Debian/Linux(你应知道基本的系统管理如安装软件、编辑文本文件)

    目录
    1、需要的软件
    2、什么是映射(mapping)?
    3、虚拟域怎样工作
    4、第一步:安装所需要的Debian 软件包
    5、第二步:创建数据库
    6、第三步:创建表
          domains
          forwordings
          users
    7、第四步:创建数据库映射定义
          mysql-virtual_domains.cf
          mysql-virtual_forwardings.cf
          mysql-virtual_mailboxes.cf
          mysql-virtual_email2email.cf
    8、第五步:创建一个系统用户 vmail
    9、第六步:编辑 main.cf
          一个快速测试
    10、第七步:让Postfix理解SMTP认证
          告诉Postfix使用SASL/MySQL
          使用TLS加密SMTP通信
          一个快速测试
    11、第八步:配置POP3/IMAP服务
          一个快速测试
    12、第九步:测试你的配置
          域
          用户
    13、第十步:增加你的数据
          对于每个新域
          对于每个新用户
          对于邮件转发
    14、扫描病毒和垃圾邮件(可选步骤)
          简介AMaViS
          配置AMaVIS
          告诉Postfix使用AMaViS
          内容过滤怎样工作?
          训练
    15、配置webmail(可选步骤)
    16、用mailman建立邮件列表
    17、问题解决
          错误信息
          MySQL 排错
          在线排错
    18、从以前版本的指南移植
    19、感谢
    20、即将实现的改进
    21、兴趣列表


    1、需要的软件
    整修配置依靠不同的软件组合在一起协调工作。让我们看看都要用到哪些软件:
    Postfix:你的MTA(邮件传递代理)。通过SMTP(简单邮件传输协议)接收邮件并将它们存放在硬盘上的相关位置。
    MySQL:用这个数据库系统中存储的信息来管理Postfix,通常包括用户名、域名、邮件转发地址和口令。
    Courier:Courier象Postfixg一样,是一个单独的邮件服务器。我们只用它的POP3/IMAP部分让用户访问邮箱。
    SASL(Cyrus库):如果你的用户通过其它ISP上网,那么他们的IP地址来自你的网络之外,而邮件服务器只信任来自本地IP地址的访问。SASL(简单认证和安全层)在SMTP中加入认证让邮件服务器能够信任他们。
    AMaViS:一个邮件病毒扫描软件,可以在Postfix中当作内容过滤器使用。它可以在收到的邮件中扫描病毒和垃圾邮件。
    phpmyadmin:一个基于web界面的MySQL管理工具。它比命令行工具更适合初学者使用(译者注:用webmin来管理MySQL也很不错)。

    整个邮件服务器的组成和工作流程如下图所示:
        --------------------------  ---------   ----------------  -------------- 
        | 发邮件到其它邮件服务器 |  | 收邮件 |  | SMTP认证访问 |  | POP3或IMAP |
        --------------------------  ---------   ----------------  --------------
                            ____                                        
                           |\           |           /               /|\
                           | \          |          /               / | \ 
                              \         |         /                  |  
                               \        |        /                   |  
                                \     \ | /   | /                    |  
                                 \     \|/    |/___                  |  
                                                                        
    ----------------               ------------------         --------------               --------------------
    | Cyrus:auprop | <---Socket--- |     Postfix    |         |Courier:pop3| ---Socket---> |Courier:authdaemon|
    ----------------               ------------------         --------------               --------------------
                                                                            
           |                              |                         |                               |
           |                              |                         |                               |
           |                      发邮件给虚拟用户              邮箱访问                            |
           |                              |                         |                               |
           |                              |                         |                               |
           |                              |    ------------------   |                               |
           |                              ---> |    虚拟邮箱    | <---                              |
           |                                   ------------------                                   |
           |                                                                                        |
           |                           ------------------------------------                         |
           ---------MySQL 3306------->
    |                  MySQL           | <-----MySQL 3306---------
                                       ------------------------------------                  

    2、什么是映射(mappings)?                  
    简要的说,映射是将一个值指向另一个值。你可能知道文件:/etc/aliases,其中你可以定义本地域名转发,有一行类似如下:
    postmaster: root
    这将使得给postmaster@your-domain的邮件全部转给root@your-domain.左边的(这里是"postmaster")称为LHS(左侧值),右边的(这里是"root")称为RHS(右侧值)。在讨论映射时一般这样简称。
    提示:通常映射文件左边没有冒号。这个特殊的别名表这所以这样是为了兼容性。同样,本地别名文件不是用postmap而用newalianse编译的。这仅仅是一个(不好的)例子。
    如果你正在以一种快速而不整洁的方式配置Postfix,你多半会从上面那样的文本文件开始。你只需将映射写在里面,然后运行
    postmap filename
    就可以将文本文件转换成一个名为"filename.db"的哈希文件。在Postfix配置中可以用"hash:filename"来访问你建立的映射。你可能注意到缺省的别名映射配置是这样的:
    alias_maps=hash:/etc/aliases
    "hash:"是查询方法。
    在我的配置中,不用文本文件而是使用MySQL数据库表。这使数据处理起来更灵活。但数据库表一般包括两列以上,你需要告诉Postfix哪一列是LHS,哪一列是RHS.这可以定义在一个文本文件中,如下所示:
    user = provider_admin
    password = DomAKg07
    dbname = provider
    table = virtual_mailboxes
    select_field = mailbox
    where_field = email
    hosts = 127.0.0.1
    如果上示文件保存为/etc/postfix/mysql_virtual_mailboxes.cf,你可以使用一个映射:
    virtual_mailbox_maps=mysql:/etc/postfix/mysql_virtual_mailboxes.cf
    映射的LHS被定义为"where_field",RHS被定义为"select_field".在这个例子中,它们分别指向列`email`和列`mailbox`.本例中另一些被定义的元素是:"user"(连接MySQL数据库的用户名),"password"(用户口令),"dbname"(数据库名),"table"(数据库中的表名),"hosts"(运行MySQL的主机名)。

    3、虚拟域怎样工作
    我们先简要介绍一下Postfix 2.x中虚拟域的处理(不赞成使用Postfix 1.x的处理方式),混乱的配置将使你精疲力竭。有两种典型的域:

    本地域:
    所有列在"main.cf"文件中"mydestination"元素中的域都被处理成本地域。你的缺省域(/etc/defaultdomain)一般设定成本地域。给本地域的邮件被交给系统用户(在/etc/passwd中设定)。邮件存放在/var/mail中。
    虚拟域
    邮件服务器可以接收不做声传送给虚拟域的邮件。虚拟域非常灵活。你邮件用户不需要系统帐号(这意味着用户名不需要在/etc/passwd中设定)。所以邮件服务器可以轻而易举的处理数以千计的邮件用户。一个映射 (如上所述)用来存储用户的信息。在我的实例中,我使用MySQL.

    事情有点复杂的是,有两种不同的虚拟域:
    虚拟别名域(Virtual Alias Domains)
    虚拟别名域可以用来把发给一个地址的邮件转发给另一个地址。这样一个域可转为不接收邮件。我不会使用这种类型的虚拟域,因为我会用virtual_alias_maps映射的别名,即使这些域没有列在虚拟别名域中(译者注:这句话没译好,如果感到困惑,不如看原文,现在我同情那些有些译者了:-/)。(virtual_alias_maps是一个多用途映射,对通过系统的所有东西有效,包括本地域。
    虚拟邮箱域( Virtual Mailbox Domains)
    虚拟邮箱域可以接收这些域用户的邮件,放在硬盘中的邮箱目录中。仍然可以用virtual_alias_maps来转发邮件到别的邮箱或外部邮件地址,因些不是域中的每个用户都有一个真实的邮箱,可以只有一个邮件转发地址。这仅仅是一个参数用来告诉Postfix如何处理这些域。顺便说一句,virtual_mailbox_maps映射一般用来确定硬盘上邮箱的位置。

    理解一个域要么是虚拟别名域要么是虚拟邮箱域要么是本地域是非常重要的。如果将一个域设定为虚拟别名域,是不能使用这些域接收邮件的。正相反,可以用virtual_alias_maps为两者转发邮件。所以虚拟邮箱域通常更灵活。

    注意!一个域要么是虚拟要么是本地的,不能两者都是!所以如果想使本地域通过虚拟域管理,要将它从mydestination定义中删除。将mydestination设定为空或者是:"mydestination=localhost"。给地址类似于root@localhost的邮件将交付给本地root用户。

    建议你及早关于虚拟域的原始文档,他们在VIRTUAL_README文件中,这个文件在postfix-doc包中,可以在/usr/share/doc/postfix/VIRTUAL_README.gz中找到。

    4、第一步:安装需要的Debian软件包
    绝对需要的软件包有:
      postfix (Choose: "No configuration",安装时选择:“不配置”)
      postfix-mysql
      postfix-doc
      mysql-client (for MySQL 3.x/4.0) or mysql-client-4.1 (for MySQL4.1)

    如果你是在同一台机器上安装MySQL服务器,需要:
      mysql-server (for MySQL 3.x/4.0) or mysql-server-4.1 (for MySQL4.1)

    如果想通过POP3/IMAP访问,需要:
      courier-authdaemon
      courier-authmysql
      courier-pop (for unencrypted POP3 access)
      courier-pop-ssl (for SSL-encrypted POP3 access)
      courier-imap (for unencrypted IMAP access)
      courier-imap-ssl (for SSL-encrypted IMAP access)

    如果想通过认证SMTP发邮件,需要:
      postfix-tls (加密认证SMTP)
      libsasl2 (the Cyrus SASL library)
      libsasl2-modules (the mechanisms for the SASL library)
      libsasl2-modules-sql
      openssl (创建证书)

    如果要扫描病毒和垃圾邮件,需要:
      amavisd-new
      spamassassin
      clamav
      clamav-daemon
      zoo
      unzip
      unarj
      lha (非自由软件!)
     
    如果要提供Webmail需要:
       sqwebmail
    译者加:sqwebmail不太好用,推荐使用:
      squirrelmail

    可选的软件包:
       phpmyadmin(PHP写的用于MySQL数据库的管理)
      
    5、第二步: 创建数据库
    需要创建一个数据库用来存储表。如果你是MySQL老手,当然可以用命令行的方式操作,我一般用phpmyadmin来管理MySQL。它能胜任这项任务。
    提示:数据库服务器在刚安装好后,root用户是没有口令的,安全起见,要先加上口令:
    mysqladmin -u root password geheimes-passwort

    首先创建一个数据库。我命名为'provider',因为除了电子邮件,我有别的用途(不在本文讨论范围之内)。可以在phpmyadmin下做,也可在命令行下运行
    mysqladmin -u root -p create provider
    还需要一个用户有足够的权限访问数据库。在命令行下建立一个数据库连接:
    mysql -u root -p
    看到mysql>
    提示符后,输入SQL命令:
    grant select on provider.* to provider_admin@localhost identified by 'your-password';
    这将创建一个名为 provider_admin 的数据库用户,对 provider 数据库有 'SELECT' 权限。记得用你自己的口令替换 your-password 。我用 'pwgen -s 16'命令自动产生口令。最后需要重载许可信息,在mysql>提示符下输入:
    flush privileges;

    6、第三步: 创建表
    接着要在数据库中创建一系列的表来存储postfix的控制信息。

    domains
    第一个表只有一列用于存储虚拟域名,一行一个虚拟域,用SQL语句来建立:
    CREATE TABLE domains (
    domain varchar(50) NOT NULL,
    PRIMARY KEY (domain),
    UNIQUE KEY domain (domain) )
    TYPE=MyISAM;

    forwardings
    表'forwardings'用于建立电子邮件地址的别名。可以用这个表来重定向邮件地址。(提示:这个对本地域也有效)。建立表的SQL语句是:
    CREATE TABLE forwardings (
    source varchar(80) NOT NULL,
    destination TEXT NOT NULL,
    PRIMARY KEY (source) )
    TYPE=MyISAM;

    users
    最后一个表 'users'包含了用户帐户信息。通过POP3和IMAP讯问邮箱的用户都得有一个用户名和口令。由于用户总是健忘的(瞧瞧你的老板,他的口令可能就放在键盘下),我决定用电子邮件地址作为登录名。电子邮件地址还用于磁盘上邮件目录命名。这个表只要两列就够了。建立表的SQL也很简单:
    CREATE TABLE users (
    email varchar(80) NOT NULL,
    password varchar(20) NOT NULL,
    UNIQUE KEY email (email)
    ) TYPE=MyISAM;

    7、第四步:创建数据库映射定义
    为了告诉postfix控制信息存储在数据库的什么地方,需要在/etc/postfix目录下建立三个文本文件。
    postfix在chroot环境中运行(/var/spool/postfix),不能访问除这个目录以外的其它文件。我们通常通过套接字文件/var/run/mysqld/mysqld.sock与MySQL通讯。而这个文件postfix访问不到。所以要么将这个套接字文件移个位置(这会带来别的问题),要么使用TCP协议来通讯。后者意味着要通过网络与MySQL通讯,这样做的好处是不用关心chroot环境的限制。一个不太严重的坏处是:通过lo界面访问MySQL服务器,理论上说有安全问题。为了激活MySQL的网络连接,要在/etc/mysql/my.cnf文件中插入一行"bind-address = 127.0.0.1",然后重启MySQL服务器(在本文的下一个版本中,我会介绍一种非常漂亮的“绑定装载”方式,通过在 /etc/fstab中实现MySQL套接字)。

    mysql-virtual_domains.cf
    这是一个简单的映射:从虚拟域名(LHS)到字符串'virtual'(RHS)。这个映射用于定义virtual_mailbox_domains(右边的字符串可以是任何东西,如果你愿意可设定为"banana daiquiri")。
    创建这个文件,并且用你的数据库服务器名、数据库用户名和口令替换 '...' 。不要用"localhost"作为服务器名,否则Postfix会试图使用套接字方式来与MySQL通讯。如果数据库服务器在同一台服务器运行,127.0.0.1意味着通过TCP/IP通讯。mysql-virtual_domains.cf文件内容如下:
    user = provider_admin
    password = ...
    dbname = provider
    table = forwardings
    select_field = destination
    where_field = source
    hosts = 127.0.0.1

    mysql-virtual_mailboxes.cf
    这个映射读取'forwardings'表,规定了邮件重定向。它仅仅映射了 'source' 列和'destination'列。用在virtual_alias_maps映射中。文件内容如下:
    user = provider_admin
    password = ...
    dbname = provider
    table = forwardings
    select_field = destination
    where_field = source
    hosts = 127.0.0.1

    mysql-virtual_mailboxes.cf
    这个文件定义了用户邮箱。告诉了Postfix特定的邮件存在什么地方。将用它来映射virtual_mailbox_maps。对于给定的'email'地址(LHS),Postfix通过'mailbox'列(RHS)来寻找。select_field行用来将'user@domain.net'形式的电子邮件地址转换成目录'domain.net/user/'--用户邮箱的存储位置。最后要包含一个斜线,这样Postfix将创建一个邮箱目录,而不是一个邮件文件。这在随后的Courier POP3和IMAP服务中用得到。mysql-virtual_mailboxes.cf文件如下:
    user = provider_admin
    password = ...
    dbname = provider
    table = users
    select_field = CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
    where_field = email
    hosts = 127.0.0.1

    mysql-virtual_email2email.cf
    虚拟域映射virtual_alias_maps是优先的。当你想用一个地址包罗万象时很有用。(“包罗万象”指你想使用以下的转发方式:"@domain.com"->"service@domain.com",将用一个地址接收所有给这个域的邮件。)如果在virtual_alias_maps中映射了域@domain.com,那么即使特定地址specific.user@domain.com在 virtual_mailbox_maps中也做过映射,也是不起作用的,所有邮件将仍会传递给 @domain.com在virtual_alias_maps中指定的地址。
    这个文件可以通过将user表中的电子邮件地址映射给自己解决这个问题:
    user = provider_admin
    password = ...
    dbname = provider
    table = users
    select_field = email
    where_field = email
    hosts = 127.0.0.1

    注意:确定除了root用户外,其它人不能读这些文件!否则你系统的其它用户可以看到明码方式的数据库用户和口令。运行"chmod o= /etc/postfix/mysql-virtual_*.cf"取消其它用户的权限。也可以针这些文件的组属性调为postfix,运行 "chgrp postfix /etc/postfix/mysql-virtual_*.cf" 即可。

    8、第五步:创建一个vmail系统用户
    系统可能要处理数以千计的用户。不可能给每个用户一个唯一的UID。我建议创建一个假冒的用户拥有所有邮箱。
    用root身份在命令行下运行以下命令:
    groupadd -g 5000 vmail
    useradd -g vmail -u 5000 vmail -d /home/vmail -m

    9、第六步: 编辑main.cf文件
    /etc/postfix/main.cf 是Postfix主要配置文件。我这里只给出虚拟域需要的基本配置。不要将main.cf全清除了,因为里面可能还有你的其它配置信息。
    设置                                                     含义
    myhostnames = ...                                  确保这里是全限定的域名。

    mydestination = ...                                列出本地域名,用分号隔开,不要将虚拟域名列在这里。

    mynetworks = ...                                  列出可以通过邮件服务器发送邮件的IP地址范围,很可能就是本地网络。

    virtual_alias_domains =                            不要设置这个参数,我们不会使用虚拟别名域。为了与老版本兼容,
                                                      可将值设置为virtual_alias_maps
                                                     
    virtual_alias_maps =                               这个参数用于重定向表。可将一个邮件地址重定向到其它地址,
    mysql:/etc/postfix/mysql-virtual_forwardings.cf   甚至将一个域的所有邮件地址重定向到一个指定的邮件地址。
    mysql:/etc/postfix/mysql-virtual_email2email.cf    信息存于'forwardings'表中。每一个LHS邮件地址被重写为RHS中显示的
                                                      地址。如果有多个目标地址,可以在一条记录中用逗号分隔。我也用
                                                      mysql-virtual_email2email.cf映射将邮件地址指向自己。这看上去有点
                                                      愚蠢,但的确需要,当你想使用一个包罗万象的地址时。
                                                      参见前面对mysql-virtual_email2email.cf的说明。
                                                     
    virtual_mailbox_domains =                         这个参数从`domains`中列出了虚拟邮箱域
    mysql:/etc/postfix/mysql-virtual_domains.cf

    virtual_mailbox_maps =                             这是另一个重要的虚拟邮箱映射。它将电子邮件地址(LHS)映射到本地硬
                                                      盘中。
    mysql:/etc/postfix/mysql-virtual_mailboxes.cf      邮箱目录相对于virtual_mailbox_base。

    virtual_mailbox_base = /home/vmail                这是用户邮箱在硬盘上的基目录。

    virtual_uid_maps = static:5000                    要告诉邮箱所有者的UID,就是前面创建的vmail。

    virtual_gid_maps = static:5000                    同上,vmail的GID

    smtpd_sasl_auth_enable = yes                      使SMTP需要认证。

    broken_sasl_auth_clients = yes                    一些做得不太好的邮件客户端,如M$ OutLook,使用一种不赞成的方式来搜                                                      索需要认证SMTP的邮件服务器,这个参数是为了满足他们。嗯?谁在说
                                                      OutLook的坏话:)
    smtpd_recipient_restrictions =                     这个参数限制了谁可以用你的邮件服务器中继和转发邮件。
    permit_mynetworks,                                 permit_mynetworks允许本地网络的所有用户都可以使用。
    permit_sasl_authenticated,                         permit_sasl_authenticated允许那些通过认证SMTP登录的用户可以使用。
    reject_unauth_destination                          最后一个值reject_unauth_destination指出除relay_domains中列出的域外
                                                      都不允许。

    smtpd_use_tls = yes                                用ssl加密认证SMTP会话

    smtpd_tls_cert_file = /etc/postfix/smtpd.cert      TLS需要的ssl证书位置(我们稍后会创建的)

    smtpd_tls_key_file = /etc/postfix/smtpd.key        TLS需要的ssl私钥位置

    最后做一个快速测试:
    运行postfix reload 和 postfix check。如果没有警告和错误,这一部分就做完了。

    10、第七步: 让Postfix理解认证的SMTP(Auth-SMTP)
    设想用户通过POP3来取邮件,然后需要通过邮件服务器回信。由于安全原因,Postfix只允许用户在mynetworks中定义的位置发邮件。通常邮件服务器只用于接收自己域的邮件。如果允许每个人通过邮件服务器发邮件给任何域,这称为open relay,垃圾邮件制造者就可以通过你的邮件服务器发送大量数字垃圾。所以要求远程用户提供用户名和口令。如果认证通过,远程用户也可以象本地网络用户一样被信任。大多数邮件客户端都有这个功能。
    设置认证SMTP非常简单。唯一的问题是Debian是在chroot环境中运行Postfix的,缺省的是在 /var/spool/postfix中。

    告诉Postfix使用SASL/MySQL
    Postfix采用Cyrus SASL库来实现认证SMTP。需要告诉Postfix怎样访问到存储了用户名和口令的数据。很简单,创建一个/etc/postfix/sasl目录,将SASL配置文件放在这就可以了:
    mkdir /etc/postfix/sasl
    在这个目录下创建一个smtpd.conf文件,内容如下所示:
    pwcheck_method: auxprop
    auxprop_plugin: sql
    mech_list: plain login cram-md5 digest-md5
    sql_engine: mysql
    sql_hostnames: 127.0.0.1
    sql_user: provider_admin
    sql_passwd: ...
    sql_database: provider
    sql_select: select password from users where email='%u@%r'
    如果在配置SASL 时有麻烦,可以在此处加入一行"log_level: 7",使得日志文件中提供便详细的信息,帮助查找问题所在。

    使用TLS加密SMTP通信
    加密SMTP会话也很重要。如果邮件客户端不加密的认证方法,用户名和口令会用很不安全的方式传输。所以建议用TLS加密通信。TLS是Transport Layer Security (RFC2246)的缩写,在邮件服务器与外界的连接中,使用SSL(Secure Socket Layer)来加密。
    首先需要一个SSL证书。如果不想从认证中心购买,可以自己签署一个。(个人意见:我想知道购买的怎样会更安全。)唯一的不足是:邮件客户端不知道你的CA(认证授权)哪里来,会弹出一个警告。告诉用户要么不理睬这个警告,要么在计算机中安装这个证书。(Outlook不允许不理睬他不知道的CA。需要安装证书才能继续工作。)
    要针对主机smtp.domain.tld制作一个一年期的证书,可以执行以下命令:
    openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509
    运行过程中会问几个问题,填几个空,不必在意,随便输入一点什么即可。唯一的例外是,当问你"Common Name" (主机名)时,必须填写邮件服务器的主机名。下面是会话示例:
    Country Name (2 letter code) [AU]:DE
    State or Province Name (full name) [Some-State]:Hamburg
    Locality Name (eg, city) []:Hamburg
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:workaround.org email services
    Organizational Unit Name (eg, section) []:Master of Disaster
    Common Name (eg, YOUR name) []:smtp.domain.tld
    Email Address []:postmaster@domain.tld
    等一会儿,当前目录下会产生两个文件:"smtpd.key"(私钥文件),"smtpd.cert"(证书)。将两个文件移到目录/etc/postfix中。
    注意!私钥文件任何人不能读!用以下命令取消其它用户的权限:
    chmod o= /etc/postfix/smtpd.key

    再次快速测试一下
    运行postfix reload重启Postfix。运行telnet localhost 25,输入EHLO anywhere.org,应该可以看到一行:250-STARTTLS。干杯!TLS运行起来了!。

    11、第八步:配置POP3/IMAP服务
    现在设置过程的大部分完成了,再接再厉!当然,到现在为止,用户还不能访问他们的邮箱,这得先配置POP3或者IMAP服务。首先需要编辑/etc/courier/authdaemonrc,将认证模块变为"authmysql":
    authmodulelist="authmysql"
    然后在/etc/courier/authmysqlrc文件中定义MySQL数据库表中的一个字段:
    MYSQL_SERVER localhost
    MYSQL_USERNAME provider_admin
    MYSQL_PASSWORD ...
    MYSQL_PORT 0
    MYSQL_DATABASE provider
    MYSQL_USER_TABLE users
    #MYSQL_CRYPT_PWFIELD (comment this out)
    MYSQL_CLEAR_PWFIELD password
    MYSQL_UID_FIELD 5000
    MYSQL_GID_FIELD 5000
    MYSQL_LOGIN_FIELD email
    MYSQL_HOME_FIELD "/home/vmail"
    MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
    #MYSQL_NAME_FIELD (comment this out)
    仔细点,authmysqlrc模块非常挑剔。确保不是用TAB代替空格分隔,并且每行没有尾部空格。最后记得重启认证进程:/etc/init.d/courier-authdaemon restart。

    第三次快速测试
    试试通过运行telnet localhost pop3访问一下POP3服务。应该可以看到"+OK Hello there."。瞧,这下你的用户差不多可以使用你的邮件服务器了。

    注意!邮箱里至少有一封信才能收邮件,否则用户会得到一个含糊不清的错误信息。所以建议对每一个新用户发一封欢迎信。

    12、第九步:测试整个设置
    祝贺你!整个设置完成了。现在整个来试试。现在在数据库中创建第一个虚拟域记录,试试虚拟域。在相应的数据库表中创建以下行:
    domains:
    Column    Value
    domain    virtual.test

    users:
    Column    Value
    email      [email]user@virtual.test[/email]
    password  secret
    这意味着有一个虚拟域名为"virtual.test",一个用户的邮件地址为 "user@virtual.test"(也是他的用户名)。用户的口令为:"secret"。如果没有MX记录(邮件交换-DNS区域的一部分),就需要手工递送邮件。与邮件服务器建立一个SMTP连接(telnet servername 25),输入SMTP命令。如下表,左边是SMTP服务器的提示,右边是输入的命令:

    服务器提示                                                    你的输入
    220 myserver ESMTP Postfix (Debian/GNU)
                                                                  ehlo workaround.org
    250-mailtest
    250-PIPELINING
    250-SIZE 10240000
    250-VRFY
    250-ETRN
    250-STARTTLS
    250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5
    250-AUTH=LOGIN PLAIN DIGEST-MD5 CRAM-MD5
    250 8BITMIME
                                                                  mail from:<test@workaround.org>
    250 Ok
                                                                  rcpt to:<user@virtual.test>
    250 Ok
                                                                  data
    354 End data with <CR><LF>.<CR><LF></LF></CR></LF></CR>
                                                                  This is a test email.
                                                                  .
    250 Ok: queued as ABC1D1C123
                                                                  quit
    221 BYE

    如果服务器的反应和上面一样,那么邮件就被接收了。在日志文件/var/log/mail.log中,可以看到这么一段:
    Jul 24 21:48:28 myserver postfix/smtpd[9119]: connect from myserver[127.0.0.1]
    Jul 24 21:48:48 myserver postfix/smtpd[9119]: F2C1B47BD: client=myserver[127.0.0.1]
    Jul 24 21:48:52 myserver postfix/cleanup[9144]: F2C1B47BD: message-id=<20040724194842.F2C1B47BD@myserver>
    Jul 24 21:48:52 myserver postfix/qmgr[9117]: F2C1B47BD: from=<test@workaround.org>, size=313, nrcpt=1 (queue active)
    Jul 24 21:48:52 myserver postfix/virtual[9148]: F2C1B47BD: to=<user@virtual.test>, relay=virtual, delay=10, status=sent (delivered to maildir)

    如果能读到 "status=sent (delivered to maildir)",说明邮件成功递送了。运行命令find /home/vmail,看看所有子目录和文件,应该如下所示:
    /home/vmail/virtual.test
    /home/vmail/virtual.test/user
    /home/vmail/virtual.test/user/tmp
    /home/vmail/virtual.test/user/cur
    /home/vmail/virtual.test/user/new
    /home/vmail/virtual.test/user/new/1114511715.V801I7400b.my.server
    所有的东西是不是如我描述的一样工作?如果没问题,要试试用邮件客户端通过POP3或IMAP(取决于安装了哪个服务)收一下邮件。接收邮件的用户名就是他的邮件地址"user@virtual.test",口令是"secret"。

    13、第十步:添加数据库记录
    现在测试通过了,可以配置自己的域和用户了。先解释一下在数据库中要添加一些什么。

    对每一个新的域:
    在'domains'表中增加域名。

    对每一个新用户:
    在'users'表中增加一行,包括邮件地址和口令(用纯文本)。

    对每一个新邮件重定向:
    在forwardings'中新增一行,包括源地址和目的地址。如果有多个目的地址(如简单邮件列表),需要在这一行的相应字段中列出所有地址,用逗号隔开。提示:这个表用来过滤途经系统的所有邮件,所以本地邮件也可在这里重定向。
    举例:

    源                    目的                  效果
    postmaster@my.domain  philip@my.domain      将给postmaster的邮件重定向到philip。
    @my.domain            john@my.domain        将给域my.domain的所有邮件重定向到john。这个对`email`表中的用户无效,
                                                例如tina@my.domain,因为一个域中的特定用户总是比一个“包罗万象”的帐
                                                号有更高的优先权。
    @my.domain            @another.domain        这是整个域的重定向。域my.domain中的每一个地址被重定向到
                                                域another.domain的相应地址中。例如:julie@my.domain被重定向到
                                                julie@another.domain。
    jesper@my.domain      dilbert@my.domain      将递送给esper@my.domain的邮件重定向到两个地址,每个地址都有一个拷贝。
                          ,dilbert@gmail.com 
  • 相关阅读:
    Leetcode Binary Tree Level Order Traversal
    Leetcode Symmetric Tree
    Leetcode Same Tree
    Leetcode Unique Paths
    Leetcode Populating Next Right Pointers in Each Node
    Leetcode Maximum Depth of Binary Tree
    Leetcode Minimum Path Sum
    Leetcode Merge Two Sorted Lists
    Leetcode Climbing Stairs
    Leetcode Triangle
  • 原文地址:https://www.cnblogs.com/licheng/p/1050066.html
Copyright © 2020-2023  润新知