android 邮件开发(javax.mail)

时间:2021-10-17 18:13:06

http://llshenglin.iteye.com/blog/1030505

 

android 邮件开发(javax.mail)

文章分类:Java编程

    以前在csdn上发贴求助android邮件开发的开发,后来问题自己解决了。有很多网友遇到了同样的问题,发邮件问我都没及时回复。在这里我把封存装的email源代码贴出来,和大家分享。
    android开发邮件需要添加三个扩展包:mail.jar,additional.jar,和activation.jar。直接用java开发,则只需前面两个包。两种不同的开发方式,包的版本是不同的。
    封装了一个SMailSender 类,类是Runnable的实现,也就是邮件功能可作为一个线程在后台运行。SMailSender类目前只支持gmail、126和163三种邮箱,如果要支持其他邮箱,可根据邮箱的协议类型进行相应的扩展。

SMailSender.java
Java代码 android 邮件开发(javax.mail) android 邮件开发(javax.mail)android 邮件开发(javax.mail)
  1. package com.jia.test;   
  2.   
  3. import java.util.Properties;   
  4.   
  5. import javax.activation.DataHandler;   
  6. import javax.activation.FileDataSource;   
  7. import javax.mail.BodyPart;   
  8. import javax.mail.Message;   
  9. import javax.mail.Multipart;   
  10. import javax.mail.Session;   
  11. import javax.mail.Transport;   
  12. import javax.mail.internet.InternetAddress;   
  13. import javax.mail.internet.MimeBodyPart;   
  14. import javax.mail.internet.MimeMessage;   
  15. import javax.mail.internet.MimeMultipart;   
  16.   
  17. import android.util.Log;   
  18.   
  19. public class SMailSender implements Runnable {   
  20.     private final String Tag = "SMailSender";   
  21.        
  22.     private String mSmtp_host;   
  23.     private String mFrom_userName;             
  24.     private String mFrom_passWord;                           
  25.     private String mShow_name = "Jiahe";   
  26.        
  27.     private MimeMessage mMimeMsg;   // 要发送的email信息   
  28.     private Session mSession;   
  29.     private Multipart mp;           // 存放邮件的title 内容和附件   
  30.     private String mSubject;   
  31.     private String mContent;   
  32.     private String mToId = null;   
  33.     private String mCcId = null;   
  34.     private String mBccId = null;   
  35.     private String mFilePath = null;   
  36.       
  37.     private final int NONE = 0;   
  38.     private final int CONNECTING = 1;   
  39.     private final int CONNECTED = 2;   
  40.     private final int SENDING = 3;   
  41.     private final int SENDED = 4;   
  42.     private int mState;   
  43.        
  44.     public enum MailType {   
  45.         TYPE_GMAIL, TYPE_126, TYPE_163, TYPE_QQ;   
  46.     }   
  47.   
  48.     private MailType mailType;   
  49.     //private Properties props;   
  50.        
  51.     /**  
  52.      * 构造函数  
  53.      * @param hostName  
  54.      */  
  55.     public SMailSender(){   
  56. //      mSmtp_host = "smtp.gmail.com";   
  57.         mp = new MimeMultipart();   
  58.     }   
  59.        
  60.     public SMailSender(String hostName){   
  61. //      mSmtp_host = hostName;   
  62.         mp = new MimeMultipart();   
  63.     }   
  64.        
  65.     /**  
  66.      * 设置发件人的用户名和密码  
  67.      * 目前只支持gmail、126、163邮箱  
  68.      * @param _userName  
  69.      * @param _password  
  70.      */  
  71.     public boolean setAuthor(String _userName, String _password){   
  72.         mFrom_userName = _userName;   
  73.         mFrom_passWord = _password;   
  74.         return setHost(mFrom_userName);     //设置邮箱类型   
  75.     }   
  76.        
  77.     /**  
  78.      * 设置邮件主题  
  79.      * @param subject  
  80.      */  
  81.     public void setSubject(String subject){   
  82.         if(subject!= null)   
  83.             mSubject = subject;   
  84.     }   
  85.        
  86.     /**  
  87.      * 设置邮件内容  
  88.      * @param content  
  89.      */  
  90.     public void setContent(String content){   
  91.         if(content != null)   
  92.             mContent = content;   
  93.     }   
  94.        
  95.     /**  
  96.      * 设置收件人,收件人之间用";"隔开  
  97.      * @param to  
  98.      * @return  
  99.      */  
  100.     public void setTo(String toId){   
  101.         mToId = toId;   
  102.     }   
  103.        
  104.     /**  
  105.      * 设置邮件抄送人,抄送人之间用";"隔开  
  106.      * @param copyto  
  107.      * @return  
  108.      */  
  109.     public void setCc(String ccId){   
  110.         mCcId = ccId;   
  111.     }   
  112.        
  113.     /**  
  114.      * 设置暗抄送人,暗抄送人之间用";"隔开  
  115.      * @param bcopyto  
  116.      * @return  
  117.      */  
  118.     public void setBcc(String bccId){   
  119.         mBccId = bccId;   
  120.     }   
  121.        
  122.     public void setShowName(String name){   
  123.         mShow_name = name;   
  124.     }   
  125.        
  126.     /**  
  127.      * 设置附件路径,路径之间用";"隔开  
  128.      * @param path  
  129.      */  
  130.     public void addFileAffix(String path){   
  131.         mFilePath = path;   
  132.     }   
  133.        
  134.     public int getMailState(){   
  135.         return mState;   
  136.     }   
  137.        
  138.     @Override  
  139.     public void run() {   
  140.         executeMailandSend();   
  141.     }   
  142.        
  143.        
  144.        
  145.     private boolean setSendToMsg(String to) {   
  146.         if (to.equals("") || to == null) {   
  147.             return false;   
  148.         }   
  149.         try {   
  150.             String sendto[];   
  151.             sendto = to.split(";");   
  152.             for (int i = 0; i < sendto.length; i++) {   
  153.                 mMimeMsg.addRecipients(Message.RecipientType.TO,   
  154.                         InternetAddress.parse(sendto[i]));   
  155.             }   
  156.             return true;   
  157.         } catch (Exception e) {   
  158.             return false;   
  159.         }   
  160.     }   
  161.   
  162.     private boolean setCopyToMsg(String copyto) {   
  163.         if (copyto.equals("") || copyto == null) {   
  164.             return false;   
  165.         }   
  166.         try {   
  167.             String copy[];   
  168.             copy = copyto.split(";");   
  169.             for (int i = 0; i < copy.length; i++) {   
  170.                 mMimeMsg.addRecipients(Message.RecipientType.CC,   
  171.                         InternetAddress.parse(copy[i]));   
  172.             }   
  173.             return true;   
  174.         } catch (Exception e) {   
  175.             return false;   
  176.         }   
  177.     }   
  178.        
  179.     private boolean setBCopyToMsg(String bcopyto){   
  180.         if (bcopyto.equals("") || bcopyto == null) {   
  181.             return false;   
  182.         }   
  183.         try {   
  184.             String bcopy[];   
  185.             bcopy = bcopyto.split(";");   
  186.             for (int i = 0; i < bcopy.length; i++) {   
  187.                 mMimeMsg.addRecipients(Message.RecipientType.BCC,   
  188.                         InternetAddress.parse(bcopy[i]));   
  189.             }   
  190.             return true;   
  191.         } catch (Exception e) {   
  192.             return true;   
  193.         }   
  194.     }   
  195.        
  196.     private boolean setContentMp(String conMp){   
  197.         try {   
  198.             BodyPart bp = new MimeBodyPart();   
  199.             bp.setContent(   
  200.                     "<meta http-equiv=Context-Type context=text/html;charset=gb2312>"  
  201.                             + conMp, "text/html;charset=GB2312");   
  202.             mp.addBodyPart(bp);   
  203.             return true;   
  204.         } catch (Exception e) {   
  205.             System.out.println("Set context Faild! " + e);   
  206.             return false;   
  207.         }   
  208.     }   
  209.        
  210.     private boolean addFile(String filePath){   
  211. //      System.out.println("add affix..");   
  212.         if (filePath.equals("") || filePath == null) {   
  213.             return false;   
  214.         }   
  215.         String file[];   
  216.         file = filePath.split(";");   
  217. //      System.out.println("you have " + file.length + " affix!");   
  218.         try {   
  219.             for (int i = 0; i < file.length; i++) {   
  220.                 BodyPart bp = new MimeBodyPart();   
  221.                 FileDataSource fileds = new FileDataSource(file[i]);   
  222.                 bp.setDataHandler(new DataHandler(fileds));   
  223.                 bp.setFileName(fileds.getName());   
  224.                 mp.addBodyPart(bp);   
  225.             }   
  226.             return true;   
  227.         } catch (Exception e) {   
  228.             Log.d(Tag, "add affix: " + filePath + "--faild!" + e);   
  229.             System.err.println("add affix: " + filePath + "--faild!" + e);   
  230.             return false;   
  231.         }   
  232.     }   
  233.        
  234.     private boolean setHost(String mailAddress){   
  235.         if(mailAddress.contains("@gmail.")){   
  236.             mSmtp_host = "smtp.gmail.com";   
  237.             mailType = MailType.TYPE_GMAIL;   
  238.             return true;   
  239.         }   
  240.         if(mailAddress.contains("@126.")){   
  241.             mSmtp_host = "smtp.126.com";   
  242.             mailType = MailType.TYPE_126;   
  243.             return true;   
  244.         }   
  245.         if(mailAddress.contains("@163.")){   
  246.             mSmtp_host = "smtp.163.com";   
  247.             mailType = MailType.TYPE_163;   
  248.             return true;   
  249.         }   
  250.         else  
  251.             return false;   
  252. /*      if(mailAddress.contains("@qq.")){  
  253.             mSmtp_host = "smtp.qq.com";  
  254.             mailType = MailType.TYPE_QQ;  
  255.         }*/  
  256.     }   
  257.        
  258.     private void executeMailandSend() {   
  259.   
  260.         try {   
  261.             mState = NONE;   
  262.             Properties props = System.getProperties();   
  263.             props = System.getProperties();   
  264.             if(mailType == MailType.TYPE_GMAIL){    //如果为gmail邮箱,需要设置下两项   
  265.                 props.put("mail.smtp.starttls.enable""true");   
  266.                 props.put("mail.smtp.port""587"); // gmail smtp port 587 / 465   
  267.             }   
  268.                
  269.             props.put("mail.smtp.host", mSmtp_host);   
  270.             props.put("mail.smtp.user", mFrom_userName);   
  271.             props.put("mail.smtp.password", mFrom_passWord);   
  272.             props.put("mail.smtp.auth""true");   
  273.   
  274.             mSession = Session.getDefaultInstance(props, null);   
  275.             mSession.setDebug(false);   
  276.   
  277.             mMimeMsg = new MimeMessage(mSession);   
  278.             mMimeMsg.setFrom(new InternetAddress(mFrom_userName));   
  279.                
  280.             //mMimeMsg.setContent(mContent, "text/html;charset=utf-8");        
  281.   
  282.             if(mToId != null)   
  283.                 setSendToMsg(mToId);   
  284.             if(mCcId != null)   
  285.                 setCopyToMsg(mCcId);   
  286.             if(mBccId != null)   
  287.                 setBCopyToMsg(mBccId);   
  288.                
  289.   
  290.             if(mSubject != null){   
  291.                 mMimeMsg.setSubject(mSubject);   
  292.             }   
  293.             if(mShow_name != null){   
  294.                 mMimeMsg.setFrom(new InternetAddress(mShow_name + "<"  
  295.                         + mFrom_userName + ">"));   
  296.             }   
  297.             if(mContent != null){   
  298.                 setContentMp(mContent);   
  299.                 mMimeMsg.setContent(mp);   
  300.             }   
  301.             if(mFilePath != null){   
  302.                 addFile(mFilePath);   
  303.             }   
  304.                
  305.                
  306.                
  307.             System.out.println(mMimeMsg.getAllRecipients().toString());   
  308.             Transport transport = mSession.getTransport("smtp");   
  309.             System.out.println("connecting...");   
  310.             mState = CONNECTING;   
  311.             transport.connect(mSmtp_host, mFrom_userName, mFrom_passWord);   
  312.             mState = CONNECTED;   
  313.             Log.i(Tag, "Connected to " + mFrom_userName + " succuss");   
  314.             System.out.println("sending...");   
  315.             mState = SENDING;   
  316.             transport.sendMessage(mMimeMsg, mMimeMsg.getAllRecipients());   
  317.             mState = SENDED;   
  318.             transport.close();   
  319.             Log.i(Tag, "Send a mail to " + mToId);   
  320.             System.out.println("send an email to " + mToId + " success");   
  321.         }   
  322.         catch (Exception e) {   
  323.             System.out.println("failure! ");   
  324.             Log.d(Tag, " failure! ", e);   
  325.             e.printStackTrace();       
  326.         }   
  327.   
  328.     }   
  329.   
  330. }  


    上面的类调用比较简单,再给一个使用的实例MailBackground.java:
