我从这里尝试了两个答案:Validate smtp server credentials using java without actually sending mail没有正确的结果。
答案适用于Gmail身份验证,但我希望能够覆盖任何SMTP主机。我正在使用smtp.1and1.com
进行测试。每当我提供不正确的凭据(以上两个答案)我仍然会获得成功"消息
我希望将此格式化为第二个答案,这里是我使用的代码:
settings_email_test.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String server = String.valueOf(settings_email_server_inp.getText());
int port = Integer.parseInt(settings_email_port_inp.getText().toString());
String username = String.valueOf(settings_email_username_inp.getText());
String password = String.valueOf(settings_email_password_inp.getText());
boolean auth = true;
String security = "SSL";
if(confirmSMTP(server, port, username, password, auth, security)){
Toast.makeText(getApplicationContext(), "success", Toast.LENGTH_LONG).show();
}
}
});
用这种方法:
public boolean confirmSMTP(String host, int port, String username, String password, boolean auth, String enctype) {
boolean result = false;
try {
Properties props = new Properties();
if (auth) {
props.setProperty("mail.smtp.auth", "true");
} else {
props.setProperty("mail.smtp.auth", "false");
}
if (enctype.endsWith("TLS")) {
props.setProperty("mail.smtp.starttls.enable", "true");
} else if (enctype.endsWith("SSL")) {
props.setProperty("mail.smtp.startssl.enable", "true");
}
Session session = Session.getInstance(props, null);
Transport transport = session.getTransport("smtp");
transport.connect(host, port, username, password);
transport.close();
result = true;
} catch(AuthenticationFailedException e) {
Toast.makeText(getApplicationContext(), "SMTP: Authentication Failed", Toast.LENGTH_LONG).show();
} catch(MessagingException e) {
Toast.makeText(getApplicationContext(), "SMTP: Messaging Exception Occurred", Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "SMTP: Unknown Exception", Toast.LENGTH_LONG).show();
}
return result;
}
注意:我在代码中更改了代码,只是为了使端口为int而auth是一个布尔值。无论哪种方式,当我使用不正确的凭据时,我收到一条成功消息,没有错误消息。虽然如果我使用gmail,一切都运行良好。
我需要做什么才能使其适用于任何SMTP主机?
答案 0 :(得分:0)
我发布的链接中给出的答案都有效 - 我的问题是我的应用程序正在缓存信息,我首先使用正确凭据运行“测试”。由于这些凭证是积极的,并且应用程序缓存了这些凭据,因此它一直在写成功。
我在破坏应用程序时清除了缓存,并且使用它清除了这些凭据。我现在能够得到正确的互动。