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

我们通过以下命令来修改新安装的服务器信息:

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的仓库

Yum install 
http://nginx.org/packages/centos/7/noarch/RPMS/
nginx-release-centos-7-0.el7.ngx.noarch.rpm

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

Yum install nginx

接下来查看安装默认路径

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

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

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

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

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

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

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

然后再运行

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

然后再次编辑该配置文件

Vim /etc/nginx/nginx.conf

添加以下代码,然后根据自己的环境修改代码内容保存即可

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服务

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

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

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

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

uname -a

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

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

下载安装jdk

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

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

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

Tar -zxvf jdk1.8.0……..

解压完成,无需安装

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

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

Mkdir java 创建java文件夹

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

Mv jdk1.8.xx /usr/java

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

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

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

首先是下载

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

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

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

下载完成

 

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

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

解压完成

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

Mv apache-tomcat /usr

接下来启动tomcat服务

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

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

Netstat -anlpt

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

Yum install -y net-tools

Netstat -anlpt

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

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

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请求传输,所以是无法打开页面的,

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

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地址,如果是服务器名称的话无法解析,那我们只能通过在代码中进行转化了,默认返回的是服务器名称

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,[email protected],然后我们可以在左侧取a1,右侧取@之后的内容,然后再次拼接就是一个服务器地址。A1.domain.com;最后我们通过再用InetAddress.getByName 转换成ip 就ok了

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

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

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

如果要让nginx代理smtp的话,我们需要编辑nginx.conf添加配置文件

server {
listen 25;
protocol smtp;
smtp_auth login plain;
xclient off;
}

注:我们因为在Nginx下添加SMTP代理,所以我们添加SMTP的server区域

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

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

Systemctl stop postfix
Systemctl disable postfix

然后我们就重启启动nginx

我们通过outlook配置进行测试

时间: 2024-09-30 18:54:39

Java+Nginx实现POP、IMAP、SMTP邮箱代理服务的相关文章

POP/IMAP/SMTP服务器地址——企业邮箱商务版(含海外设置)

1.根据您企业邮箱的线路,选择合适的POP/SMTP/IMAP服务. 中国大陆 海外 POP3 pop-ent.21cn.com pop-enthk.21cn.com SMTP smtp-ent.21cn.com smtp-enthk.21cn.com IMAP imap-ent.21cn.com imap-enthk.21cn.com 2.根据加密情况,选择合适的端口号. 无加密 SSL/TSL POP3 110 995 SMTP 25 465 IMAP 143 993

JAVA+PHP+阿里云组件纯手工实现POP、SMTP、IMAP开发邮件服务器(二)

java开发邮件服务器的接收模块 用java建立socket服务端,监听端口25,实现SMTP协议.即可完成邮件服务器的接收模块. 这里要注意的是,SMTP协议其实可以分为两种.一种是你用手机.PC等客户端发邮件到邮件服务商的服务器的时候用的SMTP协议,这一类是需要登录验证的.一种是邮件服务商之间传递邮件的SMTP协议,此类协议是不需要登录的.比如你用Foxmail上你的QQ邮箱发送了一封邮件到163的邮箱.过程是这样的: 邮件从Foxmail通过SMTP协议发送到QQ邮箱的服务器. QQ邮箱

Gmail,QMail,163邮箱的 IMAP/SMTP/POP3 地址

Gmail,QMail,163邮箱的 IMAP/SMTP/POP3 地址 Denis 留言: 2 浏览:11447 文章目录[隐藏] Gmail 的 IMAP/SMTP/POP3 地址 QMail 的 IMAP/SMTP/POP3 地址 163邮箱 的 IMAP/SMTP/POP3 地址 WPJAM TOC 我们在客户端设置邮箱或者使用 PHPMailer 发送邮件的时候,我们都会去查找这些邮箱的 IMAP/SMTP/POP3 地址,这里就列出 Gmail, QMail, 163邮箱这三个常用邮

基于java mail实现简单的QQ邮箱发送邮件

刚学习到java邮件相关的知识,先写下这篇博客,方便以后翻阅学习. -----------------------------第一步 开启SMTP服务 在 QQ 邮箱里的 设置->账户里开启 SMTP 服务 完成验证 获取授权码(后面代码实现时使用) -----------------------------第二步 环境配置 即下载第三方库 https://github.com/javaee/javamail/releases -----------------------------第三步 代

Java编程练习之判断Java文件名是否正确,判断邮箱格式是否正确和统计指定字符串中某字符现的次数

一判断Java文件名是否正确,判断邮箱格式是否正确 功能:判断Java文件名是否正确,判断邮箱格式是否正确.其中:合法的文件名应该以.java结尾:合法的邮箱名 中至少要包含 "@" , 并要求 "@" 在 "." 之前. 练习代码: public class Test { public static void main(String[] args) { //Java文件名 String fileName = "HelloWorld.j

Java杂谈之正则表达式--日期,邮箱,数字验证

当我们判断数据的格式是否符合规范的时候,一般会采用两种方式: 一种是if...else不断的嵌套或者if...else并排判断的方式 (这两者代表以条件正确为前提还是以条件错误为前提的) 另一种就是正则表示式. 字符串匹配给正则表达式:boolean matches(Stirng regex) 用法:String.matches(regex) 当然可以说if...else是万能的,正则表达式是有局限的,不能过分依赖,它只是解决问 题的一种手段而已,并不是必要的. 但往往用正确的使用正则表达式能让

foxmail配置邮箱pop/IMAP

POP设置firefox 第一步: 第二步: 第三步: 第四步 第五步: 1. 打开Foxmail(最新版本Foxmail 7.2版已发布,点击下载),找到右上角三条线按钮,点击按钮后选择"账号管理". 第六步: 点击左下角的"新建",进入Foxmail 新建帐户向导 第七步: 点击"手动设置"进行POP3设置. 注:必须勾选使用SSL端口. pop.qq.com smtp.qq.com 点击创建,自动创建成功 IMAP设置firefox 第一步

Java发送带附件的QQ邮箱

由于腾讯公司给QQ邮箱增加了一个授权码的密码保护,导致之前网上很多代码都不能用,于是就自己敲了一份demo. 注意在密码那里可能需要授权码,具体设置:http://service.mail.qq.com/cgi-bin/help?id=28 jar:javax.mail.jar 1 package xhw; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.File; 6 im

java邮件发送(以163邮箱为例)

1.首先应该开通163邮箱的smtp和pop3,得到授权码 2.其次建立一个web项目,否则需要倒jar包mail.jar 3.创建一个类 4.注意:邮件内容必须为正式话语,否则系统会认为是垃圾邮件而拒收,报错541DT public static void main(String[] args) throws MessagingException { Properties prop=new Properties(); prop.put("mail.host","smtp.1