【问题标题】:Trouble sending email to hotmail using javamail使用 javamail 向 hotmail 发送电子邮件时遇到问题
【发布时间】:2013-10-25 11:14:15
【问题描述】:

问题: 有没有人通过 JavaMail 从 SMTP 服务器成功地向 hotmail 帐户发送电子邮件?如果是这样,您能否提供有效的代码?

我可以使用我的 JavaMail 代码向 gmail 和 yahoo 帐户发送电子邮件,但我无法向 hotmail 帐户发送任何电子邮件。如果我使用我的电话或其他电子邮件客户端并使用与我的 JavaMail 代码相同的 SMTP 服务器,那么我确实可以向 hotmail 帐户发送电子邮件。这让我相信 JavaMail 遗漏了 hotmail 似乎认为很重要的标志。使用 Apache Commons JavaMail 实现会产生相同的结果。

        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 标头。

【问题讨论】:

  • 为什么不能给hotmail发邮件?
  • 谁说不可能?
  • 您是否尝试比较手机中的电子邮件和 Java 代码之间的电子邮件标头/源代码?我假设您手机中的一个是 HTML,而您的 java 代码中的一个是纯文本。不是说这是问题所在,但这是一个线索。

标签: java email smtp jakarta-mail


【解决方案1】:

您可以尝试使用 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);
            }
        }
    }

【讨论】:

    【解决方案2】:

    如果您的代码可以发送到任何其他 Internet 电子邮件地址,它也应该可以发送到 Hotmail。

    如果您没有通用的代码,请参阅 JavaMail sample codeJavaMail FAQ

    如果您尝试使用 Hotmail 作为您的 SMTP 服务器,请参阅JavaMail FAQ

    【讨论】:

    • 这是一个不错的猜测,但实际上 Hotmail 要求您具有 DKIM、SPF 和可能的其他一些身份验证。相信我,就像我之前所说的,相同的代码会通过 gmail、yahoo,但不会通过 hotmail。
    • 您使用的是什么 SMTP 服务器?如果您使用自己的服务器,则您的服务器可能没有配置任何 Hotmail 需要相信它是合法服务器而不是垃圾邮件发送者的东西。如果您使用 Hotmail SMTP 服务器本身,甚至是 Gmail SMTP 服务器,会发生什么情况?
    • 顺便说一句,我可以使用 JavaMail 很好地发送到 Hotmail,所以我们需要更多关于您正在做什么的详细信息,以了解它为什么不适合您。
    • 我刚刚告诉你 Hotmail 需要什么。您的 SMTP 服务器很可能具有 DKIM、SPF 和其他几个凭据。这就是 Sendgrid 在接受的答案中所关心的。
    猜你喜欢
    • 2016-02-04
    • 2012-04-06
    • 1970-01-01
    • 2012-03-10
    • 2019-01-18
    • 1970-01-01
    • 2016-02-22
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多