Java+Nginx实现POP、IMAP、SMTP邮箱代理服务

简介:

我们上一篇介绍了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

clip_image002

repo仓库安装好后,我们就开始安装nginx了

1
Yum  install  nginx

clip_image004

clip_image006

接下来查看安装默认路径

1
2
/etc/nginx/nginx .conf
Find -name nginx

clip_image007

接下来我们要配置nginx的配置文件

1
Vim  /etc/nginx/nginx .conf 默认配置文件

clip_image009

我们为了方便需要将该配置文件内的内容全部清空,使用以下命令来完成

1
Echo > /etc/nginx/nginx .conf 清空nginx.conf内的内容

但是我们为了配置完全,建议首先备份一下

1
Cp  /etc/nginx/nginx .conf  /etc/nginx/cginx .conf.bak

clip_image011

然后再运行

1
echo  /etc/nginx/nginx .conf 清空配置文件

clip_image012

clip_image014

然后再次编辑该配置文件

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;
}
}

粘贴保存

clip_image016

接下来设置nginx服务

1
2
3
Systemctl  enable  nginx.service nginx服务开启随机启动
Systemctl start nginx.service  nginx服务启动
Systemctl status nginx.service nginx服务运行状态

clip_image018

接下来就是安装java运行环境了(JDK),java运行环境,在此安装tomcat

首先确认的是linux一般都是自带java环境的JDK

clip_image019

clip_image020

接下来就是准备安装新的jdk文件,首先呢我们运行一下命令

1
uname  -a


查看系统的版本及位数是32还是64位

如果有x86_64的是64位操作系统,如果没有那就是32位的

clip_image022

下载安装jdk

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

clip_image023

1
2
Wget 
http: //download .oracle.com /otn-pub/java/jdk/8u45-b14/jdk-8u45-linux-x64 . tar .gz?AuthParam=1433902875_8682334a55c7231fd0cb3cdbc5c9dcc9

clip_image025

clip_image027

我们通过ls查看下载的文件,然后我们需要解压

1
Tar -zxvf jdk1.8.0……..

clip_image029

解压完成,无需安装

clip_image031

然后我们通过cd命令进入该路径

1
2
/usr/ 创建java的目录,然后将解压的jdk移动到该目录
Cd  /usr/  进入usr目录

clip_image033

1
Mkdir java 创建java文件夹

clip_image034

然后我们将当前目录的jdk1.8….解压文件移动到java目录下即可

1
Mv jdk1.8.xx  /usr/java

clip_image036

1
2
3
4
5
6
7
Vim  /etc/profile  编辑环境变量
添加环境变量
JAVA_HOME= /usr/java/jdk1 .8.0_45   
JRE_HOME= /usr/java/jdk1 .8.0_45 /jre   
PATH=$PATH:$JAVA_HOME /bin :$JRE_HOME /bin   
CLASSPATH=.:$JAVA_HOME /lib/dt .jar:$JAVA_HOME /lib/tools .jar:$JRE_HOME /lib   
export  JAVA_HOME JRE_HOME PATH CLASSPATH

clip_image038

我们保存后退出,然后重启系统,发现jdk的版本已经是我们新安装的版本了

clip_image039

接下来是我们需要安装tomcat了

首先是下载

http://tomcat.apache.org/download-80.cgi

我们通过打开tomcat官网找到合适的安装包后,右击复制下载链接,通过wget在线下载

1
2
wget 
http: //apache .dataguru.cn /tomcat/tomcat-8/v8 .0.23 /bin/apache-tomcat-8 .0.23. tar .gz

clip_image041

下载完成

clip_image043

 

下载后,我们就可以开始解压了

1
Tar -zxvf apache_tomcat1.8.-0  tar .gz

clip_image045

解压完成

clip_image047

我们需要将apache-tomcat文件移动到 /usr/即上

1
Mv apache-tomcat  /usr

clip_image048

接下来启动tomcat服务

1
2
Cd  /usr/apache-tomcat18 .0.23 /bin
. /startup .sh

clip_image050

然后我们查看tomcat相关服务端口

1
Netstat -anlpt

clip_image051

Centos7下需要单独安装net-tools 服务

1
Yum  install  -y net-tools

clip_image052

1
Netstat -anlpt

clip_image054

然后我们使用ie浏览器进行访问

clip_image056

1
2
我们也可以通过修改apache-tomcat默认的服务端口
在apache-tomcat /conf/server .xml下

clip_image058

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包

clip_image060

定义好程序后,我们就将程序的代码导出为.war包,然后通过winscp或者mount的方式拷贝到tomcat的安装目录下的webapp下,启动tomcat服务器系统会自动将war包解压

clip_image062

Tomcat服务启动后,我们通过浏览器访问,提示500页面,其实500的页面是正常的,因为我们在程序中是post请求传输,所以是无法打开页面的,

clip_image064

接下来我们我了方便测试代码是否有问题,我们就通过以下命令来测试一下:

1
2
curl -i -H  'Auth-User: iiosoft'  -H  'Auth-Pass: 123'  -H  'Auth-Protocol: pop3' 
http: //localhost :8080 /imail/Index .jsp

clip_image066

