阿哲.900 2023-06-08 18:43 采纳率: 66.7%
浏览 51
已结题

使用java 多个邮箱获取认证问题

**使用java 多个邮箱获取认证问题 **

我有一批smtp 账号 想测试获取全部认证 但是发现 传进去之后 调用方法 只有先进去的list的 host 才能认证成功

  • 下方代码 先执行的是smtp.aol.com 地址 所有都能判断认证 都可以成功 但是host地址变了之后 其他的都不能判断

如果把smtp.sina.com 的先放到list里面 新浪的都可以判断 其他的不行
抛的异常是这个 请指点
javax.mail.AuthenticationFailedException: 535 5.7.0 (#AUTH005) Too many bad auth attempts.

package com.itheima.utlis;

import com.itheima.pojo.EmailUser;

import javax.mail.*;
import java.util.ArrayList;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class EmailUtis {

    public static void main(String[] args) {


        ArrayList<EmailUser> emailUsers = new ArrayList<>();

        emailUsers.add(new EmailUser("smtp.aol.com", "thiriot.sharon9986@aol.com", "exhfbwzrqbqjsanq"));
        emailUsers.add(new EmailUser("smtp.aol.com", "thiriot.sharon9986@aol.com", "exhfbwzrqbqjsanq"));

       emailUsers.add(new EmailUser("smtp.sina.com", "gmywgw@sina.com", "0913ca85741ebe91"));
        emailUsers.add(new EmailUser("smtp.sina.com", "gmywgw@sina.com", "0913ca85741ebe91"));






        ExecutorService executor = Executors.newFixedThreadPool(10); // 10 threads in pool

        for (EmailUser emailUser : emailUsers) {
            checkEmail(emailUser.getHost(), emailUser.getEmail(), emailUser.getPassword());


        }

    

    }

    /**
     * @param host     SMTP服务端地址,如qq邮箱为smtp.qq.com
     * @param email    邮箱名
     * @param password 邮箱注册码(非登录名,具体需根据邮箱到官网申请)
     * @return 如果可用返回true
     * @throws MessagingException
     */
    public static Object checkEmail(String host, String email, String password) {
        Properties props = new Properties();

        props.put("mail.transport.protocol", "smtp");// 连接协议
        props.put("mail.smtp.host", host);// 主机名,必须要,也可以使用smtp.sina.com.cn
        //   props.put("mail.smtp.port", 465);// 端口号,写不写无所谓,不确定的情况下,可以不写
        props.put("mail.smtp.auth", "true");// 是否鉴权,必须要
        props.put("mail.smtp.ssl.enable", "true");// 设置是否使用ssl安全连接,一般都使用
        props.put("mail.smtp.starttls.enable", "true");

        Session session = Session.getDefaultInstance(props);
        // session.setDebug(true);

        Transport transport = null;
        try {
            transport = session.getTransport();
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        }


        try {
            //    System.out.println(email + "--" + password);
            transport.connect(email, password);
            System.out.println(email + "认证成功"+session.toString());

            return true;
        } catch (MessagingException e) {
              e.printStackTrace();
            System.out.println(email + "认证失败"+session.toString());
            return false;
        }finally {
            if (transport != null) {
                try {
                    transport.close();
                    props.clone();
                } catch (MessagingException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}


  • 写回答

4条回答 默认 最新

  • CF2301_77400554X 2023-06-08 18:59
    关注

    根据你提供的代码,存在以下问题:

    1、你创建了一个线程池(ExecutorService),但没有将任务提交给线程池执行,而是直接在主线程中调用checkEmail方法。这样做并不会利用线程池的并发执行能力。你可以使用线程池的submit方法将任务提交给线程池执行。

    2、你的异常信息显示为javax.mail.AuthenticationFailedException: 535 5.7.0 (#AUTH005) Too many bad auth attempts.,这意味着认证失败次数过多。可能原因是你频繁地使用相同的账号和密码进行认证,导致邮件服务提供商限制了你的访问。你可以尝试增加认证间隔时间或者使用不同的邮箱账号进行测试,以避免频繁认证的限制。

    3、在循环中,你创建了多个Session对象,并将其传递给checkEmail方法。这样做并不会提高性能,因为在每次循环中都会重新创建一个Session对象。建议在循环外部创建一个Session对象,并将其传递给checkEmail方法。

    4、在finally块中,你使用了props.clone()来复制Properties对象,但是这并不是复制对象的正确方式。clone()方法是浅拷贝,只会复制对象的引用,不会复制对象的内容。你可以直接创建一个新的Properties对象来替代原来的对象。

    根据上述建议,你可以尝试修改代码如下:

    import com.itheima.pojo.EmailUser;
    
    import javax.mail.*;
    import java.util.ArrayList;
    import java.util.Properties;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class EmailUtis {
    
        public static void main(String[] args) {
            ArrayList<EmailUser> emailUsers = new ArrayList<>();
            emailUsers.add(new EmailUser("smtp.aol.com", "thiriot.sharon9986@aol.com", "exhfbwzrqbqjsanq"));
            emailUsers.add(new EmailUser("smtp.sina.com", "gmywgw@sina.com", "0913ca85741ebe91"));
    
            ExecutorService executor = Executors.newFixedThreadPool(10);
    
            for (EmailUser emailUser : emailUsers) {
                executor.submit(() -> checkEmail(emailUser.getHost(), emailUser.getEmail(), emailUser.getPassword()));
            }
    
            executor.shutdown();
        }
    
        public static void checkEmail(String host, String email, String password) {
            Properties props = new Properties();
            props.put("mail.transport.protocol", "smtp");
            props.put("mail.smtp.host", host);
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.ssl.enable", "true");
            props.put("mail.smtp.starttls.enable", "true");
    
            Session session = Session.getDefaultInstance(props);
    
            Transport transport = null;
            try {
                transport = session.getTransport();
                transport.connect(email, password);
                System.out.println(email + "认证成功" + session.toString());
            } catch (MessagingException e) {
                e.printStackTrace();
                System.out.println(email + "认证失败" + session.toString());
            } finally {
                if (transport != null) {
                    try {
                        transport.close();
                    } catch (MessagingException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
    

    这只是一个简单的示例代码,仅演示了如何将任务提交给线程池执行,并创建了一个单独的Session对象。你可能需要根据自己的需求进一步优化代码。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 6月16日
  • 已采纳回答 6月8日
  • 创建了问题 6月8日