2 smilec3150 smilec3150 于 2017.01.11 15:34 提问

Java利用163邮箱发送邮件出现问题,卡了我几天了,求大神为我解答!!!

我smtp服务开了,邮件可以发送,但是问题是
我第一次开启tomcat 发邮件填写正确密码,可以成功发送,如果再不重启tomcat的情况发再次发送邮件,就不管输入什么密码都能发送成功。
同样的,第一次发送邮件 如果输入的是错误的密码,在不重启tomcat的情况下 再次发送邮件 输入正确密码,还是提示身份验证失败。 求大神为我解惑啊。。

    public String findMail() throws Exception {
        try {

            Properties pro = new Properties();
            pro.put("mail.smtp.host", "smtp.163.com");
            pro.put("mail.smtp.auth", "true");
            // SSL加密
            pro.put("mail.smtp.ssl.enable", "true");
            pro.put("mail.smtp.ssl.socketFactory", "465");
            // 根据邮件的会话属性构造一个发送邮件的Session,这里需要注意的是用户名那里不能加后缀,否则便不是用户名了
            // 还需要注意的是,这里的密码不是正常使用邮箱的登陆密码,而是客户端生成的另一个专门的授权码
            MailAuthenticator authenticator = new MailAuthenticator(username, password);
            Session session = Session.getDefaultInstance(pro, authenticator);
            // 根据Session 构建邮件信息
            Message message = new MimeMessage(session);
            // 创建邮件发送者地址
            Address from = new InternetAddress(username);
            // 设置邮件消息的发送者
            message.setFrom(from);
            // 验证收件人邮箱地址
            List<String> toAddressList = new ArrayList<>();
            toAddressList.add(toemail);
            StringBuffer buffer = new StringBuffer();
            if (!toAddressList.isEmpty()) {
                String regEx = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
                Pattern p = Pattern.compile(regEx);
                for (int i = 0; i < toAddressList.size(); i++) {
                    Matcher match = p.matcher(toAddressList.get(i));
                    if (match.matches()) {
                        buffer.append(toAddressList.get(i));
                        if (i < toAddressList.size() - 1) {
                            buffer.append(",");
                        }
                    }
                }
            }
            String toAddress = buffer.toString();
            if (!toAddress.isEmpty()) {
                // 创建邮件的接收者地址
                Address[] to = InternetAddress.parse(toAddress);
                // 设置邮件接收人地址
                message.setRecipients(Message.RecipientType.TO, to);
                // 邮件主题
                // message.setSubject("java邮件测试");
                message.setSubject(subject);
                // 邮件容器
                MimeMultipart mimeMultiPart = new MimeMultipart();
                // 设置HTML
                BodyPart bodyPart = new MimeBodyPart();
                // 邮件内容
                String htmlText = body;
                bodyPart.setContent(htmlText, "text/html;charset=utf-8");
                mimeMultiPart.addBodyPart(bodyPart);
                // 添加附件
                List<String> fileAddressList = new ArrayList<String>();
                fileAddressList.add(file);
                if (fileAddressList != null) {
                    BodyPart attchPart = null;
                    for (int i = 0; i < fileAddressList.size(); i++) {
                        if (!fileAddressList.get(i).isEmpty()) {
                            attchPart = new MimeBodyPart();
                            // 附件数据源
                            DataSource source = new FileDataSource(
                                    fileAddressList.get(i));
                            // 将附件数据源添加到邮件体
                            attchPart.setDataHandler(new DataHandler(source));
                            // 设置附件名称为原文件名
                            attchPart.setFileName(MimeUtility.encodeText(source.getName()));
                            mimeMultiPart.addBodyPart(attchPart);
                        }
                    }
                }
                message.setContent(mimeMultiPart);
                message.setSentDate(new Date());
                // 保存邮件
                message.saveChanges();
                // 发送邮件
                Transport.send(message);
                System.out.println("发送成功");
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("错误原因:"+e);
        }
        return null;
    }

异常信息:javax.mail.AuthenticationFailedException: Authentication failed

2个回答

dcxy0
dcxy0   Ds   Rxr 2017.01.11 15:59

没明白你要是做一个发送邮件的服务类,然后别人输入自己的邮箱去发送邮件?

你可以检查下在最后发送请求时候的密码是不是你新输入的。。。。。。

smilec3150
smilec3150 回复dcxy0: 我用debug运行,最后发送请求的时候的密码都是我新输入的
11 个月之前 回复
smilec3150
smilec3150 回复dcxy0: 是的,参数是都可以获取到的,现在的问题是验证身份只能验证一次,如果第一次验证通过了,那么接下来每一次不管输什么密码都能够验证通过
11 个月之前 回复
dcxy0
dcxy0 回复smilec3150: 那也是可以的啊,SSH不也可以获取用户输入的参数?
11 个月之前 回复
smilec3150
smilec3150 回复dcxy0: 主要是我们这个项目用的框架是SSH,这个是不能变的。
11 个月之前 回复
dcxy0
dcxy0 回复smilec3150: 那你可以用servlet去做吧,让用户前台输入用户名和密码,然后你连接,在发送就可以了
11 个月之前 回复
smilec3150
smilec3150 是的 做一个发送邮件的服务类,然后别人来发邮件,现在我是输入自己的邮箱和163的授权码,但是出现了上述问题
11 个月之前 回复
yang292292
yang292292   2017.01.11 15:59

这个问题 貌似是你调用的
Session session = Session.getDefaultInstance(pro, authenticator);
这里的问题 你可以试试 使用 Session.getInstance 方法

smilec3150
smilec3150 回复shamyang: 这个方法我试过了,问题没有解决
11 个月之前 回复
smilec3150
smilec3150 这个方法我试过了,问题解决不了
11 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!