在CentOS 6上使用Postfix,Dovecot和MySQL发送电子邮件

Postfix 邮件传输代理(MTA)是一种高性能的开源电子邮件服务器系统。本指南将帮助你在CentOS 6 Linode上运行 Postfix,使用 Dovecot 运行 IMAP / POP3 服务,使用 MySQL 存储有关虚拟域名和用户的信息。

在使用本指南之前,请确保你已按照入门指引进行操作并设置主机名。

注意 本指南中的步骤需要 root 权限。请务必执行 root 命令,或使用 su - root 以 root 用户身份登录。以下某些命令无法执行 sudo,必须以 root 身份运行。

安装必需的包

1.安装任何未完成的包更新:

yum update

2.CentOS 主存储库中包含的 Postfix 版本不包括对 MySQL 的支持; 因此,你需要从 CentOS Plus 存储库安装 Postfix。在此之前,为 Postfix 包添加排除到 [base][updates] 存储库中以防它从没有支持 MySQL 的更新中被改写:

/etc/yum.repos.d/CentOS-Base.repo1 2 3 4 5 6 7 8
[base] name=CentOS-$releasever - Base exclude=postfix  # released updates [updates] name=CentOS-$releasever - Updates exclude=postfix

3.安装所需的包:

yum --enablerepo=centosplus install postfix yum install dovecot mysql-server dovecot-mysql

上述命令会安装 Postfix 邮件服务器,MySQL 数据库服务器,Dovecot IMAP 和 POP 守护程序,以及几个提供与身份验证相关服务的支持包。

接下来,设置 MySQL 数据库来处理虚拟域名和用户。

为虚拟域名和用户设置MySQL

1.配置 MySQL 在开机时启动,然后启动 MySQL:

chkconfig mysqld on service mysqld start

2.执行命令 mysql_secure_installation。你将有机会更改 MySQL root 密码,删除匿名用户帐户,禁用 localhost 之外的 root 登录,删除测试数据库以及重载权限表。建议你对这些选项回答 “yes”:

mysql_secure_installation

3.启动 MySQL shell:

mysql -u root -p

4.为邮件服务器创建一个数据库并切换到该数据库:

CREATE DATABASE mail; USE mail;

5.创建一个名为 mail_admin 邮件管理用户,并授予其对 mail 数据库的权限。请务必将mail_admin_password使用强密码替换:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';
FLUSH PRIVILEGES;

6.创建虚拟域表:

CREATE TABLE domains (domain varchar(50) NOT NULL, PRIMARY KEY (domain) );

7.创建一个表来处理邮件转发:

CREATE TABLE forwardings (source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );

8.创建 users表:

CREATE TABLE users (email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email) );

9.创建 transport 表:

CREATE TABLE transport ( domain varchar(128) NOT NULL default '', transport varchar(128) NOT NULL default '', UNIQUE KEY domain (domain) );

10.退出MySQL shell:

quit

11.编辑 /etc/my.cnf 将 MySQL 绑定到 localhost(127.0.0.1),并将以下内容添加到文件中的[mysqld]部分:

# /etc/my.cnf
bind-address=127.0.0.1

这是 Postfix 能够与数据库服务器通信所必需的。如果你将 MySQL 设置为侦听另一个IP地址(例如内部IP),则需要在 Postfix 配置步骤中替换 IP 地址 127.0.0.1建议在可公开访问的 IP 地址上运行MySQL。

12.重启数据库服务器:

service mysqld restart

接下来,执行其他 Postfix 配置以设置与数据库的通信。

配置 Postfix 以使用MySQL

注意 对于接下来的四个步骤,请将 mail_admin_password 替换为之前输入的mail_admin密码。

1.为 Postfix 创建一个名为 /etc/postfix/mysql-virtual_domains.cf 的虚拟域配置文件:

# /etc/postfix/mysql-virtual\_domains.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain='%s'
hosts = 127.0.0.1

2.为 Postfix 创建一个名为 /etc/postfix/mysql-virtual_forwardings.cf 的虚拟转发文件:

# /etc/postfix/mysql-virtual\_forwardings.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1

