首页 > 代码库 > 利用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请求,所以基本上不必担心请求长度,但邮件服务器那边也是有限制的,去掉限制就行,毕竟,上传的附件也是有大小限制的。