javamail通过代理发送邮件

本文介绍如何使用JavaMail通过Socks5代理服务器发送邮件,并提供了详细的代码示例和Socks5代理服务器的安装配置步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们是没办法使用javamail通过一般的代理服务器发送邮件的,比如下面的代码是没有效果的:
        Properties props = System.getProperties();
        props.setProperty("proxySet","true");
        props.setProperty("ProxyHost","192.168.155.1");
        props.setProperty("ProxyPort","1080");
        //或者这样,也是没用
        //Properties props = System.getProperties();
        //props.setProperty("proxySet","true");
        //props.setProperty("http.proxyHost","192.168.155.1");
        //props.setProperty("http.proxyPort","808");

        props.put("mail.smtp.auth", "true");
        props.put("mail.debug", "true");
        // props.put("mail.store.protocol", "pop3");
        // props.put("mail.transport.protocol", "smtp");
        final String username = "username"
        final String password = "password"
        Session session = Session.getDefaultInstance(props,
                new Authenticator() {
                    protected javax.mail.PasswordAuthentication getPasswordAuthentication() {
                        return new javax.mail.PasswordAuthentication(username,
                                password);
                    }
                });
        MimeMessage message = new MimeMessage(session);
        
 

不过可以通过socks网关来访问外网的email服务器,当然,前提是你安装了一个socks服务器。完整的使用代理发送邮件代码如下:
package net.rubyeye.testjms;

import java.util.Date;
import java.util.Properties;
import java.security.Security;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class MailTest {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        // Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
        // final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
        //设置代理服务器
        Properties props = System.getProperties();
        props.setProperty("proxySet", "true");
        props.setProperty("socksProxyHost", "192.168.155.1");
        props.setProperty("socksProxyPort", "1081");
        props.setProperty("mail.smtp.host", "smtp.126.com");
        
        // props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
        // props.setProperty("mail.smtp.socketFactory.fallback", "false");
        // props.setProperty("mail.smtp.port", "465");
        // props.setProperty("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.auth", "true");
        props.put("mail.debug", "true");
        // props.put("mail.store.protocol", "pop3");
        // props.put("mail.transport.protocol", "smtp");
        final String username = "username";
        final String password = "password";
        
        //使用验证
        Session session = Session.getDefaultInstance(props,
                new Authenticator() {
                    protected javax.mail.PasswordAuthentication getPasswordAuthentication() {
                        return new javax.mail.PasswordAuthentication(username,
                                password);
                    }
                });
        MimeMessage message = new MimeMessage(session);
        Address address = new InternetAddress("killme6115@126.com");
        Address toAaddress = new InternetAddress("killme6115@sina.com");
        
        message.setFrom(address);
        message.setRecipient(MimeMessage.RecipientType.TO, toAaddress);
        message.setSubject("测试");
        message.setText("test");
        message.setSentDate(new Date());
        
        Transport.send(message);
        System.out.println("邮件发送!");

    }

}


 

Socks5代理服务器安装及配置文件:

1.找到socks5-v1.0r11.tar.gz这个软件包,我找这个软件包找了有一会,建议在北大天网中搜索,很快的
2.传到服务器上
3.开始编译,安装
#tar xvfz socks5-v1.0r11.tar.gz
#cd socks5-v1.0r11
#./configure --with-threads
#make
#make install
4.开始配置
一般来说安装完后,会在/etc目录下生成socks5.conf(配置文件)和socks5.passwd(用于验证的文件)这两个文件,
下面我把我的配置文件帖出来:

#/etc/socks5.conf
 
#指定SOCKS v5绑定的ip地址和监听的端口。如果不指定绑定的IP将使用0.0.0.0
 
set SOCKS5_BINDINFC 192.168.0.8:1080
 

#忽略ident请求。当客户机没有运行identd时,使用SOCKS5_NOIDENT将降低超时值
 
set SOCKS5_NOIDENT
 

#指定连接停顿最长时间。超过最大值后,socks5断开连接
 
set SOCKS5_TIMEOUT 15
 

#socks5将接受SOCKS V4 协议的请求,默认不接受
 
set SOCKS5_V4SUPPORT
 

#指定同时存在的最大子进程数,Socks5预设为64
 
set SOCKS5_MAXCHILD 4
 

#指定密码文件
 
set SOCKS5_PWDFILE /etc/socks5.passwd
 

#对所有的客户连接都使用username/password用户认证方法
 
auth - - u
 

#允许来自192.168.0.X的任何经过用户认证的连接
 
permit u - 192.168.0.X - - -
 
permit u - 192.168.0.X - - -
 
permit u - 192.168.0.X - - -
 
permit u - 192.168.0.X - - -

 

#/etc/socks5.passwd
 
#用户  密码
 
userA passwdA
 
userB passwdB
 
userC passwdC

前面的一些设置由于我在配置文件里都写了相关的内容,就不在说明了
如果不需要用户验证只需要把

auth - - u
 
改成 auth - - -
 

permit u - 192.168.0.X - - -
 
改成
 
permit - - - - - -


大家注意上面permit - - - - - -这一句,是使任何人都可以使用你的socks5 server,非常不安全(让你作跳板),最好是有点限制

permit - - clientIP - - - 



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值