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服务器。 有关socksProxyHost
和socksProxyPort
属性的最新文档,请参阅网络属性指南 。 这些是系统级属性,而不是JavaMail会话属性。 它们可以在调用应用程序时从命令行进行设置,例如:java -DsocksProxyHost=myproxy ...
此工具可用于将SMTP,IMAP和POP3通信从JavaMail指向SOCKS代理服务器。 请注意,设置这些属性会将所有 TCP套接字指向SOCKS代理,这可能会对应用程序的其他方面产生负面影响。
没有这样的SOCKS服务器,如果要使用JavaMail间接访问防火墙外的邮件服务器,您可以使用诸如Corkscrew之类的程序或通过HTTP代理服务器连接 TCP 连接 。 JavaMail不支持通过HTTP代理Web服务器的直接访问。