Android 自动发送邮件

来源:互联网 发布:dota视频软件 编辑:程序博客网 时间:2024/05/21 06:50


本文简述的是在Android平台如何自动发送邮件(没有邮件编写界面),主要应用场景为忘记密码等安全等级较高的操作,比如我忘记密码了,点击“发送密码到我的邮箱”系统会将密码发送到注册时的电子邮件地址。

 

Android平台邮件客户端

Gmail: Gmai电子邮件客户端

Email: 通用的电子邮件客户端

 

解决方案

Gmail

Gmail已经支持自动发送了,所以非常简单。在使用时,需要添加

<uses-permission android:name="com.google.android.gm.permission.AUTO_SEND" /> 到AndroidManifest.xml

示例代码如下:

Java代码 复制代码 收藏代码
  1. Intent intent = new Intent("com.google.android.gm.action.AUTO_SEND");   
  2. intent.setType("plain/text");   
  3. String[] reciver = new String[] { "xxxx@xxx.com" };   
  4. String subject = "email title";   
  5. String body = "email body";   
  6. intent.putExtra(android.content.Intent.EXTRA_EMAIL, reciver);   
  7. intent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);   
  8. intent.putExtra(android.content.Intent.EXTRA_TEXT, body);  

 Email

Email不支持自动发送,但又是默认邮件客户端,所以需要添加自动发送功能。主要实现步骤为:

编写一个自动发送邮件类

主要功能为:接收用户输入,组装message对象,获取Sender实例,将message发送出去,最后删除message对象(这样已发送的邮件内容不会出现在client中,提高发安全性)

Java代码 复制代码 收藏代码
  1. package com.android.email.activity;   
  2.   
  3. import android.app.Activity;   
  4. import android.app.ProgressDialog;   
  5. import android.content.ContentUris;   
  6. import android.content.Context;   
  7. import android.content.Intent;   
  8. import android.os.AsyncTask;   
  9. import android.os.Bundle;   
  10. import android.text.TextUtils;   
  11. import android.util.Log;   
  12. import android.view.View;   
  13. import android.view.Window;   
  14. import android.net.Uri;   
  15. import android.widget.Toast;   
  16.   
  17. import com.android.emailcommon.provider.EmailContent;   
  18. import com.android.emailcommon.provider.EmailContent.Account;   
  19. import com.android.emailcommon.provider.EmailContent.Message;   
  20. import com.android.emailcommon.mail.MessagingException;   
  21. import com.android.emailcommon.mail.Address;   
  22. import com.android.emailcommon.utility.Utility;   
  23. import com.android.emailcommon.mail.AuthenticationFailedException;   
  24. import com.android.email.EmailAddressValidator;   
  25. import com.android.email.mail.Sender;   
  26.   
  27. /**  
  28.  * Send email in background with account configured in Email application. 
  29.  * Sending message will not saved as draft or in out-going box. Usage: 
  30.  *   
  31.  * <pre>  
  32.  * Intent intent = new Intent(&quot;com.android.email.intent.action.sendInBack&quot;); 
  33.  * String[] reciver = new String[] { &quot;your_name@corp.com&quot; }; 
  34.  * String subject = &quot;email title&quot;;  
  35.  * String body = &quot;email body &quot;;  
  36.  * intent.putExtra(android.content.Intent.EXTRA_EMAIL, reciver[0]); 
  37.  * intent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject); 
  38.  * intent.putExtra(android.content.Intent.EXTRA_TEXT, body); 
  39.  * startActivityForResult(Intent.createChooser(intent, &quot;send&quot;), 0x02); 
  40.  * </pre>  
  41.  *   
  42.  * Now, attachment and multi-receiver function is unsupported. 
  43.  *   
  44.  * @author melord  
  45.  *   
  46.  */  
  47. public class EmailSendAutoActivity extends Activity implements SendListener {   
  48.   
  49.     private static String tag = "EmailSendAutoAcitivity";   
  50.     private Context mContext;   
  51.   
  52.     private String mTo;   
  53.     private String mCc;   
  54.     private String mBcc;   
  55.     private String mSubject;   
  56.     private String mBody;   
  57.   
  58.     private EmailAddressValidator mValidator = new EmailAddressValidator();   
  59.     private SendListener mListener;   
  60.     private Toast mWaiting;   
  61.     private boolean enableLog = true;   
  62.   
  63.     /**  
  64.      * Sending account email address.  
  65.      */  
  66.     private String mSendEmail;   
  67.     /**  
  68.      * Sending account id  
  69.      */  
  70.     private long mAccountId = -1;   
  71.   
  72.     @Override  
  73.     protected void onCreate(Bundle savedInstanceState) {   
  74.         super.onCreate(savedInstanceState);   
  75.         this.mContext = this;   
  76.         requestWindowFeature(Window.FEATURE_NO_TITLE);   
  77.   
  78.         mListener = this;   
  79.         Intent intent = getIntent();   
  80.         initMessageFromIntent(intent);   
  81.         initAccountFromIntent(intent);   
  82.   
  83.         new SendTask().execute();   
  84.         String msg = intent.getStringExtra("sendMsg");   
  85.         if (msg == null) {   
  86.             msg = "Sending message...";   
  87.         }   
  88.         // mWaiting = ProgressDialog.show(this, "", "sending...", true, true,  
  89.         // null);   
  90.         mWaiting = Toast.makeText(this, msg, Toast.LENGTH_LONG);   
  91.         mWaiting.show();   
  92.     }   
  93.   
  94.     @Override  
  95.     public void onBackPressed() {   
  96.         if (mWaiting != null) {   
  97.             mWaiting.cancel();   
  98.         }   
  99.         super.onBackPressed();   
  100.     }   
  101.   
  102.     @Override  
  103.     public void finish() {   
  104.         if (mWaiting != null) {   
  105.             mWaiting.cancel();   
  106.         }   
  107.         super.finish();   
  108.     }   
  109.   
  110.     /**  
  111.      * Initialize sending account from intent.  
  112.      *   
  113.      * @param intent  
  114.      *            imcoming intent  
  115.      */  
  116.     private void initAccountFromIntent(Intent intent) {   
  117.         String email = intent.getStringExtra("sendAccount");   
  118.         if (email != null) {   
  119.             log(String.format("send email use account (%s) ", email));   
  120.             mSendEmail = email;   
  121.             Long[] ids = EmailContent.Account.getAllAccountIds(this);   
  122.             if (ids != null && ids.length > 0) {   
  123.                 for (int i = 0; i < ids.length; i++) {   
  124.                     EmailContent.Account temp = EmailContent.Account   
  125.                             .restoreAccountWithId(this, ids[i]);   
  126.                     if (temp != null && email.equals(temp.getEmailAddress())) {   
  127.                         log("valid account");   
  128.                         mAccountId = ids[i];   
  129.                         break;   
  130.                     }   
  131.                 }   
  132.             }   
  133.         }   
  134.     }   
  135.   
  136.     /**  
  137.      * Initialize message from intent.  
  138.      *   
  139.      * @param intent  
  140.      *            intent  
  141.      */  
  142.     private void initMessageFromIntent(Intent intent) {   
  143.         String to = intent.getStringExtra(Intent.EXTRA_EMAIL);   
  144.         mTo = composeAddress(to);   
  145.   
  146.         String cc = intent.getStringExtra(Intent.EXTRA_CC);   
  147.         mCc = composeAddress(cc);   
  148.   
  149.         String bcc = intent.getStringExtra(Intent.EXTRA_BCC);   
  150.         mBcc = composeAddress(bcc);   
  151.   
  152.         mSubject = intent.getStringExtra(Intent.EXTRA_SUBJECT);   
  153.   
  154.         mBody = intent.getStringExtra(Intent.EXTRA_TEXT);   
  155.   
  156.         log("to:" + mTo);   
  157.         log("cc:" + mCc);   
  158.         log("bcc:" + mBcc);   
  159.   
  160.     }   
  161.   
  162.     /**  
  163.      * change to stand email address reference to Rfc822 
  164.      *   
  165.      * @param address  
  166.      *            email address  
  167.      * @return RFC822 format email address  
  168.      */  
  169.     private String composeAddress(String address) {   
  170.         String addr = null;   
  171.         if (!TextUtils.isEmpty(address)) {   
  172.             Address[] addresses = Address.parse(address.trim());   
  173.             addr = Address.pack(addresses);   
  174.         }   
  175.         return addr;   
  176.     }   
  177.   
  178.     /**  
  179.      * Update message. fill fields.  
  180.      *   
  181.      * @param message  
  182.      *            email message  
  183.      * @param account  
  184.      *            sending account  
  185.      */  
  186.     private void updateMessage(Message message, Account account) {   
  187.         if (message.mMessageId == null || message.mMessageId.length() == 0) {   
  188.             message.mMessageId = Utility.generateMessageId();   
  189.         }   
  190.         message.mTimeStamp = System.currentTimeMillis();   
  191.         // it will : Name<Address>   
  192.         message.mFrom = new Address(account.getEmailAddress(), account   
  193.                 .getSenderName()).pack();   
  194.         message.mTo = mTo;   
  195.         message.mCc = mCc;   
  196.         message.mBcc = mBcc;   
  197.         message.mSubject = mSubject;   
  198.         message.mText = mBody;   
  199.         message.mAccountKey = account.mId;   
  200.         // here just used account setting simply  
  201.         message.mDisplayName = account.getSenderName();   
  202.         message.mFlagRead = true;   
  203.         message.mFlagLoaded = Message.FLAG_LOADED_COMPLETE;   
  204.   
  205.     }   
  206.   
  207.     private void log(String msg) {   
  208.         if (enableLog) {   
  209.             Log.i(tag, msg);   
  210.         }   
  211.     }   
  212.   
  213.     /**  
  214.      * Really send message.  
  215.      *   
  216.      * @param account  
  217.      *            sending account  
  218.      * @param messageId  
  219.      *            message id  
  220.      */  
  221.     public void sendMessage(Account account, long messageId) {   
  222.         // message uri   
  223.         Uri uri = ContentUris.withAppendedId(EmailContent.Message.CONTENT_URI,   
  224.                 messageId);   
  225.         try {   
  226.             // get a sender, ex. smtp sender.  
  227.             Sender sender = Sender.getInstance(mContext, account   
  228.                     .getSenderUri(mContext));   
  229.             // sending started   
  230.             mListener.onStarted(account.mId, messageId);   
  231.             // sending   
  232.             sender.sendMessage(messageId);   
  233.             // send completed   
  234.             mListener.onCompleted(account.mId);   
  235.   
  236.         } catch (MessagingException me) {   
  237.             // report error   
  238.             mListener.onFailed(account.mId, messageId, me);   
  239.         } finally {   
  240.             try {   
  241.                 // delete this message whenever send successfully or not  
  242.                 mContext.getContentResolver().delete(uri, nullnull);   
  243.             } catch (Exception ex) {   
  244.                 Log.w(tag, "delete message occur exception message uri:" + uri);   
  245.             }   
  246.         }   
  247.     }   
  248.   
  249.     public void onCompleted(long accountId) {   
  250.         log("send mail ok");   
  251.         // return Activity.RESULT_OK when send successfully  
  252.         setResult(RESULT_OK);   
  253.         finish();   
  254.     }   
  255.   
  256.     public void onFailed(long accountId, long messageId, Exception ex) {   
  257.         log("send mail failed : " + ex.toString());   
  258.         finish();   
  259.     }   
  260.   
  261.     public void onStarted(long messageId, long accountId) {   
  262.         log("send mail started");   
  263.     }   
  264.   
  265.     /**  
  266.      * Send message task, it is an async task  
  267.      *   
  268.      * @author melord_li  
  269.      *   
  270.      */  
  271.     private class SendTask extends AsyncTask<Void, Void, Void> {   
  272.         @Override  
  273.         protected Void doInBackground(Void... params) {   
  274.             // get default account, if not set, first record is treated as  
  275.             // default.   
  276.             // long id = Account.getDefaultAccountId(mContext);  
  277.             long id = mAccountId;   
  278.             if (id < 0) {   
  279.                 id = Account.getDefaultAccountId(mContext);   
  280.             }   
  281.             if (id < 0) {   
  282.                 Log.w(tag, "no account exists");   
  283.                 finish();   
  284.                 return null;   
  285.             }   
  286.             // get full account message   
  287.             Account account = Account.restoreAccountWithId(mContext, id);   
  288.   
  289.             // A empty message   
  290.             Message message = new Message();   
  291.             // fill message field   
  292.             updateMessage(message, account);   
  293.   
  294.             // Save this message. Because send API will read message in message  
  295.             // db.   
  296.             Uri uri = message.save(mContext);   
  297.             if (uri == null) {   
  298.                 Log.e(tag, "save message occured an error");   
  299.                 finish();   
  300.                 return null;   
  301.             }   
  302.   
  303.             // send   
  304.             sendMessage(account, message.mId);   
  305.             return null;   
  306.         }   
  307.     }   
  308. }   
  309.   
  310. /**  
  311.  * Sending monitor  
  312.  *   
  313.  * @author melord  
  314.  *   
  315.  */  
  316. interface SendListener {   
  317.   
  318.     /**  
  319.      * Send failed.  
  320.      *   
  321.      * @param accountId  
  322.      *            account id  
  323.      * @param messageId  
  324.      *            message id  
  325.      * @param ex  
  326.      *            exception  
  327.      */  
  328.     void onFailed(long accountId, long messageId, Exception ex);   
  329.   
  330.     /**  
  331.      * Send begin.  
  332.      *   
  333.      * @param accountId  
  334.      *            account id  
  335.      * @param messageId  
  336.      *            message id  
  337.      */  
  338.     void onStarted(long messageId, long accountId);   
  339.   
  340.     /**  
  341.      * Send completed.  
  342.      *   
  343.      * @param accountId  
  344.      *            account id  
  345.      */  
  346.     void onCompleted(long accountId);   
  347. }  

 配置

