使用javamail将电子邮件发送到hotmail时遇到问题 [英] Trouble sending email to hotmail using javamail

查看:163
本文介绍了使用javamail将电子邮件发送到hotmail时遇到问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题:有没有人曾经通过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服务器相关联.使用诸如sendgrid之类的中间SMTP服务器可以解决此问题,因为它们将自动为您完成.

您也可以尝试自己添加所需的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);
            }
        }
    }

Question: Has anyone ever successfully sent an email to a hotmail account through JavaMail from an SMTP server? If so could you put up the code that worked?

I can send emails to gmail and yahoo accounts using my JavaMail code but I can not send any emails to hotmail accounts. If I use my phone or another email client and use the same SMTP server as my JavaMail code then I can indeed send emails to hotmail accounts. This leads me to believe JavaMail leaves out a flag that hotmail seems to think is important. Using the Apache Commons JavaMail implementation produces the same results.

        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);                
        }

Answer: There is an accepted answer below but the underlying cause of the problem is that Hotmail requires extra authentication headers (SPF & DKIM) to prove the domain name of your from address is associated with the SMTP server. Using an intermediary SMTP server, like sendgrid, can solve the problem as they will do it for you automatically..at a cost.

You can also attempt to add the needed SPF and DKIM headers yourself.

解决方案

You can try using sendgrid. I just tested it out and if you use legitimate email addresse for the from, it seems to work.

    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);
            }
        }
    }

这篇关于使用javamail将电子邮件发送到hotmail时遇到问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