3.为 Postfix 创建一个名为 /etc/postfix/mysql-virtual_mailboxes.cf 的虚拟邮箱配置文件:

# /etc/postfix/mysql-virtual\_mailboxes.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT CONCAT(SUBSTRING_INDEX(email,<'@'>,-1),'/',SUBSTRING_INDEX(email,<'@'>,1),'/') FROM users WHERE email='%s'
hosts = 127.0.0.1

4.为 Postfix 创建一个名为 /etc/postfix/mysql-virtual_email2email.cf 的虚拟电子邮件映射文件:

# /etc/postfix/mysql-virtual\_email2email.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT email FROM users WHERE email='%s'
hosts = 127.0.0.1

5.为这些配置文件设置合适的权限和所有权:

chmod o= /etc/postfix/mysql-virtual_*.cf
chgrp postfix /etc/postfix/mysql-virtual_*.cf

6.为邮件处理任务创建用户和组。所有虚拟邮箱都将存储在此用户的主目录下:

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m

7.完成 Postfix 配置所需的剩余步骤。请确保将 server.example.com 替换为 Linode 的完全合规的域名。如果你计划使用自己的 SSL 证书和密钥,请使用相应的路径替换/etc/pki/dovecot/private/dovecot.pem

postconf -e 'myhostname = server.example.com'
postconf -e 'mydestination = $myhostname, localhost, localhost.localdomain'
postconf -e 'mynetworks = 127.0.0.0/8'
postconf -e 'inet_interfaces = all'
postconf -e 'message_size_limit = 30720000'
postconf -e 'virtual_alias_domains ='
postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'
postconf -e 'virtual_mailbox_base = /home/vmail'
postconf -e 'virtual_uid_maps = static:5000'
postconf -e 'virtual_gid_maps = static:5000'
postconf -e 'smtpd_sasl_type = dovecot'
postconf -e 'smtpd_sasl_path = private/auth'
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'broken_sasl_auth_clients = yes'
postconf -e 'smtpd_sasl_authenticated_header = yes'
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtpd_tls_cert_file = </etc/pki/dovecot/certs/dovecot.pem'
postconf -e 'smtpd_tls_key_file = </etc/pki/dovecot/private/dovecot.pem'
postconf -e 'virtual_create_maildirsize = yes'
postconf -e 'virtual_maildir_extended = yes'
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'
postconf -e 'virtual_transport = dovecot'
postconf -e 'dovecot_destination_recipient_limit = 1'

8.编辑文件 /etc/postfix/master.cf 并将 Dovecot 服务添加到文件的底部:

# /etc/postfix/master.cf
dovecot   unix  -       n       n       -       -       pipe
    flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}

9.配置 Postfix 在开机时启动,并首次启动服务:

chkconfig postfix on service postfix start

这样就完成了 Postfix 的配置。

配置 Dovecot

1.将 /etc/dovecot/dovecot.conf 移至备份文件中:

mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf-backup

2.将以下内容复制到新建的空文件 dovecot.conf,在第37行中把 example.com 替换成系统的域名:

# /etc/dovecot/dovecot.conf 
protocols = imap pop3
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_location = maildir:/home/vmail/%d/%n/Maildir

ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
ssl_key = </etc/pki/dovecot/private/dovecot.pem

namespace {
    type = private
    separator = .
    prefix = INBOX.
    inbox = yes
}

service auth {
    unix_listener auth-master {
        mode = 0600
        user = vmail
    }

    unix_listener /var/spool/postfix/private/auth {
        mode = 0666
        user = postfix
        group = postfix
    }

user = root
}

service auth-worker {
    user = root
}

protocol lda {
    log_path = /home/vmail/dovecot-deliver.log
    auth_socket_path = /var/run/dovecot/auth-master
    postmaster_address = postmaster@example.com
}

protocol pop3 {
    pop3_uidl_format = %08Xu%08Xv
}

passdb {
    driver = sql
    args = /etc/dovecot/dovecot-sql.conf.ext
}

userdb {
    driver = static
    args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
}

3.MySQL 将用于存储密码信息,因此必须创建 /etc/dovecot/dovecot-sql.conf.ext。将以下内容插入文件,确保将 mail_admin_password 替换为你的邮件密码:

