Android javamail 501 5.5.4 参数无效
Android javamail 501 5.5.4 Invalid argument
我正在尝试使用 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();
}
我正在使用 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库不正确
但是正如您在调试中看到的那样,它能够成功连接到 smtp.mailgun.com。那为什么会出现这个错误呢?
请帮助我。
谢谢
您要连接的服务器要求 HELO
或 EHLO
的参数是主机名或 IP 地址。
您的代码似乎也没有发送。
RFC(RFC2821 第 29 页)似乎有些含糊...
...the client SHOULD send an IP address if no hostname is available
如果这是一项要求,则必须使用“必须”一词。
但是 HELO
/EHLO
的语法描述似乎表明参数是必需的。
还有第 3.6 节(关于域):
- The domain name given in the EHLO command MUST BE either a primary
host name (a domain name that resolves to an A RR) or, if the host
has no name, an address literal as described in section 4.1.1.1.
所以,我终于可以使用 MAILGUN 发送邮件了。但是我不得不放弃使用JAVAMAIL发送的想法,因为我无法解决这个无效参数的问题。
Retrofit 提供了 class 用于使用 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 <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();
}
我建议您使用 RESTful API 而不是 SMTP 旧后端。您可以使用 Jersey 库和 Mailgun 的官方文档,它们提供了准确的示例。
另外,一个重要的免责声明,我最近发布了一个 Java Mailgun 库来简化它。参见 this answer。
我正在尝试使用 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();
}
我正在使用 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库不正确
但是正如您在调试中看到的那样,它能够成功连接到 smtp.mailgun.com。那为什么会出现这个错误呢? 请帮助我。
谢谢
您要连接的服务器要求 HELO
或 EHLO
的参数是主机名或 IP 地址。
您的代码似乎也没有发送。
RFC(RFC2821 第 29 页)似乎有些含糊...
...the client SHOULD send an IP address if no hostname is available
如果这是一项要求,则必须使用“必须”一词。
但是 HELO
/EHLO
的语法描述似乎表明参数是必需的。
还有第 3.6 节(关于域):
- The domain name given in the EHLO command MUST BE either a primary host name (a domain name that resolves to an A RR) or, if the host has no name, an address literal as described in section 4.1.1.1.
所以,我终于可以使用 MAILGUN 发送邮件了。但是我不得不放弃使用JAVAMAIL发送的想法,因为我无法解决这个无效参数的问题。
Retrofit 提供了 class 用于使用 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 <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();
}
我建议您使用 RESTful API 而不是 SMTP 旧后端。您可以使用 Jersey 库和 Mailgun 的官方文档,它们提供了准确的示例。
另外,一个重要的免责声明,我最近发布了一个 Java Mailgun 库来简化它。参见 this answer。