【问题标题】:Javax.mail.AuthenticationFailedExceptionJavax.mail.AuthenticationFailedException
【发布时间】:2015-06-24 03:54:02
【问题描述】:

我正在尝试使用 Gmail smtp 服务器从我的应用程序发送电子邮件。为此,我使用 javax 库。

MailSender.java

public class MailSender {

final String emailPort = "587";// gmail's smtp port for tls
final String smtpAuth = "true";
final String starttls = "true";
final String emailHost = "smtp.gmail.com";

String fromEmail;
String fromPassword;
String toEmail;
String emailSubject;
String emailBody;

Properties emailProperties;
Session mailSession;
MimeMessage emailMessage;

public MailSender() {

}

public MailSender(String fromEmail, String fromPassword, String toEmail, String emailSubject, String emailBody) {
    this.fromEmail = fromEmail;
    this.fromPassword = fromPassword;
    this.toEmail = toEmail;
    this.emailSubject = emailSubject;
    this.emailBody = emailBody;

    emailProperties = System.getProperties();
    emailProperties.put("mail.smtp.port", emailPort);
    emailProperties.put("mail.smtp.auth", smtpAuth);
    emailProperties.put("mail.smtp.starttls.enable", starttls);

    Log.i("MAIL_SENDER", "Mail server properties set.");
}

public MimeMessage createEmailMessage() throws AddressException, MessagingException, UnsupportedEncodingException {

    mailSession = Session.getInstance(emailProperties, new javax.mail.Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(fromEmail, fromPassword);
        }
    });
    emailMessage = new MimeMessage(mailSession);

    emailMessage.setFrom(new InternetAddress(fromEmail, fromEmail));
    emailMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail));
    emailMessage.setSubject(emailSubject);
    //emailMessage.setContent(emailBody, "text/html");// for a html email
    emailMessage.setText(emailBody);// for a text email

    Log.i("MAIL_SENDER", "Email Message created.");

    return emailMessage;
}

public void sendMail() throws AddressException, MessagingException {

    Transport transport = mailSession.getTransport("smtp");
    transport.connect(emailHost, fromEmail, fromPassword);
    transport.sendMessage(emailMessage, emailMessage.getAllRecipients());
    transport.close();

    Log.i("MAIL_SENDER", "Email sent successfully.");
}

}

这是我从活动/服务发送电子邮件的方式:

private void sendEmail(String email) throws Exception{
    String from = "myemail@gmail.com";
    String pass = "mypass";
    String to = email;
    String subject = getString(R.string.email_subject);
    String body = location_link;

    sendMailTask task = new sendMailTask();
    task.execute(from, pass, to, subject, body);
}

private class sendMailTask extends AsyncTask<Object, Object, Object> {

    @Override
    protected Object doInBackground(Object... args) {
        try {
            MailSender mail = new MailSender(args[0].toString(),
                    args[1].toString(), args[2].toString(), args[3].toString(),
                    args[4].toString());
            mail.createEmailMessage();
            mail.sendMail();
        }catch (Exception e) {
            Log.e("EMAIL", e.getMessage(), e);
        }
        return null;
    }
}

但是每次调用 conect() 方法时,我都会在 LogCat 中收到此错误:

04-17 12:18:05.996: E/EMAIL(4160): javax.mail.AuthenticationFailedException
04-17 12:18:05.996: E/EMAIL(4160):  at javax.mail.Service.connect(Service.java:319)
04-17 12:18:05.996: E/EMAIL(4160):  at javax.mail.Service.connect(Service.java:169)
04-17 12:18:05.996: E/EMAIL(4160):  at com.myapp.mail.MailSender.sendMail(MailSender.java:82)
04-17 12:18:05.996: E/EMAIL(4160):  at com.myapp.TrackingService$sendMailTask.doInBackground(TrackingService.java:380)
04-17 12:18:05.996: E/EMAIL(4160):  at android.os.AsyncTask$2.call(AsyncTask.java:288)
04-17 12:18:05.996: E/EMAIL(4160):  at java.util.concurrent.FutureTask.run(FutureTask.java:237)
04-17 12:18:05.996: E/EMAIL(4160):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
04-17 12:18:05.996: E/EMAIL(4160):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
04-17 12:18:05.996: E/EMAIL(4160):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
04-17 12:18:05.996: E/EMAIL(4160):  at java.lang.Thread.run(Thread.java:841)

这与认证有关。事实上,我在我的帐户中收到了来自 google 的电子邮件,告诉我有人试图访问我的帐户...

【问题讨论】:

  • @Josef 我正在使用身份验证器。您链接的那个与我的代码中的工作不同吗?
  • 尝试主机名“smtp.googlemail.com”和 SMTP 端口“465”,
  • @DhavalPatel 更改为“smtp.googlemail.com”,端口仍为“587”,并出现相同的错误。将展位的东西,smtp 和端口更改为“465”,现在它不会抛出异常,但它也不会发送消息。

标签: java android smtp


【解决方案1】:

下面的代码对我来说很好用。为此,您需要从http://code.google.com/p/javamail-android/downloads/list 链接下载库和从https://commons.apache.org/proper/commons-email/download_email.cgi 链接下载commons-email。删除所有其他java邮件库只添加这四个库;

import org.apache.commons.mail.DefaultAuthenticator;
import org.apache.commons.mail.Email;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;

private class MailClass extends AsyncTask<String, Void, Void>{

        @Override
        protected Void doInBackground(String... params) {
            try {
                Email email = new SimpleEmail();
                email.setHostName("smtp.googlemail.com");
                email.setSmtpPort(465);
                email.setAuthenticator(new DefaultAuthenticator("abc@gmail.com", "abc_password"));
                email.setSSLOnConnect(true);
                email.setFrom("abc@gmail.com");
                email.setSubject("TestMail");
                email.setMsg("This is a test mail ... :-)");
                email.addTo("dhavalpatel.244@gmail.com");
                email.send();
            } catch (EmailException e) {
                e.printStackTrace();
            }

            return null;
        }

    }

【讨论】:

  • 我通常有这 3 个 jar 文件。我正在尝试使用您的代码,但是,Email 类来自哪里?我没有从 jar 文件中得到任何导入...
  • 那么,您使用的是另一种 apache 库还是什么?我无法以常规方式获得这些进口商品
  • 你用的是eclipse还是android studio?
  • Eclipse,我在AS中的jar文件一直有问题
  • 对不起..忘了告诉你..请从commons.apache.org/proper/commons-email/download_email.cgi链接添加jar。下载 commons-email-1.3.3-bin.zip。其中包含 commons-email-1.3.3.jar 文件。
猜你喜欢
  • 2012-03-14
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
  • 2016-05-13
  • 2020-11-06
  • 2014-08-15
  • 1970-01-01
相关资源
最近更新 更多