本文是Linux Shell脚本系列教程的第(四)篇,更多shell教程请看:Linux Shell脚本系列教程 与许多的编程语言一样,Shell中也有注释符号,继上一篇之后,今天就为大家来介绍下Shell中的注释的语法及用法。 Shell中的注释以“#”号开头,所有以“#”号开头的代码都会被解释器所忽略。 比如下面的代码: #!/bin/bash # Author…
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

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服务器搭建