Android 自动发送邮件

本文介绍了在Android平台上如何自动发送邮件,适用于安全敏感场景,如忘记密码时发送新密码到注册邮箱。教程覆盖了Gmail和通用邮件客户端的实现方式,并提供了相应的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

Android平台邮件客户端

Gmail: Gmai电子邮件客户端

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

解决方案

Gmail

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

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

示例代码如下:

Java代码 复制代码 收藏代码
  1. Intentintent=newIntent("com.google.android.gm.action.AUTO_SEND");
  2. intent.setType("plain/text");
  3. String[]reciver=newString[]{"xxxx@xxx.com"};
  4. Stringsubject="emailtitle";
  5. Stringbody="emailbody";
  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);
		 Intent intent = new Intent("com.google.android.gm.action.AUTO_SEND");
		 intent.setType("plain/text");
		 String[] reciver = new String[] { "xxxx@xxx.com" };
		 String subject = "email title";
		 String body = "email body";
		 intent.putExtra(android.content.Intent.EXTRA_EMAIL, reciver);
		 intent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
		 intent.putExtra(android.content.Intent.EXTRA_TEXT, body);

Email

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

编写一个自动发送邮件类

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

Java代码 复制代码 收藏代码
  1. packagecom.android.email.activity;
  2. importandroid.app.Activity;
  3. importandroid.app.ProgressDialog;
  4. importandroid.content.ContentUris;
  5. importandroid.content.Context;
  6. importandroid.content.Intent;
  7. importandroid.os.AsyncTask;
  8. importandroid.os.Bundle;
  9. importandroid.text.TextUtils;
  10. importandroid.util.Log;
  11. importandroid.view.View;
  12. importandroid.view.Window;
  13. importandroid.net.Uri;
  14. importandroid.widget.Toast;
  15. importcom.android.emailcommon.provider.EmailContent;
  16. importcom.android.emailcommon.provider.EmailContent.Account;
  17. importcom.android.emailcommon.provider.EmailContent.Message;
  18. importcom.android.emailcommon.mail.MessagingException;
  19. importcom.android.emailcommon.mail.Address;
  20. importcom.android.emailcommon.utility.Utility;
  21. importcom.android.emailcommon.mail.AuthenticationFailedException;
  22. importcom.android.email.EmailAddressValidator;
  23. importcom.android.email.mail.Sender;
  24. /**
  25. *SendemailinbackgroundwithaccountconfiguredinEmailapplication.
  26. *Sendingmessagewillnotsavedasdraftorinout-goingbox.Usage:
  27. *
  28. *<pre>
  29. *Intentintent=newIntent(&quot;com.android.email.intent.action.sendInBack&quot;);
  30. *String[]reciver=newString[]{&quot;your_name@corp.com&quot;};
  31. *Stringsubject=&quot;emailtitle&quot;;
  32. *Stringbody=&quot;emailbody&quot;;
  33. *intent.putExtra(android.content.Intent.EXTRA_EMAIL,reciver[0]);
  34. *intent.putExtra(android.content.Intent.EXTRA_SUBJECT,subject);
  35. *intent.putExtra(android.content.Intent.EXTRA_TEXT,body);
  36. *startActivityForResult(Intent.createChooser(intent,&quot;send&quot;),0x02);
  37. *</pre>
  38. *
  39. *Now,attachmentandmulti-receiverfunctionisunsupported.
  40. *
  41. *@authormelord
  42. *
  43. */
  44. publicclassEmailSendAutoActivityextendsActivityimplementsSendListener{
  45. privatestaticStringtag="EmailSendAutoAcitivity";
  46. privateContextmContext;
  47. privateStringmTo;
  48. privateStringmCc;
  49. privateStringmBcc;
  50. privateStringmSubject;
  51. privateStringmBody;
  52. privateEmailAddressValidatormValidator=newEmailAddressValidator();
  53. privateSendListenermListener;
  54. privateToastmWaiting;
  55. privatebooleanenableLog=true;
  56. /**
  57. *Sendingaccountemailaddress.
  58. */
  59. privateStringmSendEmail;
  60. /**
  61. *Sendingaccountid
  62. */
  63. privatelongmAccountId=-1;
  64. @Override
  65. protectedvoidonCreate(BundlesavedInstanceState){
  66. super.onCreate(savedInstanceState);
  67. this.mContext=this;
  68. requestWindowFeature(Window.FEATURE_NO_TITLE);
  69. mListener=this;
  70. Intentintent=getIntent();
  71. initMessageFromIntent(intent);
  72. initAccountFromIntent(intent);
  73. newSendTask().execute();
  74. Stringmsg=intent.getStringExtra("sendMsg");
  75. if(msg==null){
  76. msg="Sendingmessage...";
  77. }
  78. //mWaiting=ProgressDialog.show(this,"","sending...",true,true,
  79. //null);
  80. mWaiting=Toast.makeText(this,msg,Toast.LENGTH_LONG);
  81. mWaiting.show();
  82. }
  83. @Override
  84. publicvoidonBackPressed(){
  85. if(mWaiting!=null){
  86. mWaiting.cancel();
  87. }
  88. super.onBackPressed();
  89. }
  90. @Override
  91. publicvoidfinish(){
  92. if(mWaiting!=null){
  93. mWaiting.cancel();
  94. }
  95. super.finish();
  96. }
  97. /**
  98. *Initializesendingaccountfromintent.
  99. *
  100. *@paramintent
  101. *imcomingintent
  102. */
  103. privatevoidinitAccountFromIntent(Intentintent){
  104. Stringemail=intent.getStringExtra("sendAccount");
  105. if(email!=null){
  106. log(String.format("sendemailuseaccount(%s)",email));
  107. mSendEmail=email;
  108. Long[]ids=EmailContent.Account.getAllAccountIds(this);
  109. if(ids!=null&&ids.length>0){
  110. for(inti=0;i<ids.length;i++){
  111. EmailContent.Accounttemp=EmailContent.Account
  112. .restoreAccountWithId(this,ids[i]);
  113. if(temp!=null&&email.equals(temp.getEmailAddress())){
  114. log("validaccount");
  115. mAccountId=ids[i];
  116. break;
  117. }
  118. }
  119. }
  120. }
  121. }
  122. /**
  123. *Initializemessagefromintent.
  124. *
  125. *@paramintent
  126. *intent
  127. */
  128. privatevoidinitMessageFromIntent(Intentintent){
  129. Stringto=intent.getStringExtra(Intent.EXTRA_EMAIL);
  130. mTo=composeAddress(to);
  131. Stringcc=intent.getStringExtra(Intent.EXTRA_CC);
  132. mCc=composeAddress(cc);
  133. Stringbcc=intent.getStringExtra(Intent.EXTRA_BCC);
  134. mBcc=composeAddress(bcc);
  135. mSubject=intent.getStringExtra(Intent.EXTRA_SUBJECT);
  136. mBody=intent.getStringExtra(Intent.EXTRA_TEXT);
  137. log("to:"+mTo);
  138. log("cc:"+mCc);
  139. log("bcc:"+mBcc);
  140. }
  141. /**
  142. *changetostandemailaddressreferencetoRfc822
  143. *
  144. *@paramaddress
  145. *emailaddress
  146. *@returnRFC822formatemailaddress
  147. */
  148. privateStringcomposeAddress(Stringaddress){
  149. Stringaddr=null;
  150. if(!TextUtils.isEmpty(address)){
  151. Address[]addresses=Address.parse(address.trim());
  152. addr=Address.pack(addresses);
  153. }
  154. returnaddr;
  155. }
  156. /**
  157. *Updatemessage.fillfields.
  158. *
  159. *@parammessage
  160. *emailmessage
  161. *@paramaccount
  162. *sendingaccount
  163. */
  164. privatevoidupdateMessage(Messagemessage,Accountaccount){
  165. if(message.mMessageId==null||message.mMessageId.length()==0){
  166. message.mMessageId=Utility.generateMessageId();
  167. }
  168. message.mTimeStamp=System.currentTimeMillis();
  169. //itwill:Name<Address>
  170. message.mFrom=newAddress(account.getEmailAddress(),account
  171. .getSenderName()).pack();
  172. message.mTo=mTo;
  173. message.mCc=mCc;
  174. message.mBcc=mBcc;
  175. message.mSubject=mSubject;
  176. message.mText=mBody;
  177. message.mAccountKey=account.mId;
  178. //herejustusedaccountsettingsimply
  179. message.mDisplayName=account.getSenderName();
  180. message.mFlagRead=true;
  181. message.mFlagLoaded=Message.FLAG_LOADED_COMPLETE;
  182. }
  183. privatevoidlog(Stringmsg){
  184. if(enableLog){
  185. Log.i(tag,msg);
  186. }
  187. }
  188. /**
  189. *Reallysendmessage.
  190. *
  191. *@paramaccount
  192. *sendingaccount
  193. *@parammessageId
  194. *messageid
  195. */
  196. publicvoidsendMessage(Accountaccount,longmessageId){
  197. //messageuri
  198. Uriuri=ContentUris.withAppendedId(EmailContent.Message.CONTENT_URI,
  199. messageId);
  200. try{
  201. //getasender,ex.smtpsender.
  202. Sendersender=Sender.getInstance(mContext,account
  203. .getSenderUri(mContext));
  204. //sendingstarted
  205. mListener.onStarted(account.mId,messageId);
  206. //sending
  207. sender.sendMessage(messageId);
  208. //sendcompleted
  209. mListener.onCompleted(account.mId);
  210. }catch(MessagingExceptionme){
  211. //reporterror
  212. mListener.onFailed(account.mId,messageId,me);
  213. }finally{
  214. try{
  215. //deletethismessagewheneversendsuccessfullyornot
  216. mContext.getContentResolver().delete(uri,null,null);
  217. }catch(Exceptionex){
  218. Log.w(tag,"deletemessageoccurexceptionmessageuri:"+uri);
  219. }
  220. }
  221. }
  222. publicvoidonCompleted(longaccountId){
  223. log("sendmailok");
  224. //returnActivity.RESULT_OKwhensendsuccessfully
  225. setResult(RESULT_OK);
  226. finish();
  227. }
  228. publicvoidonFailed(longaccountId,longmessageId,Exceptionex){
  229. log("sendmailfailed:"+ex.toString());
  230. finish();
  231. }
  232. publicvoidonStarted(longmessageId,longaccountId){
  233. log("sendmailstarted");
  234. }
  235. /**
  236. *Sendmessagetask,itisanasynctask
  237. *
  238. *@authormelord_li
  239. *
  240. */
  241. privateclassSendTaskextendsAsyncTask<Void,Void,Void>{
  242. @Override
  243. protectedVoiddoInBackground(Void...params){
  244. //getdefaultaccount,ifnotset,firstrecordistreatedas
  245. //default.
  246. //longid=Account.getDefaultAccountId(mContext);
  247. longid=mAccountId;
  248. if(id<0){
  249. id=Account.getDefaultAccountId(mContext);
  250. }
  251. if(id<0){
  252. Log.w(tag,"noaccountexists");
  253. finish();
  254. returnnull;
  255. }
  256. //getfullaccountmessage
  257. Accountaccount=Account.restoreAccountWithId(mContext,id);
  258. //Aemptymessage
  259. Messagemessage=newMessage();
  260. //fillmessagefield
  261. updateMessage(message,account);
  262. //Savethismessage.BecausesendAPIwillreadmessageinmessage
  263. //db.
  264. Uriuri=message.save(mContext);
  265. if(uri==null){
  266. Log.e(tag,"savemessageoccuredanerror");
  267. finish();
  268. returnnull;
  269. }
  270. //send
  271. sendMessage(account,message.mId);
  272. returnnull;
  273. }
  274. }
  275. }
  276. /**
  277. *Sendingmonitor
  278. *
  279. *@authormelord
  280. *
  281. */
  282. interfaceSendListener{
  283. /**
  284. *Sendfailed.
  285. *
  286. *@paramaccountId
  287. *accountid
  288. *@parammessageId
  289. *messageid
  290. *@paramex
  291. *exception
  292. */
  293. voidonFailed(longaccountId,longmessageId,Exceptionex);
  294. /**
  295. *Sendbegin.
  296. *
  297. *@paramaccountId
  298. *accountid
  299. *@parammessageId
  300. *messageid
  301. */
  302. voidonStarted(longmessageId,longaccountId);
  303. /**
  304. *Sendcompleted.
  305. *
  306. *@paramaccountId
  307. *accountid
  308. */
  309. voidonCompleted(longaccountId);
  310. }
