电子邮件系统基于邮件协议来完成电子邮件的传输,常见的邮件协议有下面这些:
简单邮件传输协议(Simple Mail Transfer Protocol,SMTP):用于发送和中转发出的电子邮件,占用服务器的25/TCP端口。
邮局协议版本3(Post Office Protocol 3):用于将电子邮件存储到本地主机,占用服务器的110/TCP端口。
Internet消息访问协议版本4(Internet Message Access Protocol 4):用于在本地主机上访问邮件,占用服务器的143/TCP端口。
一个最基础的电子邮件系统肯定要能提供发件服务和收件服务,为此需要使用基于SMTP协议的Postfix服务程序提供发件服务功能,并使用基于POP3协议的Dovecot服务程序提供收件服务功能。
1.开放端口
- 25(SMTP服务,用于发送邮件)
- 110(pop3服务,用于接收邮件)
- 143(imap服务,用于接收邮件)
如果只想用pop3服务,那么我们只需要打开110和25端口即可,如果使用了ssl的话,pop3就需要开放465(发件) 995(收件)端口;imap就需要开放我们的465(发件) 993(收件)端口
firewall-cmd --add-port=25/tcp --permanent
firewall-cmd –-add-port=110/tcp --permanent
firewall-cmd --reload
2. 检查通信是否正常
检查我们的服务器能否telnet通我们要发送的一些邮件服务商的端口,比如qq,163,gmail等,如果不通的话需要更换服务器,因为此服务器商将这些给拦截了;
yum install -y telnet
telnet smtp.qq.com 25
3. 移除sendmail
rpm -e sendmail
或者
yum remove sendmail
4.域名解析配置
5.修改hostname【可选】
hostnamectl set-hostname mail.okchinese.cn
6.修改MTA(默认邮件传输代理)
alternatives --config mta
#然后直接回车
检查是否设置成功
alternatives --display mta
#第一行可以看到mta的状态。mat - status is manual.就是ok了。
7.安装POSTFIX
postfix是提供发件服务的,在centos7里我们的postfix是系统自带的,但是centos7以前的版本是默认不带的,centos7版本以前是sendmail
7.1 安装:
yum install postfix
7.2 配置
vim /etc/postfix/main.cf
# 75行: 取消注释,设置hostname
myhostname = mail.abc.com
# 83行: 取消注释,设置域名
mydomain = abc.com
# 99行: 取消注释
myorigin = $mydomain
# 116行: 默认是localhost,我们需要修改成all
inet_interfaces = all
# 119行: 推荐ipv4,如果支持ipv6,则可以为all
inet_protocols = ipv4
# 164行: 添加
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
# 264行: 取消注释,指定内网和本地的IP地址范围
mynetworks = 127.0.0.0/8
# 419行: 取消注释,邮件保存目录
home_mailbox = Maildir/
# 571行: 添加
smtpd_banner = $myhostname ESMTP
# 添加到最后
# 规定邮件最大尺寸为10M
message_size_limit = 10485760
# 规定收件箱最大容量为1G
mailbox_size_limit = 1073741824
# SMTP认证
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,reject
postfix服务程序主配置文件中的重要参数
参数 | 作用 |
---|---|
myhostname | 邮局系统的主机名 |
mydomain | 邮局系统的域名 |
myorigin | 从本机发出邮件的域名名称 |
inet_interfaces | 监听的网卡接口 |
mydestination | 可接收邮件的主机名或域名 |
mynetworks | 设置可转发哪些主机的邮件 |
relay_domains | 设置可转发哪些网域的邮件 |
7.3 开启postfix服务并添加到系统自启
systemctl restart postfix
systemctl enable postfix
8. dovecot
Dovecot服务程序提供收件服务功能
8.1 安装dovecot
yum install dovecot
8.2 配置
- dovecot.conf
vim /etc/dovecot/dovecot.conf
# 26行: 如果不使用IPv6,请修改为*
listen = *
#在主配置文件中的第48行,设置允许登录的网段地址,也就是说我们可以在这里限制只有来自于某个网段的用户才能使用电子邮件系统。如果想允许所有人都能使用,则不用修改本参数
login_trusted_networks = 192.168.10.0/24更改内容
- 10-auth.conf
vim /etc/dovecot/conf.d/10-auth.conf
# 9行: 取消注释并修改 disable_plaintext_auth = no
# 97行: 添加 auth_mechanisms = plain login
- 10-mail.conf
vim /etc/dovecot/conf.d/10-mail.conf
# 30行: 取消注释并添加 mail_location = maildir:~/Maildir
- 10-master.conf
vim /etc/dovecot/conf.d/10-master.conf
# 88-90行: 取消注释并添加 # Postfix smtp验证
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
如果没有使用ssl的话需要进行下面的操作。使用了则不需要。
- 10-ssl.conf
vim /etc/dovecot/conf.d/10-ssl.conf
# 8行: 将ssl的值修改为 ssl = no
8.3启动dovecot并添加到开机自启
systemctl restart dovecot
systemctl enable dovecot
9. 创建用户
useradd admin
passwd admin
- 如果我们查看日志发现 status=bounced ,那么就意味着qq的邮件服务器将我们这个服务器IP设为恶意IP,不接收这个IP发送的邮件。也就意味着如果我们要发邮件到qq邮箱的话,就需要更换服务器ip。
- 如果要邮件服务器配置SSL:centos7邮件服务器SSL配置
我们邮件服务器在设定mynetworks 这个值的时候,一行不要设置all,因为会有很多服务器会将你的服务器作为中转邮件服务器,最终导致的你的邮件服务器发送的邮件被qq,163,gamil,这些邮件服务商标记为垃圾邮件。- 当某天我们检查我们的mail日志(
/var/log/maillog
)时发现很多邮件发送,而且邮件不是我们自己产生的话,那么我们的邮件服务器是出了问题的。这时我们服务器一定有很多邮件堆积,然后自己邮件会发不出去。
我们需要做的操作:检查
du -sh /var/spool/postfix/*
查看目录下的defer
和deferred
的目录大小,通过postqueue –p
来查看队列的邮件,通过postsuper -d ALL
删除所有的队列邮件。- 屏蔽刷postfix的 IP脚本
#!/bin/bash LOGFILE="/var/log/maillog" #统计maillog中authentication failure的IP个数与IP grep "authentication failure" $LOGFILE|awk '{print $7}'|grep -E -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"|sort|uniq -c > af_iplist.txt #取出AF出现大于300次时的IP awk '$1>300 {print $2}' af_iplist.txt > block_ip_list.txt #大于300次AF的IP添加到iptables中 cat block_ip_list.txt|while read line do /sbin/iptables -nL | grep $line if [ $? != 0 ] then iptables -I INPUT -s $line -j DROP fi done
springboot推送邮件
org.springframework.boot
spring-boot-starter-mail
org.springframework.boot
spring-boot-starter-test
test
spring:
mail:
host: mail.xxxx.com
port: 25
username: admin
password: xxxxx
@Component
public class MailSendDemo {
//在需要发件的地方注入JavaMailSender对象进行邮件的发送
@Autowired
private JavaMailSender jms;
public void sendTextMail() {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom("[email protected]"); //发件人邮箱地址
message.setTo("[email protected]"); //收件人邮箱地址
message.setSubject("会员开通提醒"); //标题
message.setText("你在做梦"); //邮件内容
jms.send(message);
}
}
//启动Spring
@SpringBootTest(classes = MaildemoApplication.class)
public class SendTest {
@Autowired
MailSendDemo mailSendDemo;
@Test
void contextLoads() {
mailSendDemo.sendTextMail();
}
}