2015-12-10 43 views
1

我正在嘗試使用Mailgun發送電子郵件。 據mailgun,我使用下面的代碼:Android javamail 501 5.5.4無效參數

public static void TestMail() throws Exception 
{ 

      Properties props = System.getProperties(); 
      props.put("mail.smtps.host","smtp.mailgun.org"); 
      props.put("mail.debug", "true"); 
      props.put("mail.verbose", "true"); 
      props.put("mail.smtps.auth","true"); 
      Session session = Session.getInstance(props, null); 
      Message msg = new MimeMessage(session); 
      msg.setFrom(new InternetAddress("[email protected]")); 
      msg.setRecipients(Message.RecipientType.TO, 
        InternetAddress.parse("[email protected]", false)); 
      msg.setSubject("Hello"); 
      msg.setText("Testing some Mailgun awesomness"); 
      msg.setSentDate(new Date()); 
      SMTPTransport t = 
        (SMTPTransport)session.getTransport("smtps"); 
      t.setStartTLS(true); 
      t.connect("smtp.mailgun.com", "[email protected]*********.mailgun.org", "b071d**********"); 
      t.sendMessage(msg, msg.getAllRecipients()); 
      System.out.println("Response: " + t.getLastServerResponse()); 
      t.close(); 


} 

我使用從下載的JavaMail API:https://code.google.com/p/javamail-android/downloads/list

現在在調試中顯示以下信息:

DEBUG: JavaMail version 1.4.1 
DEBUG: not loading file: /system/lib/javamail.providers 
DEBUG: java.io.FileNotFoundException: /system/lib/javamail.providers: open failed: ENOENT (No such file or directory) 
DEBUG: not loading resource: /META-INF/javamail.providers 
DEBUG: not loading resource: /META-INF/javamail.default.providers 
DEBUG: failed to load any providers, using defaults 

DEBUG: not loading resource: /META-INF/javamail.default.address.map 
DEBUG: !anyLoaded 
DEBUG: not loading resource: /META-INF/javamail.address.map 
DEBUG: not loading file: /system/lib/javamail.address.map 
DEBUG: java.io.FileNotFoundException: /system/lib/javamail.address.map: open failed: ENOENT (No such file or directory) 
DEBUG: failed to load address map, using defaults 
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc.,1.4.1] 
DEBUG SMTP: useEhlo true, useAuth true 


DEBUG SMTP: trying to connect to host "smtp.mailgun.com", port 465, isSSL true 
220 ak47 ESMTP ready 
DEBUG SMTP: connected to host "smtp.mailgun.com", port: 465 
EHLO 
501 5.5.4 Invalid argument 
HELO 
501 5.5.4 Invalid argument 

我不知道這個錯誤是什麼意思?當我搜索時沒有人指出錯誤或原因的確切原因。它可能是SSL或我的系統缺少一些Java庫?或者我下載的java lib不正確。

但正如您在調試中看到的,它能夠成功連接到smtp.mailgun.com。那爲什麼這個錯誤呢? 請幫助我。

感謝

回答

0

因此,最後我能夠使用MAILGUN發送郵件。但我不得不放棄使用JAVAMAIL進行發送的想法,因爲我無法解決無效參數的問題。

改造提供了一個類使用MAILGUN.I我張貼我這裏使用的任何人與Mailgun面臨問題的代碼發送電子郵件:

public interface SendMailApi { 
@Headers({ACCEPT_JSON_HEADER}) 
@FormUrlEncoded 
@POST("/messages") 
void authUser(
     @Header("Authorization") String authorizationHeader, 
     @Field("from") String from, 
     @Field("to") String to, 
     @Field("subject") String subject, 
     @Field("text") String text, 
     Callback<MailGunResponse> cb 
); 

}

public void sendMail(String to, String subject, String msg,  Callback<MailGunResponse> cb){ 
String from = "test <[email protected]>"; 
String clientIdAndSecret = "api" + ":" + "key-*******"; 
String authorizationHeader = BASIC + " " +  Base64.encodeToString(clientIdAndSecret.getBytes(), Base64.NO_WRAP); 
sendMailApi.authUser(authorizationHeader,from, to, subject, msg, cb); 
} 

public MailGun() { 
RestAdapter restAdapter = getAuthAdapter(); 
sendMailApi = restAdapter.create(SendMailApi.class); 
} 

private RestAdapter getAuthAdapter(){ 
RestAdapter.LogLevel logLevel = RestAdapter.LogLevel.FULL; 
if(DEBUG)logLevel = RestAdapter.LogLevel.FULL; 
return new RestAdapter.Builder() 
     .setEndpoint(ENDPOINT) 
     .setConverter(new GsonConverter(new Gson())) 
     .setLogLevel(logLevel) 
     .build(); 
} 
0

的服務器正在連接被要求的參數傳遞給HELOEHLO是一個主機名或IP地址。

您的代碼似乎也沒有發送。

的RFC(RFC2821第29頁),似乎有些模糊...

...客戶端,如果沒有主機名可用

應該發送一個IP地址,其中言必如果這是一項要求,將會被使用。 但是HELO/EHLO的語法描述似乎表明該參數是必需的。

另外,在第3.6節(上域):

  • 在EHLO命令給定必須是主 主機名(解析爲一個A RR一個域名)或域名,如果主機 沒有名稱,則如4.1.1.1節中所述的地址字面值。
+1

如果JavaMail沒有發送主機地址,那是因爲JDK,呃,Android非Java運行時,無法計算出主機的名稱。您可以將[mail.smtp.localhost屬性](https://javamail.java.net/nonav/docs/api/com/sun/mail/smtp/package-summary.html)設置爲您想要的主機名在HELO/EHLO命令中使用。此外,你可能想嘗試更新的[JavaMail for Android](https://java.net/projects/javamail/pages/Home#JavaMail_for_Android)。 –

+0

@BillShannon OP有什麼理由不應該使用當前版本? Google Code中的JAR是真實的還是別人的替代品? – EJP

+0

@Jim那麼,如果我設置了mail.smtp.localhost propery,那麼足以滿足主機名的要求? 我的意思是,如何使用命令helo/ehlo。 或者簡單地說,我需要在這裏做什麼? –

0

我建議你使用RESTful API而不是SMTP傳統後端。您可以使用Jersey庫和Mailgun的官方文檔,它提供了準確的示例。另外,還有一個很大的免責聲明,我最近發佈了一個Java Mailgun庫來緩解這個問題。見this answer