package com.android.email.activity;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.net.Uri;
import android.widget.Toast;

import com.android.emailcommon.provider.EmailContent;
import com.android.emailcommon.provider.EmailContent.Account;
import com.android.emailcommon.provider.EmailContent.Message;
import com.android.emailcommon.mail.MessagingException;
import com.android.emailcommon.mail.Address;
import com.android.emailcommon.utility.Utility;
import com.android.emailcommon.mail.AuthenticationFailedException;
import com.android.email.EmailAddressValidator;
import com.android.email.mail.Sender;

/**
 * Send email in background with account configured in Email application.
 * Sending message will not saved as draft or in out-going box. Usage:
 * 
 * <pre>
 * Intent intent = new Intent(&quot;com.android.email.intent.action.sendInBack&quot;);
 * String[] reciver = new String[] { &quot;your_name@corp.com&quot; };
 * String subject = &quot;email title&quot;;
 * String body = &quot;email body &quot;;
 * intent.putExtra(android.content.Intent.EXTRA_EMAIL, reciver[0]);
 * intent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
 * intent.putExtra(android.content.Intent.EXTRA_TEXT, body);
 * startActivityForResult(Intent.createChooser(intent, &quot;send&quot;), 0x02);
 * </pre>
 * 
 * Now, attachment and multi-receiver function is unsupported.
 * 
 * @author melord
 * 
 */
