使用javamail向hotmail发送电子邮件时出现问题
问题:是否有人从SMTP服务器通过JavaMail成功向hotmail帐户发送电子邮件?如果是这样的话,你能提供有效的代码吗 我可以使用JavaMail代码向gmail和yahoo帐户发送电子邮件,但我不能向hotmail帐户发送任何电子邮件。如果我使用手机或其他电子邮件客户端,并使用与JavaMail代码相同的SMTP服务器,那么我确实可以向hotmail帐户发送电子邮件。这让我相信JavaMail遗漏了hotmail认为重要的标志。使用ApacheCommonsJavaMail实现会产生相同的结果使用javamail向hotmail发送电子邮件时出现问题,java,email,smtp,jakarta-mail,Java,Email,Smtp,Jakarta Mail,问题:是否有人从SMTP服务器通过JavaMail成功向hotmail帐户发送电子邮件?如果是这样的话,你能提供有效的代码吗 我可以使用JavaMail代码向gmail和yahoo帐户发送电子邮件,但我不能向hotmail帐户发送任何电子邮件。如果我使用手机或其他电子邮件客户端,并使用与JavaMail代码相同的SMTP服务器,那么我确实可以向hotmail帐户发送电子邮件。这让我相信JavaMail遗漏了hotmail认为重要的标志。使用ApacheCommonsJavaMail实现会产生相同
try{
Email email = new SimpleEmail();
email.setSmtpPort(Integer.parseInt(port));
email.setAuthenticator(new DefaultAuthenticator(from, MyUtilities.getSystemPWD(from)));
email.setDebug(true);
email.setHostName(host);
email.setFrom(from);
email.setSubject(subject);
email.setMsg("test");
email.addTo(to);
email.setStartTLSRequired(true);
email.send();
} catch(Exception ex){
MyLogger.log("MyUtilities.sendEmail: Messaging error",ex);
Logger.getLogger(MyUtilities.class.getName()).log(Level.SEVERE, "MyUtilities.sendEmail: Messaging error", ex);
}
回答:
下面有一个公认的答案,但问题的根本原因是Hotmail需要额外的身份验证头(SPF&DKIM),以证明发件人地址的域名与SMTP服务器关联。使用中间SMTP服务器(如sendgrid)可以解决此问题,因为他们会自动为您解决此问题。但要付出一定的代价
您还可以尝试自己添加所需的SPF和DKIM头。您可以尝试使用sendgrid。我刚刚测试了一下,如果你使用合法的电子邮件地址作为发件人,它似乎可以工作
import javax.mail.*;
import javax.mail.internet.*;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import java.util.Properties;
public class SimpleMail {
private static final String SMTP_HOST_NAME = "smtp.sendgrid.net";
private static final String SMTP_AUTH_USER = "sendgrid-username";
private static final String SMTP_AUTH_PWD = "sendgrid-password";
public static void main(String[] args) throws Exception{
new SimpleMail().test();
}
public void test() throws Exception{
Properties props = new Properties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", SMTP_HOST_NAME);
props.put("mail.smtp.port", 587);
props.put("mail.smtp.auth", "true");
Authenticator auth = new SMTPAuthenticator();
Session mailSession = Session.getDefaultInstance(props, auth);
// uncomment for debugging infos to stdout
// mailSession.setDebug(true);
Transport transport = mailSession.getTransport();
MimeMessage message = new MimeMessage(mailSession);
Multipart multipart = new MimeMultipart("alternative");
BodyPart part1 = new MimeBodyPart();
part1.setText("Checking to see what box this mail goes in ?");
BodyPart part2 = new MimeBodyPart();
part2.setContent("Checking to see what box this mail goes in ?", "text/html");
multipart.addBodyPart(part1);
multipart.addBodyPart(part2);
message.setContent(multipart);
message.setFrom(new InternetAddress("actual@emailaddress-goeshere.com"));
message.setSubject("Can you see this mail ?");
message.addRecipient(Message.RecipientType.TO,
new InternetAddress("person@tosendto.com"));
transport.connect();
transport.sendMessage(message,
message.getRecipients(Message.RecipientType.TO));
transport.close();
}
private class SMTPAuthenticator extends javax.mail.Authenticator {
public PasswordAuthentication getPasswordAuthentication() {
String username = SMTP_AUTH_USER;
String password = SMTP_AUTH_PWD;
return new PasswordAuthentication(username, password);
}
}
}
如果您有代码可以发送到任何其他internet电子邮件地址,那么它也可以发送到Hotmail 如果没有通用的代码,请参阅和
如果您试图使用Hotmail作为SMTP服务器,请参阅。为什么无法向Hotmail发送电子邮件?谁说不可能?您是否尝试比较手机电子邮件和java代码之间的电子邮件标题/源代码?我假设您手机中的是HTML,java代码中的是纯文本。不是说这是问题所在,但这是一个线索。这是一个很好的猜测,但实际上Hotmail要求您具有DKIM、SPF,以及可能的其他身份验证。相信我,就像我之前说的一样,同样的代码会通过gmail、yahoo,但不会通过hotmail。你使用的是什么SMTP服务器?如果您使用自己的服务器,您的服务器可能没有配置Hotmail所需的任何内容,以确保它是合法服务器而不是垃圾邮件发送者。如果您使用Hotmail SMTP服务器本身,甚至Gmail SMTP服务器,会发生什么情况?顺便说一句,我可以使用JavaMail发送到Hotmail,所以我们需要更多关于您所做工作的详细信息,以了解为什么它不适用于您。我刚刚告诉您Hotmail需要什么。您的SMTP服务器很可能具有DKIM、SPF和其他几个凭据。这就是Sendgrid在公认的答案中所考虑的。