Android javamail 501 5.5.4参数无效

时间:2015-12-10 03:12:55

标签: java android javamail mailgun

我正在尝试使用Mailgun发送电子邮件。 根据mailgun,我使用以下代码:

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("fromaddress@gmail.com"));
            msg.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse("toaddress@gmail.com", 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", "postmaster@sandbox86837*********.mailgun.org", "b071d**********");
            t.sendMessage(msg, msg.getAllRecipients());
            System.out.println("Response: " + t.getLastServerResponse());
            t.close();


}

我正在使用从https://code.google.com/p/javamail-android/downloads/list

下载的javamail api

现在显示以下信息的调试:

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

我不知道这个错误意味着什么?当我用Google搜索时,没有人指出错误或原因的确切原因。它可能是ssl或我的系统缺少一些java库?或者我下载的java lib不正确。

但正如您在调试中看到的那样,它能够成功连接到smtp.mailgun.com。那么为什么这个错误? 请帮助我。

由于

3 个答案:

答案 0 :(得分:0)

您要连接的服务器要求HELOEHLO的参数是主机名或IP地址。

您的代码似乎也没有发送。

RFC(RFC2821第29页)似乎有些模棱两可......

  

...如果没有可用的主机名,客户端应该发送一个IP地址

如果这是一个要求,那么必须使用“必须”这个词。 但HELO / EHLO的语法描述似乎表明该论证是必需的。

同样在第3.6节(在域名上):

  
      
  • EHLO命令中给出的域名必须是主要的     主机名(解析为A RR的域名)或主机名     没有名称,如4.1.1.1节所述的地址文字。
  •   

答案 1 :(得分:0)

所以,最后我能够使用MAILGUN发送邮件。但我不得不放弃使用JAVAMAIL进行发送的想法,因为我无法解决这个无效参数的问题。

Retrofit提供了一个使用MAILGUN发送电子邮件的类。我发布了我在这里用于面对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 <test@address.com>";
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();
}

答案 2 :(得分:0)

我建议您使用RESTful API而不是SMTP遗留后端。您可以使用Jersey库和Mailgun的官方文档,它提供了准确的示例。

此外,还有一个很大的免责声明,我最近发布了一个Java Mailgun库来轻松实现这一目标。请参阅this answer