我们上一篇介绍了Python+Nginx实现POP、IMAP、SMTP邮箱代理服务,而今天我们就介绍Java+Nginx实现POP、IMAP、SMTP邮箱代理服务,我们本次使用的环境为Centos7下,java程序我们通过eclipse导出的war包运行在linux下的tomcat下执行的,具体见下:
环境介绍:
Hostname:java.iternalsoft.com
IP:192.168.2.163
Roles: Proxy Server
OS:Centos7
我们通过以下命令来修改新安装的服务器信息:
1
2
3
4
5
6
|
Hostnamectl
set
-
hostname
customname 修改计算机名
Systemctl stop firewalld.serice 停止防火墙服务
Systemctl disable firewall.service 禁止防火墙服务随机启动
Systemctl stop postfix 停止postfix服务
Systemctl disable postfix 禁用postfix服务随机启动
Vim
/etc/selinux/config
修改selinux的状态为disabled
|
我们首先是安装Nginx服务,在安装Nginx前我们需要安装Nginx的仓库
1
2
3
|
Yum
install
http:
//nginx
.org
/packages/centos/7/noarch/RPMS/
nginx-release-centos-7-0.el7.ngx.noarch.rpm
|
repo仓库安装好后,我们就开始安装nginx了
1
|
Yum
install
nginx
|
接下来查看安装默认路径
1
2
|
/etc/nginx/nginx
.conf
Find -name nginx
|
接下来我们要配置nginx的配置文件
1
|
Vim
/etc/nginx/nginx
.conf 默认配置文件
|
我们为了方便需要将该配置文件内的内容全部清空,使用以下命令来完成
1
|
Echo >
/etc/nginx/nginx
.conf 清空nginx.conf内的内容
|
但是我们为了配置完全,建议首先备份一下
1
|
Cp
/etc/nginx/nginx
.conf
/etc/nginx/cginx
.conf.bak
|
然后再运行
1
|
echo
>
/etc/nginx/nginx
.conf 清空配置文件
|
然后再次编辑该配置文件
1
|
Vim
/etc/nginx/nginx
.conf
|
添加以下代码,然后根据自己的环境修改代码内容保存即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
user nginx;
worker_processes 4;
pid
/var/run/nginx
.pid;
events {
worker_connections 1024;
}
error_log
/var/log/nginx/error
.log info;
mail {
server_name java.abc.com;
auth_http http:
//localhost
:8080
/imail/index
.jsp;
imap_capabilities IMAP4rev1 UIDPLUS IDLE LITERAL+ QUOTA;
pop3_auth plain apop cram-md5;
pop3_capabilities LAST TOP USER PIPELINING UIDL;
smtp_auth login plain cram-md5;
smtp_capabilities
"SIZE 10485760"
ENHANCEDSTATUSCODES 8BITMIME DSN;
xclient off;
server {
listen 110;
protocol pop3;
proxy on;
proxy_pass_error_message on;
}
server {
listen 143;
protocol imap;
proxy on;
}
server {
listen 25;
protocol smtp;
proxy on;
}
}
|
粘贴保存
接下来设置nginx服务
1
2
3
|
Systemctl
enable
nginx.service nginx服务开启随机启动
Systemctl start nginx.service nginx服务启动
Systemctl status nginx.service nginx服务运行状态
|
接下来就是安装java运行环境了(JDK),java运行环境,在此安装tomcat
首先确认的是linux一般都是自带java环境的JDK
接下来就是准备安装新的jdk文件,首先呢我们运行一下命令
1
|
uname
-a
|
查看系统的版本及位数是32还是64位
如果有x86_64的是64位操作系统,如果没有那就是32位的
下载安装jdk
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
1
2
|
Wget
http:
//download
.oracle.com
/otn-pub/java/jdk/8u45-b14/jdk-8u45-linux-x64
.
tar
.gz?AuthParam=1433902875_8682334a55c7231fd0cb3cdbc5c9dcc9
|
我们通过ls查看下载的文件,然后我们需要解压
解压完成,无需安装 然后我们通过cd命令进入该路径
然后我们将当前目录的jdk1.8….解压文件移动到java目录下即可
我们保存后退出,然后重启系统,发现jdk的版本已经是我们新安装的版本了 接下来是我们需要安装tomcat了 首先是下载 http://tomcat.apache.org/download-80.cgi 我们通过打开tomcat官网找到合适的安装包后,右击复制下载链接,通过wget在线下载
下载完成 |
下载后,我们就可以开始解压了
1
|
Tar -zxvf apache_tomcat1.8.-0
tar
.gz
|
解压完成
我们需要将apache-tomcat文件移动到 /usr/即上
1
|
Mv apache-tomcat
/usr
|
接下来启动tomcat服务
1
2
|
Cd
/usr/apache-tomcat18
.0.23
/bin
.
/startup
.sh
|
然后我们查看tomcat相关服务端口
1
|
Netstat -anlpt
|
Centos7下需要单独安装net-tools 服务
1
|
Yum
install
-y net-tools
|
1
|
Netstat -anlpt
|
然后我们使用ie浏览器进行访问
1
2
|
我们也可以通过修改apache-tomcat默认的服务端口
在apache-tomcat
/conf/server
.xml下
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
HashEnv.put(Context.SECURITY_AUTHENTICATION,
"simple"
);
//
LDAP访问安全级别(none,simple,strong)
HashEnv.put(Context.SECURITY_PRINCIPAL,
"cn="
+username+
",o=beyondsoft"
);
HashEnv.put(Context.SECURITY_PRINCIPAL, username);
//AD
的用户名
HashEnv.put(Context.SECURITY_CREDENTIALS, password);
//AD
的密码
HashEnv.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory"
);
//
HashEnv.put(com.sun.jndi.ldap.connect.timeout, 3000);
//
连接超时设置为3秒
HashEnv.put(Context.PROVIDER_URL,
"ldap://"
+host+
":"
+port);
//
默认端口389
try {
ctx = new InitialDirContext(HashEnv);
//
初始化上下文
Attributes attrs = ctx.getAttributes(
"cn="
+username+
",o=beyondsoft"
);
System.out.println(
"Mailserver: "
+ attrs.get(
"mailserver"
).get());
String attDomain=attrs.get(
"mail"
).get().toString();
String attServer=attCN.
split
(
","
)[0].
split
(
"="
)[1]+
"."
+ attDomain.substring(attDomain.indexOf(
"@"
)+1) ;
System.out.println(Inet4Address.getByName(attServer).getHostAddress());
return
attCN.
split
(
","
)[0].
split
(
"="
)[1];
|
然后我们需要定制java运行程序,其实就是.war包
定义好程序后,我们就将程序的代码导出为.war包,然后通过winscp或者mount的方式拷贝到tomcat的安装目录下的webapp下,启动tomcat服务器系统会自动将war包解压
Tomcat服务启动后,我们通过浏览器访问,提示500页面,其实500的页面是正常的,因为我们在程序中是post请求传输,所以是无法打开页面的,
接下来我们我了方便测试代码是否有问题,我们就通过以下命令来测试一下:
1
2
|
curl -i -H
'Auth-User: iiosoft'
-H
'Auth-Pass: 123'
-H
'Auth-Protocol: pop3'
http:
//localhost
:8080
/imail/Index
.jsp
|
我们测试你可以正常返回Auth-sever,Auth-status,auth-ports,auth-user,auth-pass等信息,所以没有问题,我们这样可以通过telnet mailserver 110的方式进行测试验证,但是在验证 过程中发现无法验证,代码确实是没有问题的,那怎么会验证失败呢
我们经过查找资料确认,nginx需要通过ldap返回的是auth-server必须是服务器的ip地址,如果是服务器名称的话无法解析,那我们只能通过在代码中进行转化了,默认返回的是服务器名称
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
HashEnv.put(Context.SECURITY_AUTHENTICATION,
"simple"
);
//
LDAP访问安全级别(none,simple,strong)
HashEnv.put(Context.SECURITY_PRINCIPAL,
"cn="
+username+
",o=beyondsoft"
);
HashEnv.put(Context.SECURITY_PRINCIPAL, username);
//AD
的用户名
HashEnv.put(Context.SECURITY_CREDENTIALS, password);
//AD
的密码
HashEnv.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory"
);
//
HashEnv.put(com.sun.jndi.ldap.connect.timeout, 3000);
//
连接超时设置为3秒
HashEnv.put(Context.PROVIDER_URL,
"ldap://"
+host+
":"
+port);
//
默认端口389
try {
ctx = new InitialDirContext(HashEnv);
//
初始化上下文
Attributes attrs = ctx.getAttributes(
"cn="
+username+
",o=beyondsoft"
);
System.out.println(
"Mailserver: "
+ attrs.get(
"mailserver"
).get());
System.out.println(
"Mailserver: "
+ attrs.get(
"mail"
).get());
String attDomain=attrs.get(
"mail"
).get().toString();
String attCN=attrs.get(
"mailserver"
).get().toString();
String attServer=attCN.
split
(
","
)[0].
split
(
"="
)[1]+
"."
+ attDomain.substring(attDomain.indexOf(
"@"
)+1) ;
//
System.out.println(Inet4Address.getByName(attServer).getHostAddress());
//return
attCN.
split
(
","
)[0].
split
(
"="
)[1];
return
Inet4Address.getByName(attServer).getHostAddress().toString();
|
接下来我们通过修改代码来解决该问题:
怎么解决的呢,我们在初始化前,想到LDAP上取到用户的mailserver和mailaddress值,得到的格式为a1/server,user@domain.com,然后我们可以在左侧取a1,右侧取@之后的内容,然后再次拼接就是一个服务器地址。A1.domain.com;最后我们通过再用InetAddress.getByName 转换成ip 就ok了
转换成ip后,我们再次测试;
我们同样也通过outlook进行测试
测试成功后,我们通过在dns中添加一个解析指向192.168.2.163,然后我们通过域名再次测试
如果要让nginx代理smtp的话,我们需要编辑nginx.conf添加配置文件
1
2
3
4
5
6
|
server {
listen 25;
protocol smtp;
smtp_auth login plain;
xclient off;
}
|
注:我们因为在Nginx下添加SMTP代理,所以我们添加SMTP的server区域
我们加上后重启发现提示nginx重启失败
我们想到提示端口已使用,想到系统自带的postfix是启动的
1
2
|
Systemctl stop postfix
Systemctl disable postfix
|
然后我们就重启启动nginx
我们通过outlook配置进行测试
本文转自 高文龙 51CTO博客,原文链接:http://blog.51cto.com/gaowenlong/1676770,如需转载请自行联系原作者