# /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=127.0.0.1 dbname=mail user=mail_admin password=mail_admin_password
default_pass_scheme = CRYPT
password_query = SELECT email as user, password FROM users WHERE email='%u';

4.限制文件访问, 通过更改权限以允许 dovecot 组中的用户访问该文件,同时拒绝其他用户访问:

chgrp dovecot /etc/dovecot/dovecot-sql.conf.ext
chmod o= /etc/dovecot/dovecot-sql.conf.ext

5.配置 Dovecot 在开机时启动,并首次启动 Dovecot:

chkconfig dovecot on service dovecot start

6.检查日志 /var/log/maillog 以确保 Dovecot 的启动没有错误。你的日志中应该具有类似于以下内容的文本:

Mar 18 15:21:59 sothoryos postfix/postfix-script[3069]: starting the Postfix mail system
Mar 18 15:22:00 sothoryos postfix/master[3070]: daemon started -- version 2.6.6, configuration /etc/postfix
Mar 18 15:32:03 sothoryos dovecot: master: Dovecot v2.0.9 starting up (core dumps disabled)

7.测试你的 POP3 服务器以确保它正常运行:

yum install telnet telnet localhost pop3

8.终端应该会输出类似下方的结果:

Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
+OK Dovecot ready.

9.输入命令 quit 返回 shell。这样就完成了 Dovecot 的配置。接下来,确保别名(aliases)得到正确配置。

测试邮箱别名

1.编辑 /etc/aliases 确保 postmasterpostmaster 指令已为你的组织正确设置。

postmaster: root
root: postmaster@example.com

2.更新别名并重启 Postfix

newaliases
service postfix restart

到此完成别名配置。下一步请测试 Postfix 以确保它正常运转。

测试 Postfix

1.为 SMTP-AUTH 和 TLS 测试 Postfix:

telnet localhost 25

2.如果尚处于连接状态, 请发出以下命令:

ehlo localhost

3.你将看到类似下方的输出:

250-hostname.example.com
250-PIPELINING
250-SIZE 30720000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN
250-AUTH=PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

4.发送 quit 命令以终止远程登录连接。

下一步,在 MySQL 数据库中添加域名和邮件用户。

设置并测试域名和用户

注意 在进行下面的步骤之前,通过添加指向邮件服务器的完全限定域名的 MX 记录,修改你希望处理的电子邮件的任何域名的DNS记录。如果你希望处理的电子邮件域名已存在 MX 记录,请删除它们或将它们设置为比邮件服务器更高的优先级。较小的优先级数字表示邮件传递的优先级较高,“0”是最高优先级。

在下方示例中,MySQL shell 用于添加对域名为 “example.com” 的支持,该域名将会有名为 “sales” 的电子邮件帐户。

1.登录 MySQL shell

mysql -u root -p

2.切换到 mail 数据库,添加对你域名的支持,并创建一个电子邮件帐户。请务必将 example.com 替换为你的域名,将 sales@example.com 替换为你所选择的电子邮箱,并用强密码替换 password

USE mail;
INSERT INTO domains (domain) VALUES ('example.com');
INSERT INTO users (email, password) VALUES ('sales@example.com', ENCRYPT('password'));
quit

3.在访问任何新创建的电子邮件帐户之前,需要发送测试邮件以创建该用户的邮箱:

yum install mailx
mailx sales@example.com

按下 Ctrl+D 键结束消息。你可以安全地让Cc:字段留白。这样就完成了新域名和电子邮件用户的配置。

注意 考虑到在单个邮件系统上虚拟托管大量域名的可能性,电子邮件地址的用户名部分(即在@符号之前的部分)不足以进行认证。当电子邮件用户向服务器进行身份验证时,他们必须提供上面创建的完整电子邮件地址作为用户名。

检查你的日志

测试邮件发送之后, 检查邮件日志以确保邮件已传送。

1.检查位于/var/log/maillog 的邮件日志。你将会看到类似下方的内容:

