文章目录
前言
在我们日常开发中,有些项目可能有发送邮件需求,我们日常用的各个个人邮箱也能开启SMTP服务,但是发送数量和内容有诸多限制。本文将使用Postfix+Dovecot在自己的服务器上来搭建一个SMTP服务,虽然也有某些限制,但是对一些小系统或者内部系统来说已经足够了,如果你也有这样的需求,请跟着步骤一步一步来。下面我们进入搭建环节,所需要的环境如下:
所需环境 |
---|
操作系统centos7.0+服务器一台 |
域名一个 |
服务器需开通25端口 |
一、安装Postfix
yum -y install postfix
安装完成替换系统自带的sendmail:
yum remove sendmail
修改MTA(默认邮件传输代理):
alternatives --config mta
如下图所示:
选择1然后按回车。
检查是否已经设置成功了:
alternatives --display mta
如下图所示,表示安装成功:
二、安装Dovecot
yum -y install dovecot
三、配置Postfix
vim /etc/postfix/main.cf
1.设置hostname、mydomain、myorigin
如下图所示:
这里我用的域名为:code-long.com,请根据自己的域名进行替换
2.设置inet_interfaces、inet_protocols
如下图所示:
3.设置SMTP认证
在文件末尾追加如下配置:
# 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配置完成,保存退出:
:wq
四、配置Dovecot
1.设置dovecot.conf
vim /etc/dovecot/dovecot.conf
如下图所示:
2.设置10-auth.conf
vim /etc/dovecot/conf.d/10-auth.conf
修改:disable_plaintext_auth、auth_mechanisms,如下图所示:
3.设置10-master.conf
vim /etc/dovecot/conf.d/10-master.conf
修改postfix认证:
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
如下图所示:
至此,dovecot配置完成
五、启动Postfix、Dovecot
启动postfix
service postfix start
启动dovecot
service dovecot start
如果没有异常提示说明启动成功了。查看状态,如图所示:
六、配置域名
前面我们已经搭建好了SMTP服务,但是要使用需要用到域名,因为我们在postfix配置里面加入了域名,域名大家可以去各大云市场购买,我这里使用了Cloudflare的域名。
1.解析A记录
在postfix的配置里面我们设置了一个:
myhostname = mail.code-long.com
这里我们需要解析一个子域名为mail的A记录,并将记录值执行服务器的IP,这个IP需要公网IP,域名解析过程如下图所示:
1.解析MX记录
另外我们还需要解析一个MX记录,主机记录为空,记录值需要指向我们上面的A记录子域名:mail.code-long.com,优先级为:10。如下图:
至此域名解析也完成,如果你使用的是其他平台的域名,解析过程大同小异。
七、测试邮箱
1.设置用户
使用postfix/dovecot提供的服务,他们的用户使用的是Linux的系统用户和密码,比如我可以使用root用户和密码来作为邮箱的管理员,但这样会有诸多的安全问题。所以这里我们创建一个新的系统用户专门来作为邮箱管理员。
创建用户:
useradd mail_admin
设置密码:
passwd mail_admin
输入密码后,创建成功,这里为了安全起见,我们进制这个用户使用ssh远程登录:
usermod -s /sbin/nologin mail_admin
2.在项目中应用(Java)
这里我们使用springboot的邮件模块来测试刚才我们搭建的SMTP服务来发送邮件:
在pom.xml中添加如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
添加如下配置:
mail.from=mail_admin@code-long.com
spring.mail.host=mail.code-long.com
spring.mail.port=25
spring.mail.username=mail_admin
spring.mail.password=AMXtRByuFNn4
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=false
spring.mail.properties.mail.smtp.starttls.required=false
spring.mail.properties.mail.smtp.ssl.enable=false
发送邮件关键代码:
@Resource
private JavaMailSender mailSender;
@Resource
private Environment env;
@RequestMapping("/send")
public Object sendMail(@RequestParam String to, @RequestParam String content){
String from = env.getProperty("mail.from");
String mail_nick="系统名称";
String subject="这是一个测试邮件";
try {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
mimeMessageHelper.setTo(to);
String nick = MimeUtility.encodeText(mail_nick);
mimeMessageHelper.setFrom(new InternetAddress(nick + " <" + from + ">"));
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(content, true);
mailSender.send(mimeMessage);
return ResponseEntity.ok().body("true");
} catch (Exception e) {
log.error("发送邮件失败:",e);
return ResponseEntity.badRequest().body(e.getMessage());
}
}
测试结果如下:
至此整个SMTP邮件服务我们就搭建完成,测试代码已放在最顶部。
后记(踩坑)
- 上面的我们只配置了postfix/dovecot的SMTP服务,也就是只能发送邮件,但大部分场景下,管理员邮箱是不需要接收邮件的,但如果要收邮件,需要配置dovecot的IMAP或者POP协议,大家可以自行研究。
- 如果你使用国内服务器来搭建,服务器的25端口需要你的域名和服务器备案才行,这是个坑
- 经过测试目前qq和163的邮箱能收到邮件,gmail收不到,其他邮箱有待测试。而且邮件基本上会归类到垃圾箱中,gmail因为其安全限制完全收不到,大家可以研究一下怎么处理,如果这个问题处理好了希望能给我回复一下。
- 如果邮件在垃圾箱中,可以设置一下这个用户为你的信任用户,这样后面的邮件就能正常归类了。