android后台发送Email(不借助Intent)

来源:互联网 发布:盗号软件下载 编辑:程序博客网 时间:2024/04/28 05:44
          Android的SDK使得它很容易从一个应用程序发送电子邮件,但只能通过Intent的方法,就是通过内置的邮件应用程序。这能满足大多数的需求,但如果你想在后台发送,就不行了。
在这篇文章中,我将告诉你怎样在没有用户干预的情况下,在后台发送一封电子邮件。

开始之前需要先下载一个特殊版本的JavaMail API,这是专门为Android编写的。

http://code.google.com/p/javamail-android/downloads/list


如果你被墙屏蔽了,也可以去这里下载,里面的附件里有全部需要的东西,包括如何在Android应用的Activity中使用:

http://download.csdn.net/detail/jacklce/4896856

我们开始吧,下面是对邮件发送功能的封装,使用这些方法可以很容易地发送电子邮件,甚至可以添加附件。

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 ….. } 

And now I'm going to go through each bit of code

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

在这段代码中,我们初始化了类mail属性,并设置为默认值。
另外,里面的JavaMail MIME类型需要注意看。里面有一个注释说明。
里面的两个2个构造函数也要仔细看,你可以通过其中一个传递用户名跟密码进去。

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); } 
这是添加附件的函数,不过需要在发送之前调用。


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; } 
在这里,我们设置了邮件认证的属性 - 默认是SMTP认证。
这是所有Gmail(谷歌)SMTP服务器连接。


完整代码: http://download.csdn.net/detail/jacklce/4896961


原创粉丝点击