前言

之前学Java Web的时候,看到很多教程都有介绍JavaMail,看上去很心动。这个功能还是很好用的,比如在登录注册的时候,发一份包含链接的邮箱到用户邮箱,用户打开邮箱点击链接完成验证。但是教程介绍的都是用QQ、163这类已有的邮件服务器,用这些邮件服务器有个缺点,每天发送邮件的次数有上限,超过了就不给用。今天周六,正好有空,自己搭建了一个邮件服务器,邮件随便发,无上限,妥妥的~哈哈哈

Ubuntu搭建Apache James邮件服务器

这里先介绍一下Apache James邮件服务器。Apache James,Apache Mail Enterprise Server的缩写,是一个用Java编写的开源SMTP和POP3邮件服务器,可以用来收、发电子邮件。我们今天的主角就是它。

1.下载James

官网下载James,这里我下的是二进制稳定版的,第一次下的是2.3.2.1版,发现总是报错,后来下了2.3.2版就没问题了

JavaMailSenderImpl 默认 timeout_发送邮件

JavaMailSenderImpl 默认 timeout_发送邮件_02

2.上传压缩包

将上面下载下来的压缩包通过FTP客户端上传到服务器,我上传到服务器的/opt目录下,上传之前记得给予权限

chmod -R 777 opt

JavaMailSenderImpl 默认 timeout_邮件服务器_03

3.安装JDK

James是用Java写的,要运行当然少不了JDK,具体安装步骤我这里不细说,不懂的朋友可以看看我之前的博客Tomcat在Ubuntu中的安装和部署。我的JDK已经装好了,验证一下

JavaMailSenderImpl 默认 timeout_服务器_04

4.解压压缩包
tar -zxvf james-binary-2.3.2.1.tar.gz
5.启动James服务器

进入到james的bin目录,运行run.sh脚本

sh run.sh

James服务器启动成功

JavaMailSenderImpl 默认 timeout_服务器_05

6.修改配置文件

Ctrl+C停止当前运行的后台,进入/opt/james-2.3.2.1/apps/james/SAR-INF目录

cd /opt/james-2.3.2.1/apps/james/SAR-INF

修改配置文件

vim config.xml
  • 修改域名配置

autodetct:false 表示使用指定的server name
autodetectIP:false 表示不会为你的servername加上ip
servername 就改成你所需要的域名就行

  • 注释掉这段代码
  • JavaMailSenderImpl 默认 timeout_发送邮件_06

  • 然后再注释掉这段
  • JavaMailSenderImpl 默认 timeout_发送邮件_07

这里配置局域网广播地址,目的是允许此网段的机子可以访问到这个邮件服务器,所以注释掉

  • 配置dnsserver
    查找ubuntu服务器配置的DNS
cat /etc/resolv.conf

JavaMailSenderImpl 默认 timeout_javamail_08

把这两个IP记录下来

然后再配置SAR-INF下面的config.xml

JavaMailSenderImpl 默认 timeout_javamail_09

  • 修改james登录密码
7.修改hosts文件

上面配置了jehoiada.cn,所以需要修改一下hosts

vim /etc/hosts

JavaMailSenderImpl 默认 timeout_服务器_10

8.重启James服务器

到这里我们就配置好了James,可以让它后台运行了

nohup ./run.sh &
9.添加用户

打开windows的控制台,输入

telnet [IP地址] 4555

提示输入用户名和密码,这个用户名和密码就是你刚刚在config.xml里面设置的

然后添加用户

adduser [用户名] [密码]
JavaMail创建和发送邮件

添加Maven依赖

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-email</artifactId>
    <version>1.4</version>
</dependency>

JavaMail发送邮件,相当于邮件客户端

Properties props = new Properties();

// 开启debug调试
props.setProperty("mail.debug", "true");
// 发送服务器需要身份验证
props.setProperty("mail.smtp.auth", "true");
// 设置邮件服务器主机名
props.setProperty("mail.host", "邮件服务器主机名");
// 发送邮件协议名称
props.setProperty("mail.transport.protocol", "smtp");

Session session = Session.getInstance(props);

//邮件内容部分
Message msg = new MimeMessage(session);
msg.setSubject("hello");
msg.setText("hello world");
msg.setFrom(new InternetAddress("double@jehoiada.cn"));

//邮件发送者
msg.setFrom(new InternetAddress("发送人的邮箱地址"));

//发送邮件
Transport transport = session.getTransport();
transport.connect("smtp.qq.com", "发送人的邮箱地址", "你的邮箱密码");

transport.sendMessage(msg, new Address[] { new InternetAddress("接收人的邮箱地址") });
transport.close();