2013-10-17 109 views
0

問題:有沒有人通過JavaMail從SMTP服務器成功發送電子郵件到hotmail帳戶?如果可以的話,你可以放上可以工作的代碼嗎?使用javamail將電子郵件發送到hotmail時遇到困難

我可以使用我的JavaMail代碼將電子郵件發送到Gmail和雅虎帳戶,但我無法將任何電子郵件發送到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標題。

+1

爲什麼不能發送電子郵件到hotmail? – user2793390

+0

誰說這是不可能的? –

+0

您是否嘗試過比較手機中的電子郵件和您的Java代碼之間的電子郵件標頭/源代碼?我假設你手機上的那個是HTML,而你的java代碼中的那個是純文本。不是說這是問題,而是一個主角。 – user2793390

回答

2

你可以嘗試使用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("[email protected]")); 
      message.setSubject("Can you see this mail ?"); 
      message.addRecipient(Message.RecipientType.TO, 
       new InternetAddress("[email protected]")); 

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

完美。非常感謝。 –

0

如果您的代碼適用於發送到任何其他Internet電子郵件地址,則它也適用於發送到Hotmail。

如果您沒有通用的代碼,請參閱JavaMail sample codeJavaMail FAQ

如果您嘗試使用Hotmail作爲SMTP服務器,請參閱JavaMail FAQ

+0

這是一個很好的猜測,但實際上,Hotmail要求您擁有DKIM,SPF以及其他可能的身份驗證。相信我,就像我之前說過的,相同的代碼將通過Gmail,雅虎,而不是Hotmail。 –

+0

你使用什麼SMTP服務器?如果你使用自己的服務器,你的服務器可能沒有配置任何Hotmail需要相信它是合法服務器而不是垃圾郵件發送者。如果您使用Hotmail SMTP服務器本身,甚至Gmail SMTP服務器,會發生什麼情況? –

+0

順便說一句,我可以發送到Hotmail使用JavaMail很好,所以我們需要更多的細節,瞭解你在做什麼來理解爲什麼它不適合你。 –

相關問題