首页 > 代码库 > 利用HttpURLConnecion通过Nginx向代理邮件服务器发送POST请求
利用HttpURLConnecion通过Nginx向代理邮件服务器发送POST请求
第一步:获取邮件各种参数,通过URLencode和Base64编码之后发送请求参数。
请求参数中,有邮件附件这样的大件,如何当做请求发送呢?
首先,将邮件内容转为字节数组,转为字节数组之后可以当做二进制操作了,保持了附件最原始的面貌,不会被任何其他因素影响。
byte[] att= attachment.getContent(); //附件内容
//利用Base64进行加密传输,虽然加密的不够
Base64 base64 = new Base64(); //org.apache.commons.codec.binary.Base64 ,Base64的作用
//加密之后的字符串
String attStr = new String(base64.encode(attachment.getFileContent()));
StringBuilder sb = new StringBuilder();
//邮件基本信息
sb.append("from=").append(from).append("&to=").append(to)
.append("&pwd=").append(password).append("&cc=").append(cc)
.append("&subject=").append(URLEncoder.encode(subject,"UTF-8")).append("&content=").append(URLEncoder.encode(content,"UTF-8"))
.append("&attachName=").append(URLEncoder.encode(attachName,"UTF-8")).append("&attachFile=").append(URLEncoder.encode(attachContent,"UTF-8"));
ps:由于附件内容可能会存在“+”等URL敏感字符,所以,为了过滤这种字符,最好是用URLEncode,进行utf-8转码后再传输。
把字符串进行utf-8的URLEncoding能防止URL参数乱码,或者过滤敏感字符等。
//String url="http://192.168.10.1:8090/"; //邮件服务器地址
接着就是HttpURLConntion连接了
/**
* 发送URL请求的方法
* @param urlStr 请求的URL地址
* @param content 请求带的参数
* @return 被请求的URL返回的页面代码
*/
public String sendByUrl(String urlStr, String content){
StringBuilder tempStr = null;
HttpURLConnection urlconn = null;
try {
URL url = new URL(urlStr);
//打开连接
urlconn = (HttpURLConnection) url.openConnection();
urlconn.setDoInput(true); // 创建输入流
urlconn.setDoOutput(true); //设置向url的输出,参数要放在http正文内,因此需要设为true
urlconn.setUseCaches(false);
//设置提交方式,默认GET
urlconn.setRequestMethod("POST");
OutputStream out = urlconn.getOutputStream();
//向URL发送参数正文
out.write(content.getBytes());
out.flush();
out.close();
//读取返回信息
InputStream in = urlconn.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(in));
tempStr = new StringBuilder("");
while (rd.read() != -1) {
tempStr.append(rd.readLine());
}
rd.close();
in.close();
}catch(Exception e){
e.printstack();
} finally {
if (urlconn != null)
urlconn.disconnect();
}
return tempStr.toString();
}
接着就是Nginx代理了,由于公司限制,代理转发了两次,
内网10.1能访问内网10.2,内网10.2能访问外网24.2,10.1不能直接访问24.2,只能通过10.2调用24.2的邮件服务器向外发送。
Nginx官网下载的最纯净的配置
第一次 192.168.10.1:
server {
listen 8090;//监听请求的端口
server_name 192.168.10.1; //被监听主机
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_set_header Host $host; /请求的主机
proxy_set_header X-Real-IP $remote_addr; //请求的主机IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.10.2:8090; //接收转发请求的主机
root html;
index index.html index.htm;
}
。。。。。。
第二次:
server {
listen 8090;//监听请求的端口
server_name 192.168.10.2; //被监听主机
#charset koi8-r; //请求编码方式
#access_log logs/host.access.log main; //l连接成功日志
location / {
proxy_set_header Host $host;//请求的主机
proxy_set_header X-Real-IP $remote_addr;//请求的主机IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://202.168.24.2:8090;//接收转发请求的主机
root html;
index index.html index.htm;
}
。。。。。。
由于是post请求,所以基本上不必担心请求长度,但邮件服务器那边也是有限制的,去掉限制就行,毕竟,上传的附件也是有大小限制的。