Mar 18 15:39:07 server postfix/cleanup[3252]: 444E34055: message-id=<20150318153907.444E34055@server.example.com>
Mar 18 15:39:07 server postfix/qmgr[3218]: 444E34055: from=<root@server.example.com>, size=489, nrcpt=1 (queue active)
Mar 18 15:39:07 server postfix/pipe[3258]: 444E34055: to=<sales@example.com>, relay=dovecot, delay=0.09, delays=0.04/0.01/0/0.05, dsn=2.0.0, sta$
Mar 18 15:39:07 server postfix/qmgr[3218]: 444E34055: removed

2.检查位于/home/vmail/dovecot-deliver.log的 Dovecot 传送日志。你将会看到类似下方的内容:

deliver(<sales@example.com>): 2011-01-21 20:03:19 Info: msgid=\<<20110121200319.E1D148908@hostname.example.com>>: saved mail to INBOX

现在你可以测试看你的电子邮件服务器用户会通过他们的邮件客户端看到什么。

测试邮箱

1.要测试名为 sales@example.com 的邮箱,请导航到邮箱目录/home/vmail/example.com/sales/Maildir 并发出以下命令:

cd /home/vmail/example.com/sales/Maildir find

2.你应该会看到类似下方内容的输出:

.
./dovecot-uidlist
./cur
./new
./new/1285609582.P6115Q0M368794.li172-137
./dovecot.index
./dovecot.index.log
./tmp

3.使用邮件客户端测试邮箱。对于此测试,建议使用mutt。如果默认情况下未安装,请键入 yum install mutt 命令安装,然后运行命令:

mutt -f .

系统可能会提示你创建根邮箱。这并不是必需的。

4.如果收件箱中有电子邮件,则已成功配置 Postfix、Dovecot 和 MySQL!退出 mutt 请按q

更多信息

有关本主题的更多信息, 请参考以下资源。我们希望所提供的这些资料是有用的,但请注意,我们无法保证外部托管材料的准确性或及时性。

本文的版权归 FesonX 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据和云

深入原理:Consistent Reads 与 buffer cache

黄玮(Fuyuncat) 资深Oracle DBA,个人网www.HelloDBA.com,致力于数据库底层技术的研究,其作品获得广大同行的高度评价. 编辑手记...

3657
来自专栏乐沙弥的世界

MySQL 二进制日志(Binary Log)

    同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分。MySQL有几种不同的日志文件,通常包括错误日志文件,二进制日志,通用日志,慢查询日...

1112
来自专栏LanceToBigData

MySQL(十四)之数据备份与还原

前言   上一篇分享了关于MySQL事务的知识,在我们数据库中最重要的就是数据了,所以数据的备份就显的特别的重要!   为什么要备份数据?   在生产环境中我们...

28010
来自专栏CodingToDie

MySQL MVCC(多版本控制)

1. MySQL 中的事务 MySQL 提供了两种事务型的存储引擎:InnoDB 和 NDB Cluster 。另外还有一些第三方存储引擎也支持事务 1. My...

3687
来自专栏L宝宝聊IT

Mysql5.7——分表和分区

mysq中有一种机制是表锁定和行锁定,是为了保证数据的完整性。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的s...

8075
来自专栏文渊之博

解决session阻塞的问题

简介     对于数据库运维人员来说创建session或者查询时产生问题是常规情况,下面介绍一种很有效且不借助第三方工具的方式来解决类似问题。 最近开始接触运维...

2035
来自专栏JAVA高级架构

关于 MySQL 的知识点与面试常见问题都在这里

img垂直拆分的优点: 可以使得行数据变小,在查询时减少读取的Block数,减少I/O次数。此外,垂直分区可以简化表的结构,易于维护。 垂直拆分的缺点: 主键会...

2013
来自专栏Danny的专栏

PL/SQL和SQLPLUS查询结果不一样——千万别忘记commit !

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

1592
来自专栏散尽浮华

mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理

在mysql工作中接触最多的就是mysql replication,mysql在复制方面还是会有一些常规问题,比如主库宕机或者从库宕机有可能会导致复制中断,通常...

53810
来自专栏CodingToDie

MySQL MVCC(多版本控制)

MySQL 提供了两种事务型的存储引擎:InnoDB 和 NDB Cluster 。另外还有一些第三方存储引擎也支持事务

2365

扫码关注云+社区

领取腾讯云代金券