Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Android中如何使用Java Mail API發送郵件

Android中如何使用Java Mail API發送郵件

編輯:Android開發教程

最近在考慮為已經有的一個應用程序增加一個用戶反饋的功能,用戶可以通過反饋功能將用戶的意見和建議、程序出現的問題以一種更符合用戶習慣的方式反饋回來。網上也有一些實現好的反饋程序的服務,包括bug的提交、程序的建議、程序使用中的問題,但是這樣的服務基本上不是完全開源和免費的,並且我對程序反饋的定位還是用戶可以把他的想法通過寫文字的方法發送回來就可以(不需要記錄崩潰時的系統狀況),所以還是決定在完全了解實現機制的基礎上來實現反饋功能。

采用發送郵件的方式不需要自己構建服務器,同時也符合我對反饋的管理習慣,因此決定采用在通過在應用程序內發送郵件的方式來實現反饋功能。

stackoverflow上的回答http://stackoverflow.com/a/2033124/1767800基本給出了在Android中實現在應用程序內部發送郵件的方法,在閱讀該代碼的時候我一直在找smtp是如何認證的。後來發現該實現方法中GmailSender直接繼承了javax.mail.Authenticator類,實現了getPasswordAuthentication方法,並且通過Session.getDefaultInstance(props, this)(getDefaultInstance(Properties props, Authenticator authenticator) )語句在建立session的同時將authenticator屬性寫入。

為了實現在Android的應用程序內部發送郵件,其中有兩點可能的修改需要注意:

1.該回答使用的是Gmail賬戶作為發送郵件的賬戶,如果采用其它的賬戶需要對發送郵件服務器和端口號進行單獨的設置。

對於126或者163郵箱而言,只需要將properties設置的部分修改為:

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", "25");

參考:http://www.cnblogs.com/peakzheng/archive/2012/02/04/2338671.html

2.需要將UI線程(主線程)中的發送郵件操作轉移到單獨的線程進行處理

Google在honeycomb的發布版之後就對主線程中的操作進行了更加嚴格的要求。為了保證用戶體驗,在主線程中不能網絡數據傳輸操作,因為在主線程中進行網絡數據傳輸可能會帶來主界面的長時間不響應用戶的點擊操作,從而帶來不好的用戶體驗(參考)。對於輕量級的網絡操作,Android系統中,通常通過AsyncTask類來實現。

查看本欄目更多精彩內容:http://www.bianceng.cn/OS/extra/

按說Android在高版本的系統中對應用程序在主界面訪問網絡的操作都會提示android.os.NetworkOnMainThreadException錯誤,但是在使用Java Mail API進行應用程序內的郵件發送時,我遇到的情況是在2.3版本的模擬器上運行程序,接收方可以收到發送的郵件。同樣的代碼在在4.2.2版本的手機上卻無法成功發送郵件,在Eclipse下的logcat界面中沒有任何錯誤提示。stackoverflow上的回答http://stackoverflow.com/a/2033124/1767800後也有人給出了類似的評論。

但是,在將sender.sendMail()函數轉移到asyncTask類中之後,在4.2.2的手機中也可以成功發送郵件了。具體實現是:

1)新建一個繼承自AsyncTask的類

class SendMailTask  extends AsyncTask<URL, Integer, Long> {   
    MailSender sender;   
    public SendMailTask(MailSender sender) {   
        // TODO Auto-generated constructor stub   
        this.sender=sender;   
    }   
    protected Long doInBackground(URL... urls) {   
               
        long totalSize = 0;   
        try {   
            this.sender.sendMail("This is Subject",      
                    "This is Body",      
                    "senderAddress",      
                    "receiverAddress");   
        } catch (Exception e) {   
            // TODO Auto-generated catch block   
            e.printStackTrace();   
        }   
        return totalSize;   
    }   
       
    protected void onProgressUpdate(Integer... progress) {   
    }   
       
    protected void onPostExecute(Long result) {   
    }   
}

2)通過如下語句發送郵件

new SendMailTask(sender).execute();

通過gmail接收的郵件如下圖所示

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved