java使用带账号密码验证的socks代理发送电子邮件

最近有这么一个需求,要使用代理来发送电子邮件,网上查了一下,只能使用socks代理。然后自己琢磨了一下,使用spring整合java Mail使用代理来发送邮件。

废话不多说,直接上代码:

先是写了一个测试代理是否可用的方法,毕竟发邮件也是一个耗时的过程,通过代理发送会更慢一点,如果不事先验证的话发送失败了都不知道是怎么回事。

/**
 * 检查代理是否可用
 * @param proxyIP socks代理IP
 * @param proxyPort socks代理端口
 * @param proxyUserName 代理认证用户名
 * @param proxyPassword 代理认证密码
 * @return boolean 代理可用状况
 */
public boolean checkProxy(String proxyIP,Integer proxyPort,String proxyUserName,String proxyPassword) {
    boolean flag = false;
    //如果代理需要账号密码验证则需要先添加一个验证信息
    if(proxyUserName!=null&&!proxyUserName.isEmpty()&&proxyPassword!=null&&!proxyPassword.isEmpty()){
        Authenticator.setDefault(new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(proxyUserName,proxyPassword.toCharArray());
            }
        });
    }
    try {
        proxyPort = proxyPort ==null?1080:proxyPort;
        Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(proxyIP,proxyPort));
        //通过代理访问qq的网站获取头部信息,如果获取到了则说明代理是OK的,否则代理可能就无效
        URL url = new URL("http://www.qq.com/");
        URLConnection connection = url.openConnection(proxy);
        connection.setConnectTimeout(10000);
        flag = connection.getContentType()!=null;
    } catch (Exception e) {
        e.printStackTrace();
    }  
    return flag;
}

实际上Spring整合java mail发送电子邮件的时候也可以很简单的去使用代理,因为我是为了方便的切换发件账号和代理,因此有些属性就手动构造了,没有使用spring的自动注入,下面就是一个完整的发邮件的demo

/**
 * Spring+JavaMail 使用代理发送邮件
 * @param host 发件服务器 host信息(smtp.xx.xxx)
 * @param fromEmail (发件邮箱,也是发件用户名账号,必须要开通smtp)
 * @param pwd (发件邮箱密码)
 * @param nickName (可以自己定义发件人的昵称)
 * @param toEmail (发送给的用户邮箱)
 * @param title (邮件标题)
 * @param content (邮件内容,可以是HTML)
 * @param proxyIP (代理IP,如不使用代理可以设置null)
 * @param proxyPort (代理端口,如不使用代理可以设置null)
 * @param proxyUserName (代理验证用户名,如不验证可以设置null)
 * @param proxyPassword(代理验证密码,如不验证可以设置null)
 * @return
 */
public static boolean sendEmail(String host,String fromEmail,String pwd,String nickName,String toEmail,String title,String content,String proxyIP,String proxyPort,String proxyUserName,String proxyPassword){
    JavaMailSenderImpl mailSender=new JavaMailSenderImpl();
    Properties javaMailProperties = new Properties();
    javaMailProperties.setProperty("mail.smtp.auth", "true");
    javaMailProperties.setProperty("mail.smtp.timeout", "25000");
    //如果设置了代理则添加代理信息
    if(proxyIP!=null&&proxyIP.matches("([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}")){
        //如果代理需要验证则设置一下验证信息
        if(proxyUserName!=null&&!proxyUserName.isEmpty()&&proxyPassword!=null&&!proxyPassword.isEmpty()){
            Authenticator.setDefault(new Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(proxyUserName,proxyPassword.toCharArray());
                }
            });
            //判断端口号是否合法,否则给默认值1080
            proxyPort = proxyPort !=null&&proxyPort.matches("[1-9]\\d{0-3}|[1-5]\\d{4}|6[0-4]\\d{3}|65[0-4]\\d{2}|655[0-2]\\d|6553[0-5]")?proxyPort:"1080";
        }
        javaMailProperties.setProperty("mail.smtp.socks.host",proxyIP);
        javaMailProperties.setProperty("mail.smtp.socks.port",proxyPort);
    }
    mailSender.setJavaMailProperties(javaMailProperties);
    mailSender.setHost(host);
    mailSender.setUsername(fromEmail);
    mailSender.setPassword(pwd);
    mailSender.setDefaultEncoding("UTF-8");
    MimeMessage mimeMessage = mailSender.createMimeMessage();
    try {
        MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, "UTF-8");
        //设置发件人昵称时必须后面跟上原始的邮件地址
        message.setFrom(nickName+"<"+fromEmail+">");
        message.setSubject(title);
        message.setTo(toEmail);
        message.setText(content, true);
        //邮件中可以添加附件
        message.addAttachment("AttachmentName.ext", new File("/xx/xxx/file.ext"));
        mailSender.send(mimeMessage);
        return true;
    } catch (MessagingException e) {
        Constant.LOG.error(e);
        return false;
    }
}

网上说java发送邮件使用代理只能支持socks且不支持需要认证的,其实是可以支持需要认证的socks代理的。只有自己过实践才知道...


本文地址:http://darren.ink/archives/90/comment-page-1

相关文章:

标签: java, spring, 原创

仅有一条评论

  1. 宝贵的信息。
    非常好的文章!

添加新评论