Linux: 搭建邮件服务器, 命令行发送邮件, sendgrid服务器搭建, Postfix服务器搭建

 

1. 获取root权限

sudo su -
umask 077

2. 安装 Postfix代理软件 Postfix Mail Transport Agent.

#DEBIAN
apt-get update && apt-get install postfix libsasl2-modules -y

#CENTOS
yum install postfix cyrus-sasl-plain cyrus-sasl-md5 -y

如果有弹出窗口的话,选择 Local Only

Linux: 搭建邮件服务器, 命令行发送邮件, sendgrid服务器搭建, Postfix服务器搭建
Linux: 搭建邮件服务器, 命令行发送邮件, sendgrid服务器搭建, Postfix服务器搭建

3. 安装成功后,修改postfix的配置文件:

vi /etc/postfix/main.cf

4. 注释掉下面两行代码:

default_transport = error
relay_transport = error

5. 添加或修改一行代码:(没有就添加一行,有的话就修改,默认时常为空)

relayhost = [smtp.sendgrid.net]:2525

如果你使用的是 google cloud 服务器,那么必须使用 2525端口,因为 port 25 和 port 587 是禁止使用的。

6. 添加以下代码到最后面:

smtp_tls_security_level = encrypt
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
header_size_limit = 4096000
smtp_sasl_security_options = noanonymous

