首页 文章

使用JavaMail API在Android中发送电子邮件,而不使用默认/内置应用程序

提问于
浏览 1870
608

我正在尝试在Android中创建邮件发送应用程序 .

如果我使用:

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);

这将启动内置的Android应用程序;我正在尝试使用此应用程序直接发送邮件 without .

22 回答

  • 723

    那些正在尝试将那三个jar文件移动到你的项目的lib文件夹的人,它对我有用!!

  • 67

    其他答案中提供的所有代码都是正确的,并且运行正常,但有点混乱,所以我决定发布一个库(仍然在开发中)以更简单的方式使用它: AndroidMail .

    您只需要创建一个MailSender,构建一个邮件并发送它(已经使用AsyncTask在后台处理) .

    MailSender mailSender = new MailSender(email, password);
    
    Mail.MailBuilder builder = new Mail.MailBuilder();
    Mail mail = builder
        .setSender(senderMail)
        .addRecipient(new Recipient(recipient))
        .setText("Hello")
        .build();
    
    mailSender.sendMail(mail);
    

    您可以收到发送的电子邮件的通知,它还支持不同的收件人类型(TO,CC和BCC),附件和HTML:

    MailSender mailSender = new MailSender(email, password);
    
    Mail.MailBuilder builder = new Mail.MailBuilder();
    Mail mail = builder
        .setSender(senderMail)
        .addRecipient(new Recipient(recipient))
        .addRecipient(new Recipient(Recipient.TYPE.CC, recipientCC))
        .setText("Hello")
        .setHtml("<h1 style=\"color:red;\">Hello</h1>")
        .addAttachment(new Attachment(filePath, fileName))
        .build();
    
    mailSender.sendMail(mail, new MailSender.OnMailSentListener() {
    
        @Override
        public void onSuccess() {
            // mail sent!
        }
    
        @Override
        public void onError(Exception error) {
            // something bad happened :(
        }
    });
    

    你可以通过Gradle或Maven获得它:

    compile 'it.enricocandino:androidmail:1.0.0-SNAPSHOT'
    

    如果您有任何问题,请告诉我! :)

  • 52

    你考虑过使用Apache Commons Net吗?从3.3开始,只有一个 jar (你可以使用gradle或maven依赖它)并且你已经完成了:http://blog.dahanne.net/2013/06/17/sending-a-mail-in-java-and-android-with-apache-commons-net/

  • 38

    如果使用“smtp.gmail.com”作为默认的smtp服务器,则发出警告 .

    由于过于热心的“可疑活动”政策,Google会强制您经常更改关联的电子邮件帐户密码 . 从本质上讲,它会在短时间内将来自不同国家的重复smtp请求视为“可疑活动” . 因为他们认为您(电子邮件帐户持有人)一次只能在一个国家/地区 .

    当谷歌系统检测到“可疑活动”时,它会阻止更多电子邮件,直到您更改密码 . 由于您将密码硬编码到应用程序中,因此每次发生这种情况时都必须重新发布应用程序,这并不理想 . 这对我来说每周发生3次,我甚至将密码存储在另一台服务器上,并且每次google强制我更改密码时动态获取密码 .

    因此,我建议使用众多免费smtp提供程序之一而不是“smtp.gmail.com”来避免此安全问题 . 使用相同的代码,但将“smtp.gmail.com”更改为新的smtp转发主机 .

  • 26

    感谢您提供宝贵的宝贵信息 . 代码工作正常 . 我也可以通过添加以下代码来添加附件 .

    private Multipart _multipart; 
    _multipart = new MimeMultipart(); 
    
    public void addAttachment(String filename,String subject) throws Exception { 
        BodyPart messageBodyPart = new MimeBodyPart(); 
        DataSource source = new FileDataSource(filename); 
        messageBodyPart.setDataHandler(new DataHandler(source)); 
        messageBodyPart.setFileName(filename); 
        _multipart.addBodyPart(messageBodyPart);
    
        BodyPart messageBodyPart2 = new MimeBodyPart(); 
        messageBodyPart2.setText(subject); 
    
        _multipart.addBodyPart(messageBodyPart2); 
    } 
    
    
    
    message.setContent(_multipart);
    
  • 21

    我尝试使用@Vinayak B提交的代码 . 但是我收到一个错误说:没有提供smtp

    我为此创建了一个新问题,提供了更多信息HERE

    毕竟我能够自己解决这个问题 . 我不得不使用另一个mail.jar,我必须确保我的“access for less secure apps”已打开 .

    我希望这可以帮助任何有同样问题的人 . 完成此操作后,这段代码也可以在谷歌眼镜上运行 .

  • 20

    无法连接到SMTP主机:smtp.gmail.com,port:465

    在清单中添加以下行:

    <uses-permission android:name="android.permission.INTERNET" />
    
  • 18

    如果要求您保持jar库尽可能小,可以单独包含SMTP / POP3 / IMAP功能,以避免“dex中的方法太多”问题 .

    您可以从the javanet web page中选择想要的jar库,例如,mailapi.jar imap.jar可以让您以IMAP协议访问icloud,hotmail邮件服务器 . (在additional.jar和activation.jar的帮助下)

  • 14

    这是一个alt版本,也适用于我,并有附件(上面已发布但完整版本不同于源链接,人们发布他们不能让它工作,因为它缺少数据)

    import java.util.Date; 
    import java.util.Properties; 
    import javax.activation.CommandMap; 
    import javax.activation.DataHandler; 
    import javax.activation.DataSource; 
    import javax.activation.FileDataSource; 
    import javax.activation.MailcapCommandMap; 
    import javax.mail.BodyPart; 
    import javax.mail.Multipart; 
    import javax.mail.PasswordAuthentication; 
    import javax.mail.Session; 
    import javax.mail.Transport; 
    import javax.mail.internet.InternetAddress; 
    import javax.mail.internet.MimeBodyPart; 
    import javax.mail.internet.MimeMessage; 
    import javax.mail.internet.MimeMultipart; 
    
    
    public class Mail extends javax.mail.Authenticator { 
      private String _user; 
      private String _pass; 
    
      private String[] _to; 
      private String _from; 
    
      private String _port; 
      private String _sport; 
    
      private String _host; 
    
      private String _subject; 
      private String _body; 
    
      private boolean _auth; 
    
      private boolean _debuggable; 
    
      private Multipart _multipart; 
    
    
      public Mail() { 
        _host = "smtp.gmail.com"; // default smtp server 
        _port = "465"; // default smtp port 
        _sport = "465"; // default socketfactory port 
    
        _user = ""; // username 
        _pass = ""; // password 
        _from = ""; // email sent from 
        _subject = ""; // email subject 
        _body = ""; // email body 
    
        _debuggable = false; // debug mode on or off - default off 
        _auth = true; // smtp authentication - default on 
    
        _multipart = new MimeMultipart(); 
    
        // There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added. 
        MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
        mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); 
        mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
        mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); 
        mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 
        mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); 
        CommandMap.setDefaultCommandMap(mc); 
      } 
    
      public Mail(String user, String pass) { 
        this(); 
    
        _user = user; 
        _pass = pass; 
      } 
    
      public boolean send() throws Exception { 
        Properties props = _setProperties(); 
    
        if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { 
          Session session = Session.getInstance(props, this); 
    
          MimeMessage msg = new MimeMessage(session); 
    
          msg.setFrom(new InternetAddress(_from)); 
    
          InternetAddress[] addressTo = new InternetAddress[_to.length]; 
          for (int i = 0; i < _to.length; i++) { 
            addressTo[i] = new InternetAddress(_to[i]); 
          } 
            msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 
    
          msg.setSubject(_subject); 
          msg.setSentDate(new Date()); 
    
          // setup message body 
          BodyPart messageBodyPart = new MimeBodyPart(); 
          messageBodyPart.setText(_body); 
          _multipart.addBodyPart(messageBodyPart); 
    
          // Put parts in message 
          msg.setContent(_multipart); 
    
          // send email 
          Transport.send(msg); 
    
          return true; 
        } else { 
          return false; 
        } 
      } 
    
      public void addAttachment(String filename) throws Exception { 
        BodyPart messageBodyPart = new MimeBodyPart(); 
        DataSource source = new FileDataSource(filename); 
        messageBodyPart.setDataHandler(new DataHandler(source)); 
        messageBodyPart.setFileName(filename); 
    
        _multipart.addBodyPart(messageBodyPart); 
      } 
    
      @Override 
      public PasswordAuthentication getPasswordAuthentication() { 
        return new PasswordAuthentication(_user, _pass); 
      } 
    
      private Properties _setProperties() { 
        Properties props = new Properties(); 
    
        props.put("mail.smtp.host", _host); 
    
        if(_debuggable) { 
          props.put("mail.debug", "true"); 
        } 
    
        if(_auth) { 
          props.put("mail.smtp.auth", "true"); 
        } 
    
        props.put("mail.smtp.port", _port); 
        props.put("mail.smtp.socketFactory.port", _sport); 
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
        props.put("mail.smtp.socketFactory.fallback", "false"); 
    
        return props; 
      } 
    
      // the getters and setters 
      public String getBody() { 
        return _body; 
      } 
    
      public void setBody(String _body) { 
        this._body = _body; 
      }
    
      public void setTo(String[] toArr) {
          // TODO Auto-generated method stub
          this._to=toArr;
      }
    
      public void setFrom(String string) {
          // TODO Auto-generated method stub
          this._from=string;
      }
    
      public void setSubject(String string) {
          // TODO Auto-generated method stub
          this._subject=string;
      }  
    
      // more of the getters and setters ….. 
    }
    

    并在活动中称呼它...

    @Override 
    public void onCreate(Bundle icicle) { 
      super.onCreate(icicle); 
      setContentView(R.layout.main); 
    
      Button addImage = (Button) findViewById(R.id.send_email); 
      addImage.setOnClickListener(new View.OnClickListener() { 
        public void onClick(View view) { 
          Mail m = new Mail("gmailusername@gmail.com", "password"); 
    
          String[] toArr = {"bla@bla.com", "lala@lala.com"}; 
          m.setTo(toArr); 
          m.setFrom("wooo@wooo.com"); 
          m.setSubject("This is an email sent using my Mail JavaMail wrapper from an Android device."); 
          m.setBody("Email body."); 
    
          try { 
            m.addAttachment("/sdcard/filelocation"); 
    
            if(m.send()) { 
              Toast.makeText(MailApp.this, "Email was sent successfully.", Toast.LENGTH_LONG).show(); 
            } else { 
              Toast.makeText(MailApp.this, "Email was not sent.", Toast.LENGTH_LONG).show(); 
            } 
          } catch(Exception e) { 
            //Toast.makeText(MailApp.this, "There was a problem sending the email.", Toast.LENGTH_LONG).show(); 
            Log.e("MailApp", "Could not send email", e); 
          } 
        } 
      }); 
    }
    
  • 9

    SMTP

    使用SMTP是一种方法,其他人已经指出了如何做到这一点 . 请注意,在执行此操作时,您完全绕过内置邮件应用程序,您必须在代码中静态提供SMTP服务器的地址,该服务器的用户名和密码,或者从用户查询 .

    HTTP

    另一种方法是涉及一个简单的服务器端脚本,如php,它接受一些URL参数并使用它们发送邮件 . 这样,您只需要从设备发出HTTP请求(使用内置库即可轻松实现),并且不需要在设备上存储SMTP登录数据 . 与直接使用SMTP相比,这是一个间接性,但因为它非常容易从PHP发出HTTP请求和发送邮件,所以它甚至可能比直接方式更简单 .

    邮件申请

    如果邮件将从他已经在手机上注册的用户默认邮件帐户发送,则您必须采取其他方法 . 如果您有足够的时间和经验,您可能需要查看Android电子邮件应用程序的源代码,看看它是否提供了一些无需用户交互即可发送邮件的入口点(我不知道,但也许有一个) .

    也许您甚至找到了查询用户帐户详细信息的方法(因此您可以将它们用于SMTP),尽管我非常怀疑这是可能的,因为这将是一个巨大的安全风险,并且Android的构建相当安全 .

  • 7

    您可以使用JavaMail API来处理您的电子邮件任务 . JavaMail API在JavaEE包中可用,其jar可供下载 . 遗憾的是,它不能直接在Android应用程序中使用,因为它使用了在Android中完全不兼容的AWT组件 .

    您可以在以下位置找到适用于JavaMail的Android端口:http://code.google.com/p/javamail-android/

    将jar添加到您的应用程序并使用SMTP方法

  • 4

    为了帮助那些使用SDK Target> 9获得网络主线程异常的人 . 这是使用上面的droopie代码,但对任何代码都适用 .

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    
    StrictMode.setThreadPolicy(policy); 
    
    android.os.NetworkOnMainThreadException
    

    您可以使用AsyncTask,如下所示

    public void onClickMail(View view) {
        new SendEmailAsyncTask().execute();
    }
    
    class SendEmailAsyncTask extends AsyncTask <Void, Void, Boolean> {
        Mail m = new Mail("from@gmail.com", "my password");
    
        public SendEmailAsyncTask() {
            if (BuildConfig.DEBUG) Log.v(SendEmailAsyncTask.class.getName(), "SendEmailAsyncTask()");
            String[] toArr = { "to mail@gmail.com"};
            m.setTo(toArr);
            m.setFrom("from mail@gmail.com");
            m.setSubject("Email from Android");
            m.setBody("body.");
        }
    
        @Override
        protected Boolean doInBackground(Void... params) {
            if (BuildConfig.DEBUG) Log.v(SendEmailAsyncTask.class.getName(), "doInBackground()");
            try {
                m.send();
                return true;
            } catch (AuthenticationFailedException e) {
                Log.e(SendEmailAsyncTask.class.getName(), "Bad account details");
                e.printStackTrace();
                return false;
            } catch (MessagingException e) {
                Log.e(SendEmailAsyncTask.class.getName(), m.getTo(null) + "failed");
                e.printStackTrace();
                return false;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
    
  • 4

    对于需要帮助的人,我找到了一个更短的选择 . 代码是:

    package com.example.mail;
    
    import java.util.Properties;
    
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.PasswordAuthentication;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    
    public class SendMailTLS {
    
        public static void main(String[] args) {
    
            final String username = "username@gmail.com";
            final String password = "password";
    
            Properties props = new Properties();
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.host", "smtp.gmail.com");
            props.put("mail.smtp.port", "587");
    
            Session session = Session.getInstance(props,
              new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication("username", "password");
                }
              });
    
            try {
    
                Message message = new MimeMessage(session);
                message.setFrom(new InternetAddress("from-email@gmail.com"));
                message.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse("to-email@gmail.com"));
                message.setSubject("Testing Subject");
                message.setText("Dear Mail Crawler,"
                    + "\n\n No spam to my email, please!");
    
                Transport.send(message);
    
                System.out.println("Done");
    
            } catch (MessagingException e) {
                throw new RuntimeException(e);
            }
        }
    }
    

    资料来源:Sending Email via JavaMail API

    希望这可以帮助!祝好运!

  • 4
    Add jar files mail.jar,activation.jar,additionnal.jar
    
     String sub="Thank you for your online registration" ; 
     Mail m = new Mail("emailid", "password"); 
    
     String[] toArr = {"ekkatrainfo@gmail.com",sEmailId};
     m.setFrom("ekkatrainfo@gmail.com"); 
    
         m.setTo(toArr);
         m.setSubject(sub);
        m.setBody(msg);
    
    
    
                         try{
    
    
                                if(m.send()) { 
    
                                } else { 
    
                                } 
                              } catch(Exception e) { 
    
                                Log.e("MailApp", "Could not send email", e); 
                              } 
    
      package com.example.ekktra;
    
       import java.util.Date;
       import java.util.Properties;
    
       import javax.activation.CommandMap;
       import javax.activation.DataHandler;
       import javax.activation.DataSource;
       import javax.activation.FileDataSource;
       import javax.activation.MailcapCommandMap;
       import javax.mail.BodyPart;
       import javax.mail.Multipart;
       import javax.mail.PasswordAuthentication;
       import javax.mail.Session;
       import javax.mail.Transport;
       import javax.mail.internet.InternetAddress;
       import javax.mail.internet.MimeBodyPart;
       import javax.mail.internet.MimeMessage;
       import javax.mail.internet.MimeMultipart;
    
       public class Mail extends javax.mail.Authenticator { 
         private String _user; 
         private String _pass; 
    
         private String[] _to; 
    
         private String _from; 
    
         private String _port; 
         private String _sport; 
    
         private String _host; 
    
         private String _subject; 
         private String _body; 
    
         private boolean _auth; 
    
         private boolean _debuggable; 
    
         private Multipart _multipart; 
    
    
       public Mail() { 
          _host = "smtp.gmail.com"; // default smtp server 
          _port = "465"; // default smtp port 
          _sport = "465"; // default socketfactory port 
    
          _user = ""; // username 
          _pass = ""; // password 
          _from = ""; // email sent from 
          _subject = ""; // email subject 
          _body = ""; // email body 
    
          _debuggable = false; // debug mode on or off - default off 
          _auth = true; // smtp authentication - default on 
    
          _multipart = new MimeMultipart(); 
    
          // There is something wrong with MailCap, javamail can not find a handler for the        multipart/mixed part, so this bit needs to be added. 
          MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
       mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); 
       mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
       mc.addMailcap("text/plain;; x-java-content-  handler=com.sun.mail.handlers.text_plain"); 
       mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 
       mc.addMailcap("message/rfc822;; x-java-content- handler=com.sun.mail.handlers.message_rfc822"); 
        CommandMap.setDefaultCommandMap(mc); 
       } 
    
     public Mail(String user, String pass) { 
      this(); 
    
      _user = user; 
       _pass = pass; 
     } 
    
    public boolean send() throws Exception { 
       Properties props = _setProperties(); 
    
      if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") &&   !_subject.equals("") /*&& !_body.equals("")*/) { 
        Session session = Session.getInstance(props, this); 
    
        MimeMessage msg = new MimeMessage(session); 
    
         msg.setFrom(new InternetAddress(_from)); 
    
        InternetAddress[] addressTo = new InternetAddress[_to.length]; 
         for (int i = 0; i < _to.length; i++) { 
          addressTo[i] = new InternetAddress(_to[i]); 
        } 
          msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 
    
        msg.setSubject(_subject); 
        msg.setSentDate(new Date()); 
    
      // setup message body 
      BodyPart messageBodyPart = new MimeBodyPart(); 
        messageBodyPart.setText(_body); 
        _multipart.addBodyPart(messageBodyPart); 
    
         // Put parts in message 
        msg.setContent(_multipart); 
    
        // send email 
        Transport.send(msg); 
    
        return true; 
       } else { 
         return false; 
       } 
      } 
    
       public void addAttachment(String filename) throws Exception { 
        BodyPart messageBodyPart = new MimeBodyPart(); 
        DataSource source = new FileDataSource(filename); 
          messageBodyPart.setDataHandler(new DataHandler(source)); 
        messageBodyPart.setFileName(filename); 
    
       _multipart.addBodyPart(messageBodyPart); 
     } 
    
      @Override 
      public PasswordAuthentication getPasswordAuthentication() { 
         return new PasswordAuthentication(_user, _pass); 
      } 
    
       private Properties _setProperties() { 
       Properties props = new Properties(); 
    
        props.put("mail.smtp.host", _host); 
    
      if(_debuggable) { 
        props.put("mail.debug", "true"); 
      } 
    
      if(_auth) { 
        props.put("mail.smtp.auth", "true"); 
       } 
    
        props.put("mail.smtp.port", _port); 
        props.put("mail.smtp.socketFactory.port", _sport); 
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
        props.put("mail.smtp.socketFactory.fallback", "false"); 
    
        return props; 
       } 
    
       // the getters and setters 
      public String getBody() { 
       return _body; 
     } 
    
     public void setBody(String _body) { 
      this._body = _body; 
     }
    
      public void setTo(String[] toArr) {
         // TODO Auto-generated method stub
        this._to=toArr;
     }
    
    public void setFrom(String string) {
        // TODO Auto-generated method stub
        this._from=string;
    }
    
     public void setSubject(String string) {
        // TODO Auto-generated method stub
        this._subject=string;
      }  
    
    
       }
    
  • 3

    GmailBackground是一个小型库,可以在后台发送电子邮件而无需用户交互:

    用法:

    BackgroundMail.newBuilder(this)
                .withUsername("username@gmail.com")
                .withPassword("password12345")
                .withMailto("toemail@gmail.com")
                .withType(BackgroundMail.TYPE_PLAIN)
                .withSubject("this is the subject")
                .withBody("this is the body")
                .withOnSuccessCallback(new BackgroundMail.OnSuccessCallback() {
                    @Override
                    public void onSuccess() {
                        //do some magic
                    }
                })
                .withOnFailCallback(new BackgroundMail.OnFailCallback() {
                    @Override
                    public void onFail() {
                        //do some magic
                    }
                })
                .send();
    

    组态:

    repositories {
        // ...
        maven { url "https://jitpack.io" }
     }
     dependencies {
                compile 'com.github.yesidlazaro:GmailBackground:1.2.0'
        }
    

    权限:

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    

    另外,对于附件,您需要设置READ_EXTERNAL_STORAGE权限:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    

    Source

    (我自己测试过)

  • 3

    无需用户干预,您可以发送如下:

    • 从客户端apk发送电子邮件 . 在这里mail.jar,activation.jar需要发送java电子邮件 . 如果添加这些jar,可能会增加APK大小 .

    • 或者,您可以在服务器端代码使用Web服务,该代码将使用相同的mail.jar和activation.jar来发送电子邮件 . 您可以通过asynctask调用Web服务并发送电子邮件 . 参考相同的链接 .

    (但是,您需要知道邮件帐户的凭据)

  • 2

    我无法运行Vinayak B的代码 . 最后我通过以下方式解决了这个问题

    1.使用this

    2.应用AsyncTask .

    3.更改发件人gmail帐户的安全问题 . (更改为"TURN ON")this

  • 1

    使用Gmail身份验证使用JavaMail API在Android中发送电子邮件 .

    创建示例项目的步骤:

    MailSenderActivity.java:

    public class MailSenderActivity extends Activity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            final Button send = (Button) this.findViewById(R.id.send);
            send.setOnClickListener(new View.OnClickListener() {
    
                public void onClick(View v) {
                    try {   
                        GMailSender sender = new GMailSender("username@gmail.com", "password");
                        sender.sendMail("This is Subject",   
                                "This is Body",   
                                "user@gmail.com",   
                                "user@yahoo.com");   
                    } catch (Exception e) {   
                        Log.e("SendMail", e.getMessage(), e);   
                    } 
    
                }
            });
    
        }
    }
    

    GMailSender.java:

    public class GMailSender extends javax.mail.Authenticator {   
        private String mailhost = "smtp.gmail.com";   
        private String user;   
        private String password;   
        private Session session;   
    
        static {   
            Security.addProvider(new com.provider.JSSEProvider());   
        }  
    
        public GMailSender(String user, String password) {   
            this.user = user;   
            this.password = password;   
    
            Properties props = new Properties();   
            props.setProperty("mail.transport.protocol", "smtp");   
            props.setProperty("mail.host", mailhost);   
            props.put("mail.smtp.auth", "true");   
            props.put("mail.smtp.port", "465");   
            props.put("mail.smtp.socketFactory.port", "465");   
            props.put("mail.smtp.socketFactory.class",   
                    "javax.net.ssl.SSLSocketFactory");   
            props.put("mail.smtp.socketFactory.fallback", "false");   
            props.setProperty("mail.smtp.quitwait", "false");   
    
            session = Session.getDefaultInstance(props, this);   
        }   
    
        protected PasswordAuthentication getPasswordAuthentication() {   
            return new PasswordAuthentication(user, password);   
        }   
    
        public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception {   
            try{
            MimeMessage message = new MimeMessage(session);   
            DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain"));   
            message.setSender(new InternetAddress(sender));   
            message.setSubject(subject);   
            message.setDataHandler(handler);   
            if (recipients.indexOf(',') > 0)   
                message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));   
            else  
                message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));   
            Transport.send(message);   
            }catch(Exception e){
    
            }
        }   
    
        public class ByteArrayDataSource implements DataSource {   
            private byte[] data;   
            private String type;   
    
            public ByteArrayDataSource(byte[] data, String type) {   
                super();   
                this.data = data;   
                this.type = type;   
            }   
    
            public ByteArrayDataSource(byte[] data) {   
                super();   
                this.data = data;   
            }   
    
            public void setType(String type) {   
                this.type = type;   
            }   
    
            public String getContentType() {   
                if (type == null)   
                    return "application/octet-stream";   
                else  
                    return type;   
            }   
    
            public InputStream getInputStream() throws IOException {   
                return new ByteArrayInputStream(data);   
            }   
    
            public String getName() {   
                return "ByteArrayDataSource";   
            }   
    
            public OutputStream getOutputStream() throws IOException {   
                throw new IOException("Not Supported");   
            }   
        }   
    }
    

    JSSEProvider.java:

    /*
     *  Licensed to the Apache Software Foundation (ASF) under one or more
     *  contributor license agreements.  See the NOTICE file distributed with
     *  this work for additional information regarding copyright ownership.
     *  The ASF licenses this file to You under the Apache License, Version 2.0
     *  (the "License"); you may not use this file except in compliance with
     *  the License.  You may obtain a copy of the License at
     *
     *     http://www.apache.org/licenses/LICENSE-2.0
     *
     *  Unless required by applicable law or agreed to in writing, software
     *  distributed under the License is distributed on an "AS IS" BASIS,
     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     *  See the License for the specific language governing permissions and
     *  limitations under the License.
     */
    
    /**
     * @author Alexander Y. Kleymenov
     * @version $Revision$
     */
    
    
    import java.security.AccessController;
    import java.security.Provider;
    
    public final class JSSEProvider extends Provider {
    
        public JSSEProvider() {
            super("HarmonyJSSE", 1.0, "Harmony JSSE Provider");
            AccessController.doPrivileged(new java.security.PrivilegedAction<Void>() {
                public Void run() {
                    put("SSLContext.TLS",
                            "org.apache.harmony.xnet.provider.jsse.SSLContextImpl");
                    put("Alg.Alias.SSLContext.TLSv1", "TLS");
                    put("KeyManagerFactory.X509",
                            "org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl");
                    put("TrustManagerFactory.X509",
                            "org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl");
                    return null;
                }
            });
        }
    }
    

    在您的Android项目的以下链接中添加3个 jar

    Click here - How to add External Jars

    并且不要忘记在清单中添加此行:

    <uses-permission android:name="android.permission.INTERNET" />
    

    Just click below link to change account access for less secure apps https://www.google.com/settings/security/lesssecureapps

    运行该项目并检查收件人邮件帐户中的邮件 . 干杯!

    附:并且不要忘记你不能从android中的任何Activity做网络操作 . 因此,建议使用 AsyncTaskIntentService 来避免主线程异常上的网络 .

    Jar文件:https://code.google.com/archive/p/javamail-android/

  • 1

    100% working code with demo You can also send multiple email using this answer.

    下载项目 HERE

    Step 1 : 下载邮件,激活,附加jar文件并在android studio中添加 project libs folder . 我添加了一个屏幕截图见下面 Download link

    libs add

    使用Gmail登录( using your from mail )和 TURN ON 切换按钮LINK

    大多数人忘了这一步,我希望你不会 .

    Step 2 : 完成此过程后 . 复制并将这些类复制到您的项目中 .

    GMail.java

    import android.util.Log;
    
    import java.io.UnsupportedEncodingException;
    import java.util.List;
    import java.util.Properties;
    
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.AddressException;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    
    public class GMail {
    
        final String emailPort = "587";// gmail's smtp port
        final String smtpAuth = "true";
        final String starttls = "true";
        final String emailHost = "smtp.gmail.com";
    
    
        String fromEmail;
        String fromPassword;
        List<String> toEmailList;
        String emailSubject;
        String emailBody;
    
        Properties emailProperties;
        Session mailSession;
        MimeMessage emailMessage;
    
        public GMail() {
    
        }
    
        public GMail(String fromEmail, String fromPassword,
                List<String> toEmailList, String emailSubject, String emailBody) {
            this.fromEmail = fromEmail;
            this.fromPassword = fromPassword;
            this.toEmailList = toEmailList;
            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("GMail", "Mail server properties set.");
        }
    
        public MimeMessage createEmailMessage() throws AddressException,
                MessagingException, UnsupportedEncodingException {
    
            mailSession = Session.getDefaultInstance(emailProperties, null);
            emailMessage = new MimeMessage(mailSession);
    
            emailMessage.setFrom(new InternetAddress(fromEmail, fromEmail));
            for (String toEmail : toEmailList) {
                Log.i("GMail", "toEmail: " + toEmail);
                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("GMail", "Email Message created.");
            return emailMessage;
        }
    
        public void sendEmail() throws AddressException, MessagingException {
    
            Transport transport = mailSession.getTransport("smtp");
            transport.connect(emailHost, fromEmail, fromPassword);
            Log.i("GMail", "allrecipients: " + emailMessage.getAllRecipients());
            transport.sendMessage(emailMessage, emailMessage.getAllRecipients());
            transport.close();
            Log.i("GMail", "Email sent successfully.");
        }
    
    }
    

    SendMailTask.java

    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.os.AsyncTask;
    import android.util.Log;
    
    import java.util.List;
    
    public class SendMailTask extends AsyncTask {
    
        private ProgressDialog statusDialog;
        private Activity sendMailActivity;
    
        public SendMailTask(Activity activity) {
            sendMailActivity = activity;
    
        }
    
        protected void onPreExecute() {
            statusDialog = new ProgressDialog(sendMailActivity);
            statusDialog.setMessage("Getting ready...");
            statusDialog.setIndeterminate(false);
            statusDialog.setCancelable(false);
            statusDialog.show();
        }
    
        @Override
        protected Object doInBackground(Object... args) {
            try {
                Log.i("SendMailTask", "About to instantiate GMail...");
                publishProgress("Processing input....");
                GMail androidEmail = new GMail(args[0].toString(),
                        args[1].toString(), (List) args[2], args[3].toString(),
                        args[4].toString());
                publishProgress("Preparing mail message....");
                androidEmail.createEmailMessage();
                publishProgress("Sending email....");
                androidEmail.sendEmail();
                publishProgress("Email Sent.");
                Log.i("SendMailTask", "Mail Sent.");
            } catch (Exception e) {
                publishProgress(e.getMessage());
                Log.e("SendMailTask", e.getMessage(), e);
            }
            return null;
        }
    
        @Override
        public void onProgressUpdate(Object... values) {
            statusDialog.setMessage(values[0].toString());
    
        }
    
        @Override
        public void onPostExecute(Object result) {
            statusDialog.dismiss();
        }
    
    }
    

    Step 3 : 现在您可以根据需要更改此类,也可以使用此类发送多个邮件 . 我提供xml和java文件 .

    activity_mail.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:paddingTop="30dp">
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingTop="10dp"
            android:text="From Email" />
    
        <EditText
            android:id="@+id/editText1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#FFFFFF"
            android:cursorVisible="true"
            android:editable="true"
            android:ems="10"
            android:enabled="true"
            android:inputType="textEmailAddress"
            android:padding="5dp"
            android:textColor="#000000">
    
            <requestFocus />
        </EditText>
    
        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingTop="10dp"
            android:text="Password (For from email)" />
    
        <EditText
            android:id="@+id/editText2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#FFFFFF"
            android:ems="10"
            android:inputType="textPassword"
            android:padding="5dp"
            android:textColor="#000000" />
    
        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingTop="10dp"
            android:text="To Email" />
    
        <EditText
            android:id="@+id/editText3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#ffffff"
            android:ems="10"
            android:inputType="textEmailAddress"
            android:padding="5dp"
            android:textColor="#000000" />
    
        <TextView
            android:id="@+id/textView4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingTop="10dp"
            android:text="Subject" />
    
        <EditText
            android:id="@+id/editText4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#ffffff"
            android:ems="10"
            android:padding="5dp"
            android:textColor="#000000" />
    
        <TextView
            android:id="@+id/textView5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingTop="10dp"
            android:text="Body" />
    
        <EditText
            android:id="@+id/editText5"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#ffffff"
            android:ems="10"
            android:inputType="textMultiLine"
            android:padding="35dp"
            android:textColor="#000000" />
    
        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Send Email" />
    
    </LinearLayout>
    

    SendMailActivity.java

    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    import java.util.Arrays;
    import java.util.List;
    
    public class SendMailActivity extends Activity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            final Button send = (Button) this.findViewById(R.id.button1);
    
            send.setOnClickListener(new View.OnClickListener() {
    
                public void onClick(View v) {
                    Log.i("SendMailActivity", "Send Button Clicked.");
    
                    String fromEmail = ((TextView) findViewById(R.id.editText1))
                            .getText().toString();
                    String fromPassword = ((TextView) findViewById(R.id.editText2))
                            .getText().toString();
                    String toEmails = ((TextView) findViewById(R.id.editText3))
                            .getText().toString();
                    List<String> toEmailList = Arrays.asList(toEmails
                            .split("\\s*,\\s*"));
                    Log.i("SendMailActivity", "To List: " + toEmailList);
                    String emailSubject = ((TextView) findViewById(R.id.editText4))
                            .getText().toString();
                    String emailBody = ((TextView) findViewById(R.id.editText5))
                            .getText().toString();
                    new SendMailTask(SendMailActivity.this).execute(fromEmail,
                            fromPassword, toEmailList, emailSubject, emailBody);
                }
            });
        }
    }
    

    Note 别忘了在AndroidManifest.xml文件中添加 internet 权限

    <uses-permission android:name="android.permission.INTERNET"/>

    希望它能工作,如果不是那么只是在下面评论 .

  • 1

    要添加附件,请不要忘记添加 .

    MailcapCommandMap mc = (MailcapCommandMap) CommandMap
                .getDefaultCommandMap();
        mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
        mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
        mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
        mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
        mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
        CommandMap.setDefaultCommandMap(mc);
    
  • 0

    用于发送带附件的邮件..

    public class SendAttachment{
                        public static void main(String [] args){ 
                 //to address
                        String to="abc@abc.com";//change accordingly
                        //from address
                        final String user="efg@efg.com";//change accordingly
                        final String password="password";//change accordingly 
                         MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
                       mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
                      mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
                      mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
                      mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
                      mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
                      CommandMap.setDefaultCommandMap(mc); 
                      //1) get the session object   
                      Properties properties = System.getProperties();
                      properties.put("mail.smtp.port", "465"); 
                      properties.put("mail.smtp.host", "smtp.gmail.com");
                        properties.put("mail.smtp.socketFactory.port", "465");
                        properties.put("mail.smtp.socketFactory.class",
                                "javax.net.ssl.SSLSocketFactory");
                        properties.put("mail.smtp.auth", "true");
                        properties.put("mail.smtp.port", "465");
    
                      Session session = Session.getDefaultInstance(properties,
                       new javax.mail.Authenticator() {
                       protected PasswordAuthentication getPasswordAuthentication() {
                       return new PasswordAuthentication(user,password);
                       }
                      });
    
                      //2) compose message   
                      try{ 
                        MimeMessage message = new MimeMessage(session);
                        message.setFrom(new InternetAddress(user));
                        message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
                        message.setSubject("Hii"); 
                        //3) create MimeBodyPart object and set your message content    
                        BodyPart messageBodyPart1 = new MimeBodyPart();
                        messageBodyPart1.setText("How is This"); 
                        //4) create new MimeBodyPart object and set DataHandler object to this object    
                        MimeBodyPart messageBodyPart2 = new MimeBodyPart();
                    //Location of file to be attached
                        String filename = Environment.getExternalStorageDirectory().getPath()+"/R2832.zip";//change accordingly
                        DataSource source = new FileDataSource(filename);
                        messageBodyPart2.setDataHandler(new DataHandler(source));
                        messageBodyPart2.setFileName("Hello"); 
                        //5) create Multipart object and add MimeBodyPart objects to this object    
                        Multipart multipart = new MimeMultipart();
                        multipart.addBodyPart(messageBodyPart1);
                        multipart.addBodyPart(messageBodyPart2); 
                        //6) set the multiplart object to the message object
                        message.setContent(multipart ); 
                        //7) send message 
                        Transport.send(message); 
                       System.out.println("MESSAGE SENT....");
                       }catch (MessagingException ex) {ex.printStackTrace();}
                      }
                    }
    
  • -3

    编辑:JavaMail 1.5.5 claims to support Android,所以你不需要任何其他东西 .

    我已将最新的JavaMail(1.5.4)移植到Android . 它可以在Maven Central中使用,只需将以下内容添加到build.gradle ~~即可
    编译'eu.ocathain.com.sun.mail:javax.mail:1.5.4'
    然后您可以按照官方教程进行操作 . 源代码可在此处获取:https://bitbucket.org/artbristol/javamail-forked-android

相关问题