我们测试你可以正常返回Auth-sever,Auth-status,auth-ports,auth-user,auth-pass等信息,所以没有问题,我们这样可以通过telnet mailserver 110的方式进行测试验证,但是在验证 过程中发现无法验证,代码确实是没有问题的,那怎么会验证失败呢

clip_image067

我们经过查找资料确认,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();

clip_image069

接下来我们通过修改代码来解决该问题:

怎么解决的呢,我们在初始化前,想到LDAP上取到用户的mailserver和mailaddress值,得到的格式为a1/server,user@domain.com,然后我们可以在左侧取a1,右侧取@之后的内容,然后再次拼接就是一个服务器地址。A1.domain.com;最后我们通过再用InetAddress.getByName 转换成ip 就ok了

clip_image071

转换成ip后,我们再次测试;

clip_image072

我们同样也通过outlook进行测试

clip_image074

测试成功后,我们通过在dns中添加一个解析指向192.168.2.163,然后我们通过域名再次测试

clip_image076

如果要让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区域

clip_image078

我们加上后重启发现提示nginx重启失败

clip_image080

我们想到提示端口已使用,想到系统自带的postfix是启动的

1
2
Systemctl stop postfix
Systemctl disable postfix

然后我们就重启启动nginx

clip_image082

我们通过outlook配置进行测试

clip_image083



本文转自 高文龙 51CTO博客,原文链接:http://blog.51cto.com/gaowenlong/1676770,如需转载请自行联系原作者

相关文章
|
14天前
|
存储 网络协议 数据安全/隐私保护
SMTP/POP3/IMAP(电子邮件协议)
本文介绍了电子邮件系统中常用的三种协议:SMTP、POP3 和 IMAP。SMTP(简单邮件传输协议)用于发送邮件,设计简单且广泛支持;POP3(邮局协议版本3)用于接收邮件,适合离线使用但不支持文件夹管理;IMAP(互联网消息访问协议)允许用户在服务器上管理邮件,支持多设备同步和部分下载。文章还对比了这三种协议的功能、端口及特点,并分析了它们在实际场景中的应用,帮助用户根据需求选择合适的协议。
200 24
|
4月前
|
网络协议 应用服务中间件 网络安全
Nginx,正向代理
本文介绍了Nginx作为HTTPS正向代理的两种方案:HTTP CONNECT隧道(7层)和NGINX stream(4层)。HTTP CONNECT隧道需要客户端手动配置代理,通过CONNECT请求建立隧道;而NGINX stream则更适合透明代理,利用SNI字段实现流量转发。文章详细讲解了两者的原理、环境搭建、使用场景及常见问题,并提供了配置示例和最佳实践建议。内容转载自阿里云开发者社区@怀知的文章,推荐读者参阅原文获取更多信息。感谢您的阅读!
519 80
Nginx,正向代理
|
3月前
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
151 7
|
7月前
|
监控 应用服务中间件 测试技术
确保正则表达式在 Nginx 代理中的准确性和稳定性
【10月更文挑战第19天】总之,正则表达式在 Nginx 代理中具有重要作用,但要确保其准确性和稳定性需要付出一定的努力和关注。通过以上方法的综合运用,我们可以提高正则表达式配置的可靠性,为用户提供更好的服务体验。
|
5月前
|
缓存 Java 应用服务中间件
nginx的正向代理和反向代理以及tomcat
Nginx的正向代理和反向代理功能在不同的场景中具有重要作用,正向代理主要用于客户端访问控制和匿名浏览,而反向代理则用于负载均衡和高可用性服务。Tomcat作为Java Web应用服务器,与Nginx结合使用,可以显著提升Web应用的性能和稳定性。通过合理配置Nginx和Tomcat,可以构建高效、稳定和可扩展的Web服务架构。
272 11
|
7月前
|
应用服务中间件 API nginx
使用正则表达式实现 Nginx 代理
【10月更文挑战第19天】在不断发展的互联网技术中,掌握正则表达式在 Nginx 代理中的应用是非常重要的。不断探索和实践,将有助于我们在实际工作中更好地运用这一技术,提升项目的质量和效率。
|
7月前
|
缓存 负载均衡 应用服务中间件
Nginx 实现一个端口代理多个前后端服务
【10月更文挑战第19天】Nginx 的强大功能不仅限于此,它还可以与其他技术和工具相结合,为我们的应用提供更强大的支持和保障。在不断发展的互联网时代,掌握 Nginx 的使用技巧将为我们的工作和生活带来更多的便利和效益。
|
6月前
|
前端开发 应用服务中间件 定位技术
Nginx 如何代理转发传递真实 ip 地址?
【10月更文挑战第32天】
1134 5
Nginx 如何代理转发传递真实 ip 地址?
|
6月前
|
负载均衡 前端开发 JavaScript
Nginx 代理多服务
以上是 Nginx 代理多服务的几种常见方式,在实际应用中,可以根据具体的业务需求和系统架构选择合适的代理方式,并结合其他 Nginx 的功能和配置来优化和完善系统的性能和功能。
|
7月前
|
负载均衡 应用服务中间件 Linux
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
这篇博客文章详细介绍了Nginx的下载、安装、配置以及使用,包括正向代理、反向代理、负载均衡、动静分离等高级功能,并通过具体实例讲解了如何进行配置。
312 4
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全