7. 集成 SASL password map: (sendgrid 是什么?

echo [smtp.sendgrid.net]:2525 [YOUR_SMTP_LOGIN]:[YOUR_SMTP_PASSWORD] >> /etc/postfix/sasl_passwd
  • [YOUR_SMTP_LOGIN] 你的 SendGrid 登录用户名.
  • [YOUR_SMTP_PASSWORD] 你的 SendGrid 登录密码.

8. postmap 命令生成 .db 文件

postmap /etc/postfix/sasl_passwd

9. 确认是否生成成功

ls -l /etc/postfix/sasl_passwd*

-rw------- 1 root root    ...  /etc/postfix/sasl_passwd
-rw------- 1 root root    ...  /etc/postfix/sasl_passwd.db

10. 确认后,删除sasl_passwd,只保留.db文件就可以。

rm /etc/postfix/sasl_passwd

11. 修改.db的权限

chmod 600 /etc/postfix/sasl_passwd.db
ls -la /etc/postfix/sasl_passwd.db

-rw------- 1 root root    ...  /etc/postfix/sasl_passwd.db

12. 重新加载postfix的配置文件

# DEBIAN
/etc/init.d/postfix restart

# ENTOS
postfix reload

13. 安装mailx 或者 mailutils

#DEBIAN
apt-get install mailutils -y

#CENTOS
yum install mailx -y

14. 完成!现在进行测试:

echo 'hi, justcode.ikeepstuding.com Test passed.' | mail -s Test-Email EMAIL@EXAMPLE.COM

可以查看log日志,其中有一项是 status,如果 response code (250)  表示发送成功!

#DEBIAN
tail -n 5 /var/log/syslog

#CENTOS
tail -n 5 /var/log/maillog

 

其他语言,可以参考: https://cloud.google.com/compute/docs/tutorials/sending-mail/using-sendgrid

 

如何修改默认发送者邮件地址?HOW TO REWRITE OUTGOING ADDRESS IN POSTFIX

1. 修改配置文件

vi /etc/postfix/main.cf

修改:

mydomain = example.com

另外要确保 inet_interfaces = all,因为Postfix默认只监听本地地址,如果要与外界通信,就需要监听网卡的所有IP

2. 继续修改

# 如果配置文件中没有 smtp_generic_maps ,那么就添加新行
smtp_generic_maps = hash:/etc/postfix/generic

3. 保存并退出配置文件,然后编辑generic文件

vi /etc/postfix/generic

例如:

 root@example.com   no-reply@example.com
 @example.com       no-reply@example.com

我是修改是:

root <root@station.c.gentle-respect-184822.internddal>   justcode <info@ikeepstudying.com>
root@station.c.gentle-respect-184822.internal   justcode <info@ikeepstudying.com>
@station.c.gentle-respect-184822.internal   kbtjustcodealker <info@ikeepstudying.com>
www-data <www-data@station.c.gentle-respect-184822.internddal>   justcode <info@ikeepstudying.com>

4. 保存并退出generic文件, 然后集成.db文件

postmap /etc/postfix/generic

这样就生成了 /etc/postfix/generic.db hash 文件.

5. 重启postfix服务器

/etc/init.d/postfix restart

 

其他配置:

第一个需要修改的参数是myhostname,指向真正的域名,例如:

myhostname = mail.example.com

mydomain参数指向根域:

mydomain = example.com

myorigin和mydestination都可以指向mydomain:

myorigin = $mydomain
mydestination = $mydomain

Postfix默认只监听本地地址,如果要与外界通信,就需要监听网卡的所有IP:

inet_interfaces = all

Postfix默认将子网内的机器设置为可信任机器,如果只信任本机,就设置为host:

mynetworks_style = host

配置哪些地址的邮件能够被Postfix转发,当然是mydomain的才能转发,否则其他人都可以用这台邮件服务器转发垃圾邮件了:

relay_domains = $mydomain

现在,Postfix已经基本配置完成,我们需要对邮件的发送进行控制:

  • 对于外域到本域的邮件,必须接收,否则,收不到任何来自外部的邮件;
  • 对于本域到外域的邮件,只允许从本机发出,否则,其他人通过伪造本域地址就可以向外域发信;
  • 对于外域到外域的邮件,直接拒绝,否则我们的邮件服务器就是Open Relay,将被视为垃圾邮件服务器。

先设置发件人的规则:

smtpd_sender_restrictions = permit_mynetworks, check_sender_access hash:/etc/postfix/sender_access, permit

以上规则先判断是否是本域地址,如果是,允许,然后再从sender_access文件里检查发件人是否存在,拒绝存在的发件人,最后允许其他发件人。

然后设置收件人规则:

smtpd_recipient_restrictions = permit_mynetworks, check_recipient_access hash:/etc/postfix/recipient_access, reject

以上规则先判断是否是本域地址,如果是,允许,然后再从recipient_access文件里检查收件人是否存在,允许存在的收件人,最后拒绝其他收件人。

/etc/postfix/sender_access的内容:

example.com REJECT

目的是防止其他用户从外部以xxx@example.com身份发送邮件,但登录到本机再发送则不受影响,因为第一条规则permit_mynetworks允许本机登录用户发送邮件。

/etc/postfix/recipient_access的内容:

postmaster@example.com OK
webmaster@example.com OK

因此,外域只能发送给以上两个Email地址,其他任何地址都将被拒绝。但本机到本机发送不受影响。

最后用postmap生成hash格式的文件:

# postmap sender_access
# postmap recipient_access

启动Postfix:

# /etc/init.d/postfix start

设置到启动组里:

# chkconfig postfix on

现在就可以通过telnet来测试了:(红色是输入的命令)

220 mail.example.com ESMTP Postfix

helo localhost

250 mail.example.com

mail from:test@gmail.com

250 Ok

rcpt to:webmaster@example.com

250 Ok

data

354 End data with<CR><LF>.<CR><LF>

hello!!!!!!

.

250 Ok: queued as D68E41407D0

mail from:test@gmail.com

250 Ok

rcpt to:haha@example.com

554<haha@example.com>: Recipient address rejected: Access denied

quit

221 Bye

 

如果配置了SMTP认证,就可以让用户远程发送时能通过认证后再发送邮件,目前还没有配置,准备继续研究后再配置。需要注意的是,配置SMTP认证后,设置规则应该是:

  • 外域->本域:不需认证,允许,否则将接受不到任何外部邮件;
  • 本域->外域:需要认证,否则拒绝。

因为我们作为发送服务器的MTA和转发的MTA实际上是由一个MTA完成的,所以需要以上规则。对于大型邮件服务商,发送服务器的MTA和转发的MTA是分别部署的,例如,sina的发送服务器是smtp.sina.com,需要经过用户认证,而转发服务器是mx???.sina.com,不需要认证,否则无法转发邮件。

最后不要忘了在DNS的MX记录中将域名mail.example.com添上。

 

本文:Linux: 搭建邮件服务器, 命令行发送邮件, sendgrid服务器搭建, Postfix服务器搭建