提问者:小点点

SMTP重复发送消息-需要身份验证


我正在尝试测试通过SMTP发送邮件的两种方法:

第一种方法:

public void sendEmail(String emailRecip, String subject, String texte, List<String> listAttachedFile){


        Session session = Session.getInstance(props,
                new javax.mail.Authenticator() {
                    @Override
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(username, password);
                    }
                });

        try {
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(username));
            String address = emailRecip;
            InternetAddress[] iAdressArray = InternetAddress.parse(address);
            message.setRecipients(Message.RecipientType.TO, iAdressArray);
            message.setSubject(subject);
            MimeBodyPart mbp1 = new MimeBodyPart();
            mbp1.setText(texte);
            Multipart mp = new MimeMultipart();
            mp.addBodyPart(mbp1);
            for (String attachedFile : listAttachedFile) {
                if (attachedFile != null) {
                    addAttachment(mp, attachedFile);
                }
            }
            message.setContent(mp);
            Transport.send(message);

        } catch (MessagingException e) {
            isMsgSent = "0";
        } catch (IOException ex) {
            Logger.getLogger(SMTPRepositoryImpl.class.getName()).log(Level.SEVERE, null, ex);
        }

}

第二种方法:重复发送消息:

public void sendMailrepeatdly(String emailRecip, String subject, String texte, List<String> listAttachedFile){
Session session = Session.getInstance(props,null);

        /*Session session = Session.getInstance(props,
         new javax.mail.Authenticator() {
         @Override
         protected PasswordAuthentication getPasswordAuthentication() {
         return new PasswordAuthentication(username, password);
         }
         });*/

        try {
            MimeMessage message = new MimeMessage(session);
            String address = emailRecip;
            InternetAddress[] iAdressArray = InternetAddress.parse(address);

            message.setFrom(new InternetAddress(username));
            message.setRecipients(Message.RecipientType.TO, iAdressArray);
            message.setSubject(subject);
            BodyPart messageBodyPart = new MimeBodyPart();
            messageBodyPart.setText(texte);
            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(messageBodyPart);
            messageBodyPart = new MimeBodyPart();

            for (String attachedFile : listAttachedFile) {
                if (attachedFile != null) {
                    addAttachment(multipart, attachedFile);
                }
            }

            multipart.addBodyPart(messageBodyPart);
            message.setContent(multipart);
            message.saveChanges();
            try {
                long startTime = System.currentTimeMillis();
                Transport tr = session.getTransport("smtps");
                tr.connect(host, username, password);
               // tr.sendMessage(message,message.getAllRecipients() );
                for (Address recipient : message.getAllRecipients()) {
                    tr.sendMessage(message, new Address[]{recipient});
                }
                tr.close();

            } catch (SendFailedException sfe) {
                System.out.println(sfe);
            } catch (IOException ex) {
                Logger.getLogger(SMTPRepositoryImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
        } catch (MessagingException e) {

        }

}

第一种方法效果很好,但第二种方法总是出错:

com. sun.mail.smtp.SMTPSendFailedException:530-5.5.1需要身份验证。

调试时,调用tr. sendMessage(消息,新地址[]{收件人})时抛出异常SendFailedException;

在第二种方法中,我的代码中有遗漏吗?有什么建议吗?

SMPT服务器的属性包括:

mail.smtp.auth=真

mail.smtp.starttls.enable = true

mail.smtp.host = smtp.gmail.com

mail.smtp.port = 587


共1个答案

匿名用户

您使用的是“smtps”协议,但您设置了“smtp”协议的属性。更改代码以使用“smtp”协议。