Java:如何从公司域发送电子邮件



我一直试图从自定义域发送电子邮件,试图登录outlook服务器,因为我们将其用作从该方向发送电子邮件的平台,但它给了我一个AuthenticationFailedException;更具体地说:

javax.mail.AuthenticationFailedException: 535 5.7.3 Authentication unsuccessful [PR0P264CA0272.FRAP264.PROD.OUTLOOK.COM]
at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:965)
at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:876)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:780)
at javax.mail.Service.connect(Service.java:388)
at javax.mail.Service.connect(Service.java:246)
at javax.mail.Service.connect(Service.java:195)
at javax.mail.Transport.send0(Transport.java:254)
at javax.mail.Transport.send(Transport.java:124)
at baseDatos.BaseDeDatos.mailMasivo(BaseDeDatos.java:595)
at baseDatos.BaseDeDatos.main(BaseDeDatos.java:167)

我一直在研究一些旧的帖子,这些帖子可能是我问题的解决方案,但我不知道如何在我的代码中实现它。

我的代码看起来像这样:

String to = "to@mail.com";
String from = "from@cdomain";
String password = "password123";
String subject = "Hello";
BodyPart body1 = new MimeBodyPart();
String body= "This is an e-mail";
body1.setText(body);
Multipart mainBody = new MimeMultipart();
mainBody.addBodyPart(body1);

String host = "outlook.office365.com";
Properties properties = System.getProperties();
properties.put("mail.smtp.host", host);
properties.put("mail.smtp.starttls.enable", "true");
properties.setProperty("mail.smtp.auth", "true");
Session session = Session.getInstance(properties, new OutLookAuthenticator(from, password));
Transport transport = session.getTransport("smtp");
Message message = new MimeMessage(session);
message.setSubject(asunto); 
message.setContent(mainBody);
message.setFrom(new InternetAddress(from));
InternetAddress[] address = {new InternetAddress(to)};
message.setRecipient(Message.RecipientType.TO, new InternetAddress(to));

transport.send(message);

更新

我修改了代码以实现spring框架库,这样我就可以同步发送邮件了。现在是这样的:

JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost("outlook.office365.com");
mailSender.setPort(587);
String from = keyboard.nextLine();
mailSender.setUsername(from);
String password = readPassword();
mailSender.setPassword(password);
MimeMessage message = mailSender.createMimeMessage();
final Properties properties = new Properties();
properties.put("mail.smtp.auth", Boolean.TRUE);
properties.put("mail.smtp.starttls.enable", Boolean.TRUE    );
mailSender.setJavaMailProperties(properties);

try {
final MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(text, true);
} catch (MessagingException e) {
e.printStackTrace();
}
mailSender.send(message);

现在,它正在打印这个堆栈跟踪:

Exception in thread "main" org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException: 535 5.7.3 Authentication unsuccessful [MR2P264CA0048.FRAP264.PROD.OUTLOOK.COM]
at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:440)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:361)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:356)
at baseDatos.BaseDeDatos.mailIndividual(BaseDeDatos.java:440)
at baseDatos.BaseDeDatos.main(BaseDeDatos.java:160)

您似乎有错误的凭据,或者您托管项目的服务器可能阻止了一些传出端口。例如,Digital ocean默认情况下会阻塞25端口
但是,在这里您可以找到同步发送邮件的解决方案
其中this.getUsername()this.getPassword()this.getPort()this.getHost()作为您的(邮件服务器(凭据
如果您想在邮件中发送HTML,请参阅.setText(),它将Boolean参数作为第二个参数

p.S顺便说一句,我建议您在新的Thread中发送它,因为它需要时间来发送,然后无论是否成功都会收到响应。然而,这确实取决于您的业务逻辑

JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost(this.getHost());
mailSender.setPort(this.getPort());
mailSender.setUsername(this.getUsername());
mailSender.setPassword(this.getPassword());
MimeMessage message = mailSender.createMimeMessage();
final Properties properties = new Properties();
properties.put("mail.smtp.auth", Boolean.TRUE);
properties.put("mail.smtp.starttls.enable", Boolean.TRUE);
mailSender.setJavaMailProperties(properties);
final MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(fromMail);
helper.setTo(user.getEmail());
helper.setSubject(subject);
helper.setText("<p><strong>Welcome " + body + ",</strong></p>n", true);
mailSender.send(message);

最新更新