Java调用Hotmail SMTP发邮件时遭遇554.5.2.252错误
解决Java发送Hotmail邮件时554.5.2.252 SendAsDenied错误
错误原因
错误信息554 5.2.252 SendAsDenied; sansalnuray@hotmail.com not allowed to send as Sansal@SansalPC.mshome.net明确说明:你的JavaMail程序没有指定合法的发件人地址,默认使用了本地主机名Sansal@SansalPC.mshome.net作为发件人标识,但Hotmail/Office365的SMTP服务器只允许你用登录账号sansalnuray@hotmail.com作为发件人发送邮件,因此触发了发送权限拒绝的错误。
解决方案
在构建邮件时,必须显式设置与SMTP登录账号一致的发件人地址,同时修正内容类型的错误写法。
修改后的完整代码
package utilities; import java.io.IOException; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; public class SecureEmail { Session newSession = null; MimeMessage mimeMessage = null; public static void main(String args[]) throws AddressException, MessagingException, IOException { SecureEmail mail = new SecureEmail(); mail.setupServerProperties(); mail.draftEmail(); mail.sendEmail(); } private void sendEmail() throws MessagingException { String fromUser = "sansalnuray@hotmail.com"; String fromUserPassword = "***"; String emailHost = "smtp.office365.com"; Transport transport = newSession.getTransport("smtp"); transport.connect(emailHost, fromUser, fromUserPassword); transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients()); transport.close(); System.out.println("Email successfully sent!!!"); } private MimeMessage draftEmail() throws AddressException, MessagingException, IOException { String[] emailReceipients = {"sansalnuray@gmail.com"}; String emailSubject = "Test Mail"; String emailBody = "Test Body of my email"; mimeMessage = new MimeMessage(newSession); // 显式设置发件人地址,与SMTP登录账号一致 mimeMessage.setFrom(new InternetAddress("sansalnuray@hotmail.com")); for (int i =0 ;i<emailReceipients.length;i++) { mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(emailReceipients[i])); } mimeMessage.setSubject(emailSubject); MimeBodyPart bodyPart = new MimeBodyPart(); // 修正内容类型写法:text/html 或 text/plain bodyPart.setContent(emailBody,"text/html"); MimeMultipart multiPart = new MimeMultipart(); multiPart.addBodyPart(bodyPart); mimeMessage.setContent(multiPart); return mimeMessage; } private void setupServerProperties() { Properties properties = System.getProperties(); properties.put("mail.smtp.port", "587"); properties.put("mail.smtp.auth", "true"); properties.put("mail.smtp.starttls.enable", "true"); // 推荐使用Session.getInstance而非getDefaultInstance,避免共享配置冲突 newSession = Session.getInstance(properties,null); } }
额外注意事项
- 如果你的Hotmail账号开启了两步验证,需要使用应用密码替代普通登录密码
- 确保SMTP服务器地址
smtp.office365.com、端口587、STARTTLS启用的配置正确 - 避免使用
Session.getDefaultInstance(),它会共享全局Session配置,可能导致后续邮件发送出现异常
内容的提问来源于stack exchange,提问作者Sansal
相关产品推荐
相关产品推荐