public class EmailSendAutoActivity extends Activity implements SendListener {

    private static String tag = "EmailSendAutoAcitivity";
    private Context mContext;

    private String mTo;
    private String mCc;
    private String mBcc;
    private String mSubject;
    private String mBody;

    private EmailAddressValidator mValidator = new EmailAddressValidator();
    private SendListener mListener;
    private Toast mWaiting;
    private boolean enableLog = true;

    /**
     * Sending account email address.
     */
    private String mSendEmail;
    /**
     * Sending account id
     */
    private long mAccountId = -1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.mContext = this;
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        mListener = this;
        Intent intent = getIntent();
        initMessageFromIntent(intent);
        initAccountFromIntent(intent);

        new SendTask().execute();
        String msg = intent.getStringExtra("sendMsg");
        if (msg == null) {
            msg = "Sending message...";
        }
        // mWaiting = ProgressDialog.show(this, "", "sending...", true, true,
        // null);
        mWaiting = Toast.makeText(this, msg, Toast.LENGTH_LONG);
        mWaiting.show();
    }

    @Override
    public void onBackPressed() {
        if (mWaiting != null) {
            mWaiting.cancel();
        }
        super.onBackPressed();
    }

    @Override
    public void finish() {
        if (mWaiting != null) {
            mWaiting.cancel();
        }
        super.finish();
    }

    /**
     * Initialize sending account from intent.
     * 
     * @param intent
     *            imcoming intent
     */
    private void initAccountFromIntent(Intent intent) {
        String email = intent.getStringExtra("sendAccount");
        if (email != null) {
            log(String.format("send email use account (%s) ", email));
            mSendEmail = email;
            Long[] ids = EmailContent.Account.getAllAccountIds(this);
            if (ids != null && ids.length > 0) {
                for (int i = 0; i < ids.length; i++) {
                    EmailContent.Account temp = EmailContent.Account
                            .restoreAccountWithId(this, ids[i]);
                    if (temp != null && email.equals(temp.getEmailAddress())) {
                        log("valid account");
                        mAccountId = ids[i];
                        break;
                    }
                }
            }
        }
    }

    /**
     * Initialize message from intent.
     * 
     * @param intent
     *            intent
     */
    private void initMessageFromIntent(Intent intent) {
        String to = intent.getStringExtra(Intent.EXTRA_EMAIL);
        mTo = composeAddress(to);

        String cc = intent.getStringExtra(Intent.EXTRA_CC);
        mCc = composeAddress(cc);

        String bcc = intent.getStringExtra(Intent.EXTRA_BCC);
        mBcc = composeAddress(bcc);

        mSubject = intent.getStringExtra(Intent.EXTRA_SUBJECT);

        mBody = intent.getStringExtra(Intent.EXTRA_TEXT);

        log("to:" + mTo);
        log("cc:" + mCc);
        log("bcc:" + mBcc);

    }

    /**
     * change to stand email address reference to Rfc822
     * 
     * @param address
     *            email address
     * @return RFC822 format email address
     */
    private String composeAddress(String address) {
        String addr = null;
        if (!TextUtils.isEmpty(address)) {
            Address[] addresses = Address.parse(address.trim());
            addr = Address.pack(addresses);
        }
        return addr;
    }

    /**
     * Update message. fill fields.
     * 
     * @param message
     *            email message
     * @param account
     *            sending account
     */
    private void updateMessage(Message message, Account account) {
        if (message.mMessageId == null || message.mMessageId.length() == 0) {
            message.mMessageId = Utility.generateMessageId();
        }
        message.mTimeStamp = System.currentTimeMillis();
        // it will : Name<Address>
        message.mFrom = new Address(account.getEmailAddress(), account
                .getSenderName()).pack();
        message.mTo = mTo;
        message.mCc = mCc;
        message.mBcc = mBcc;
        message.mSubject = mSubject;
        message.mText = mBody;
        message.mAccountKey = account.mId;
        // here just used account setting simply
        message.mDisplayName = account.getSenderName();
        message.mFlagRead = true;
        message.mFlagLoaded = Message.FLAG_LOADED_COMPLETE;

    }

    private void log(String msg) {
        if (enableLog) {
            Log.i(tag, msg);
        }
    }

    /**
     * Really send message.
     * 
     * @param account
     *            sending account
     * @param messageId
     *            message id
     */
    public void sendMessage(Account account, long messageId) {
        // message uri
        Uri uri = ContentUris.withAppendedId(EmailContent.Message.CONTENT_URI,
                messageId);
        try {
            // get a sender, ex. smtp sender.
            Sender sender = Sender.getInstance(mContext, account
                    .getSenderUri(mContext));
            // sending started
            mListener.onStarted(account.mId, messageId);
            // sending
            sender.sendMessage(messageId);
            // send completed
            mListener.onCompleted(account.mId);

        } catch (MessagingException me) {
            // report error
            mListener.onFailed(account.mId, messageId, me);
        } finally {
            try {
                // delete this message whenever send successfully or not
                mContext.getContentResolver().delete(uri, null, null);
            } catch (Exception ex) {
                Log.w(tag, "delete message occur exception message uri:" + uri);
            }
        }
    }

    public void onCompleted(long accountId) {
        log("send mail ok");
        // return Activity.RESULT_OK when send successfully
        setResult(RESULT_OK);
        finish();
    }

    public void onFailed(long accountId, long messageId, Exception ex) {
        log("send mail failed : " + ex.toString());
        finish();
    }

    public void onStarted(long messageId, long accountId) {
        log("send mail started");
    }

    /**
     * Send message task, it is an async task
     * 
     * @author melord_li
     * 
     */
    private class SendTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            // get default account, if not set, first record is treated as
            // default.
            // long id = Account.getDefaultAccountId(mContext);
            long id = mAccountId;
            if (id < 0) {
                id = Account.getDefaultAccountId(mContext);
            }
            if (id < 0) {
                Log.w(tag, "no account exists");
                finish();
                return null;
            }
            // get full account message
            Account account = Account.restoreAccountWithId(mContext, id);

            // A empty message
            Message message = new Message();
            // fill message field
            updateMessage(message, account);

            // Save this message. Because send API will read message in message
            // db.
            Uri uri = message.save(mContext);
            if (uri == null) {
                Log.e(tag, "save message occured an error");
                finish();
                return null;
            }

            // send
            sendMessage(account, message.mId);
            return null;
        }
    }
}