Xml代码 复制代码 收藏代码
  1. <activity android:name=".activity.EmailSendAutoActivity" android:theme="@android:style/Theme.Translucent">  
  2.     <intent-filter>  
  3.         <action android:name="com.android.email.intent.action.sendInBack"/>  
  4.         <data android:mimeType="*/*" />  
  5.         <category android:name="android.intent.category.DEFAULT" />  
  6.     </intent-filter>  
  7. </activity>  

 使用

Java代码 复制代码 收藏代码
  1. Intent intent = new Intent("com.android.email.intent.action.sendInBack");   
  2. String[] reciver = new String[] { "yourname@corp.com" };   
  3. String subject = "email title";   
  4. String body = "email body";   
  5. intent.putExtra(android.content.Intent.EXTRA_EMAIL, reciver[0]);   
  6. intent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);   
  7. intent.putExtra(android.content.Intent.EXTRA_TEXT, body);   
  8.   
  9. startActivityForResult(Intent.createChooser(intent, "send"), 0x02);  

 处理回调

如果发送成功,会返回RESULT_OK。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果6s一直白屏怎么办 苹果6白屏了怎么办 苹果6s听筒掉漆怎么办 苹果6splus跳屏怎么办 蘑菇街发货好慢怎么办 买手机不给开票怎么办 泰迪狗皮肤病怎么办 狗狗皮肤病严重怎么办? 钢梁高厚比超限怎么办 手机壳按键难按怎么办 层间位移角超限怎么办 淘宝店排名靠后怎么办 如果地震了你会怎么办 地震来了怎么办60字 如果迷路了你会怎么办 吃多了抽烟想吐怎么办 晚上牙疼得要命怎么办 楼梯被火封锁后怎么办 牙齿疼怎么办能快速不疼 我被短信轰炸了怎么办 火警响了在家该怎么办 痔疮肉球变大了怎么办 痔疮长了好几个怎么办 苹果7手机丢了怎么办 如果油锅着火了怎么办 家里电气著火了怎么办 你家油锅起火了怎么办 交通事故后对方不肯去处理怎么办 租的车出了事故怎么办 借的车出了事故怎么办 台风来了怎么办小知识 台中班台风来了怎么办 地震时在五楼怎么办 小事故对方不来怎么办 发生交通事故对方不处理怎么办 当地震来了该怎么办 地震来了该怎么办教案 地震来了怎么办的问题 住30楼的地震了怎么办 在家里地震来了怎么办? 乐高地震来了怎么办?