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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值