/**
 * Sending monitor
 * 
 * @author melord
 * 
 */
interface SendListener {

    /**
     * Send failed.
     * 
     * @param accountId
     *            account id
     * @param messageId
     *            message id
     * @param ex
     *            exception
     */
    void onFailed(long accountId, long messageId, Exception ex);

    /**
     * Send begin.
     * 
     * @param accountId
     *            account id
     * @param messageId
     *            message id
     */
    void onStarted(long messageId, long accountId);

    /**
     * Send completed.
     * 
     * @param accountId
     *            account id
     */
    void onCompleted(long accountId);
}
配置
Xml代码 复制代码 收藏代码
  1. <activityandroid:name=".activity.EmailSendAutoActivity"android:theme="@android:style/Theme.Translucent">
  2. <intent-filter>
  3. <actionandroid:name="com.android.email.intent.action.sendInBack"/>
  4. <dataandroid:mimeType="*/*"/>
  5. <categoryandroid:name="android.intent.category.DEFAULT"/>
  6. </intent-filter>
  7. </activity>
        <activity android:name=".activity.EmailSendAutoActivity" android:theme="@android:style/Theme.Translucent">
            <intent-filter>
                <action android:name="com.android.email.intent.action.sendInBack"/>
                <data android:mimeType="*/*" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
使用
Java代码 复制代码 收藏代码
  1. Intentintent=newIntent("com.android.email.intent.action.sendInBack");
  2. String[]reciver=newString[]{"yourname@corp.com"};
  3. Stringsubject="emailtitle";
  4. Stringbody="emailbody";
  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. startActivityForResult(Intent.createChooser(intent,"send"),0x02);
		Intent intent = new Intent("com.android.email.intent.action.sendInBack");
		String[] reciver = new String[] { "yourname@corp.com" };
		String subject = "email title";
		String body = "email body";
		intent.putExtra(android.content.Intent.EXTRA_EMAIL, reciver[0]);
		intent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
		intent.putExtra(android.content.Intent.EXTRA_TEXT, body);

		startActivityForResult(Intent.createChooser(intent, "send"), 0x02);
处理回调

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值