java发送邮件功能支持代理,但是不支持http代理,支持sock代理(支持SOCKS V4或V5协议)并且连接代理不需要用户名和密码。

使用的是JDK版本需要1.5或者更高,javaMail包必须是1.4.5或者更新,可以用mail.smtp.socks.host和mail.smtp.socks.port

public Properties getProperties() {
        Properties props = new Properties();
        props.setProperty("proxySet", "true");
        props.setProperty("mail.smtp.socks.host","代理IP");
        props.setProperty("mail.smtp.socks.port","代理端口");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", "smtp.163.com");
        return props;

如果JavaMail包很旧(1.4.5之前的),这种方法不建议使用。

public Properties getProerties() {
        Properties props = System.getProperties();
        props.setProperty("proxySet", "true");
        props.setProperty("socksProxyHost","代理IP");
        props.setProperty("socksProxyPort","代理端口");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", "smtp.163.com");
        return props;

这样也可以实现通过代理发邮件,但是必须使用System.getProperties(),这是系统级属性,会将TCP套接字指向SOCKS代理,例如数据库连接。

 实现发邮件功能:

public void sendMessage(String msg) throws Exception {
        Properties props = getPro();
        // 获得邮件会话对象
        Session session = Session.getInstance(props, new SmtpAuthenticator(
                "邮件用户名", "邮件密码"));
        MimeMessage mimeMessage = new MimeMessage(session);
        mimeMessage.setFrom(new InternetAddress("test1@163.com"));// 发件人
        // 一个人
        mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("test2@163.com"));// 收件人
        mimeMessage.setSubject("认证接口欠费或异常");
        mimeMessage.setSentDate(new Date());// 发送日期
        Multipart mp = new MimeMultipart("related");// 发送HTML格式的邮箱
        BodyPart bodyPart = new MimeBodyPart();// 正文
        bodyPart.setDataHandler(new DataHandler(msg, "text/html;charset=GBK"));// 网页格式
        mp.addBodyPart(bodyPart);
        mimeMessage.setContent(mp);// 设置邮件内容对象
        Transport.send(mimeMessage);// 发送邮件

SmtpAuthenticator.java

class SmtpAuthenticator extends Authenticator {
        String username = null;
        String password = null;
        // SMTP身份验证
        public SmtpAuthenticator(String username, String password) {
            this.username = username;
            this.password = password;
        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(this.username, this.password);

下面是官方文档解释:

问:如何将JavaMail配置为通过我的代理服务器工作? 
A: JavaMail当前不支持通过Web代理服务器访问邮件服务器。 使用代理服务器的主要原因之一是允许来自公司网络的HTTP请求通过公司防火墙。 防火墙通常会阻止对Internet的大多数访问,但将允许来自代理服务器的请求通过。 此外,公司网络内的邮件服务器将对电子邮件执行类似的功能,通过SMTP接受邮件并将其转发到Internet上的最终目的地,并接受传入邮件并将其发送到相应的内部邮件服务器。

如果您的代理服务器支持SOCKS V4或V5协议( http://www.socks.nec.com/aboutsocks.html,RFC1928 )并允许匿名连接,并且您使用的是JDK 1.5或更高版本和JavaMail 1.4.5或较新的,您可以通过设置com.sun.mail.smtp软件包的javadocs中所述的“mail.smtp.socks.host”属性,在每个会话,每个协议的基础上配置SOCKS代理。 类似的属性存在于“imap”和“pop3”协议。

如果您使用的是旧版本的JDK或JavaMail,则可以让Java运行时将所有TCP套接字连接指向SOCKS服务器。 有关socksProxyHostsocksProxyPort属性的最新文档,请参阅网络属性指南 。 这些是系统级属性,而不是JavaMail会话属性。 它们可以在调用应用程序时从命令行进行设置,例如:java -DsocksProxyHost=myproxy ... 此工具可用于将SMTP,IMAP和POP3通信从JavaMail指向SOCKS代理服务器。 请注意,设置这些属性会将所有 TCP套接字指向SOCKS代理,这可能会对应用程序的其他方面产生负面影响。

没有这样的SOCKS服务器,如果要使用JavaMail间接访问防火墙外的邮件服务器,您可以使用诸如Corkscrew之类的程序或通过HTTP代理服务器连接 TCP 连接 。 JavaMail不支持通过HTTP代理Web服务器的直接访问。