sending email without user interaction android

前端 未结 3 580
隐瞒了意图╮
隐瞒了意图╮ 2021-01-15 16:43

I was trying to send email without user interaction. every thing worked until the part for sending.

This is the sendemail function in the Gmailsender class that I a

3条回答
  •  温柔的废话
    2021-01-15 17:33

    Use the JavaMail API, which was written specifically for Android.

    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; 
      } 
    
      // more of the getters and setters ….. 
    } 
    

    Below is an example of how to use the Mail wrapper, in an Android activity.

    @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); 
          } 
        } 
      }); 
    } 
    

提交回复
热议问题