Java代码 android 邮件开发(javax.mail) android 邮件开发(javax.mail)android 邮件开发(javax.mail)
  1. package com.jia.test;   
  2.   
  3. import android.app.Activity;   
  4. import android.os.Bundle;   
  5. import android.view.View;   
  6. import android.view.View.OnClickListener;   
  7. import android.widget.Button;   
  8. import android.widget.EditText;   
  9. import android.widget.TextView;   
  10. import android.widget.Toast;   
  11.   
  12. public class MailBackground extends Activity{   
  13.   
  14.     private EditText mEditText_1;   
  15.     private EditText mEditText_2;   
  16.     private EditText mEditText_3;   
  17.     private EditText mEditText_4;   
  18. //  private EditText mEditText_5;   
  19.     private Button mButton;   
  20.        
  21.     private TextView mTextView;   
  22.        
  23.     SMailSender mail;   
  24.        
  25.     private int mPreState;   
  26.     private int mRealState;   
  27.     private Thread thread_mail;   
  28.        
  29.     @Override  
  30.     public void onBackPressed() {   
  31.         super.onBackPressed();   
  32.         finish();   
  33.     }   
  34.   
  35.     @Override  
  36.     protected void onCreate(Bundle savedInstanceState) {   
  37.         super.onCreate(savedInstanceState);   
  38.         setContentView(R.layout.mail_layout);   
  39.            
  40.         mEditText_1 = (EditText)findViewById(R.id.email_num_to);   
  41.         mEditText_1.setText("sanditest01@126.com");   
  42.         mEditText_2 = (EditText)findViewById(R.id.email_num_cc);   
  43.         mEditText_2.setText("sanditest02@163.com");   
  44.         mEditText_3 = (EditText)findViewById(R.id.email_subject);   
  45.         mEditText_3.setText("hello, this is a test email");   
  46.         mEditText_4 = (EditText)findViewById(R.id.email_text);   
  47.         //mEditText_4.setText("您好:/n  this is a test email, you don't need to reply to, thanks for your help!");   
  48.         mEditText_4.setText("this is a test email, you don't need");   
  49. //      mEditText_5 = (EditText)findViewById(R.id.email_file);   
  50. //      mEditText_5.setText("");   
  51.            
  52.         mTextView = (TextView)findViewById(R.id.email_file_view);   
  53.            
  54.            
  55.         mButton = (Button)findViewById(R.id.button_sendEmail);   
  56.         mButton.setOnClickListener(new OnClickListener(){   
  57.             @Override  
  58.             public void onClick(View v) {   
  59.                 System.out.println("send clicked");   
  60.                 String to = mEditText_1.getText().toString();   
  61.                 String cc = mEditText_2.getText().toString();   
  62.                 String subject = mEditText_3.getText().toString();   
  63.                 String content = mEditText_4.getText().toString();   
  64. //              String filePath = mEditText_5.getText().toString();   
  65.                    
  66.                 mail = new SMailSender();   
  67.                    
  68. //              mail.setAuthor("sanditest01@126.com", "sanditest");   
  69.                 mail.setAuthor("sanditest01@gmail.com""sanditest");   
  70.                    
  71. //              mail.setAuthor("sanditest02@163.com", "sanditest");   
  72.                 mail.setShowName("Sandi");   
  73.                 mail.setTo(to); //密码:sanditest   
  74.                 mail.setCc(cc);   
  75.                 mail.setSubject(subject);   
  76.                 mail.setContent(content);   
  77.   
  78.                 mRealState = mPreState = 0;   
  79.                 thread_mail = new Thread(mail);   
  80.                 new Thread(r);   
  81.                 thread_mail.start();            //启动发送线程   
  82.                 //thread_state.start();         //启动状态监视线程   
  83.                 Monitor();   
  84.             }   
  85.         });   
  86.   
  87.     }   
  88.        
  89.     Runnable r = new Runnable(){   
  90.        
  91.             public void run() {   
  92.                 while(true){   
  93.                     try {   
  94.                         Thread.sleep(100);   
  95.                         mRealState = mail.getMailState();   
  96.                         System.out.println("mRealState = " + mRealState);   
  97.                         if(mRealState == mPreState)   
  98.                             continue;   
  99.                         if(1 == mRealState){   
  100.                             mPreState = mRealState;   
  101.                             System.out.println("Toast mRealState2 = " + mRealState);   
  102.                         }   
  103.                         if(2 == mRealState){   
  104.                             mPreState = mRealState;   
  105.                         }   
  106.                         if(3 == mRealState){   
  107.                             mPreState = mRealState;   
  108.                         }   
  109.                         if(4 == mRealState){        //邮件发送成功,线程退出   
  110.                             mPreState = mRealState;   
  111.                             break;   
  112.                         }   
  113.                     } catch (InterruptedException e) {   
  114.                         // TODO Auto-generated catch block   
  115.                         e.printStackTrace();   
  116.                     }   
  117.                 }   
  118.             }   
  119.         };   
  120.            
  121.     protected void Monitor() {   
  122.         while (true) {   
  123.             try {   
  124.                 Thread.sleep(10);   
  125.                 mRealState = mail.getMailState();   
  126.                 //System.out.println("mRealState = " + mRealState);   
  127.                 if (mRealState == mPreState)   
  128.                     continue;   
  129.                 if (1 == mRealState) {   
  130.                     mPreState = mRealState;   
  131.                     mTextView.setText("Connecting...");   
  132.                     System.out.println("Toast mRealState1 = " + mRealState);   
  133.                     // setTitle("Connecting...");   
  134.                     Toast.makeText(MailBackground.this"Connecting",   
  135.                             Toast.LENGTH_SHORT).show();   
  136.                     System.out.println("Toast mRealState2 = " + mRealState);   
  137.                 }   
  138.                 if (2 == mRealState) {   
  139.                     mPreState = mRealState;   
  140.                     mTextView.setText("Connecting success");   
  141.                     // setTitle("Connected success");   
  142.                     Toast.makeText(getApplicationContext(), "Connecting",   
  143.                             Toast.LENGTH_SHORT).show();   
  144.                 }   
  145.                 if (3 == mRealState) {   
  146.                     mPreState = mRealState;   
  147.                     mTextView.setText("Sending");   
  148.                     Toast.makeText(getApplicationContext(), "Sending",   
  149.                             Toast.LENGTH_SHORT).show();   
  150.                 }   
  151.                 if (4 == mRealState) { // 邮件发送成功,线程退出   
  152.                     mPreState = mRealState;   
  153.                     mTextView.setText("Send email success");   
  154.                     Toast.makeText(getApplicationContext(), "Send success!",   
  155.                             Toast.LENGTH_SHORT).show();   
  156.                     break;   
  157.                 }   
  158.             } catch (InterruptedException e) {   
  159.                 // TODO Auto-generated catch block   
  160.                 e.printStackTrace();   
  161.             }   
  162.         }   
  163.     }   
  164.   
  165. }