Android开发中怎样android 调用系统邮件Email发送邮件

4975人阅读
ASCE1885的Android学习研究(88)
Android应用开发中,很多情况下免不了要调用手机上的邮件类应用,实现邮件发送的功能,这一般是通过调用系统已有的Intent来实现的。看到网上很多邮件发送都是调用action为android.content.Intent.ACTION_SEND的Intent来实现的,下面我们就来看下这种方式实现的效果如何。
【使用Intent.ACTION_SEND方式】
具体的UI搭建我就不说了,很easy,直接看下发送的核心代码就行:
String[] email = {&3802**&}; // 需要注意,email必须以数组形式传入
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType(&message/rfc822&); // 设置邮件格式
intent.putExtra(Intent.EXTRA_EMAIL, email); // 接收人
intent.putExtra(Intent.EXTRA_CC, email); // 抄送人
intent.putExtra(Intent.EXTRA_SUBJECT, &这是邮件的主题部分&); // 主题
intent.putExtra(Intent.EXTRA_TEXT, &这是邮件的正文部分&); // 正文
startActivity(Intent.createChooser(intent, &请选择邮件类应用&));
上面代码的效果如下图所示,将会拉起不止邮件类应用,这是很坑爹的事情,用户体验相当差。
从上面结果可以看出,ACTION_SEND不是首选的方案,更好的方案是能够过滤非邮件类应用,只识别邮件类应用。这可以通过使用另外一个action来实现的。
【使用Intent.ACTION_SENDTO方式】
核心代码如下:
// 必须明确使用mailto前缀来修饰邮件地址,如果使用
// intent.putExtra(Intent.EXTRA_EMAIL, email),结果将匹配不到任何应用
Uri uri = Uri.parse(&mailto:3802**&);
String[] email = {&3802**&};
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
intent.putExtra(Intent.EXTRA_CC, email); // 抄送人
intent.putExtra(Intent.EXTRA_SUBJECT, &这是邮件的主题部分&); // 主题
intent.putExtra(Intent.EXTRA_TEXT, &这是邮件的正文部分&); // 正文
startActivity(Intent.createChooser(intent, &请选择邮件类应用&));
效果图如下所示:
当手机上只有一个匹配的邮件类应用时,系统将不会弹出ChooserActivity,供用户从候选的应用中挑选一个,而是直接跳转到匹配的那个应用去。这时查看Eclipse的logcat可以发现,出现如下异常信息:
但是,当系统中存在多于一个的匹配应用时,会弹出ChooserActivity,让用户选择一个应用发送邮件,这时查看logcat不会出现之前的异常。这又是为何呢?
【ChooserActivity的bug】
从异常信息中可以看出,代码在某个地方注册了IntentReceiver,但却没有代码去解除注册。具体原因是Android源码的一个bug,但不影响正常功能,因此可忽略之。想知道详细原因的可以自己查看Android源码。下图是stackoverflow上面的解答,可参考之。
Demo源码地址: http://download.csdn.net/detail/ace&
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:607459次
积分:9239
积分:9239
排名:第1089名
原创:245篇
译文:34篇
评论:208条
阅读:6067
文章:11篇
阅读:36367
阅读:2146
(1)(1)(5)(15)(12)(2)(4)(5)(1)(3)(1)(8)(2)(1)(1)(1)(1)(4)(9)(2)(1)(2)(15)(2)(6)(1)(4)(6)(12)(31)(58)(24)(28)(10)Android 使用 Gmail 来发送邮件
作者:智能小宝
来源:互联网
Android 使用 Gmail 来发送邮件[代码] SendMail.java01package org.apache.android.0203import android.app.A04import android.os.B05import android.util.L06import android.view.V07import android.widget.B08import android.widget.EditT0910public class SendMail extends Activity {11/**12* Called with the activity is first created.13*/14@Override15public void onCreate(Bundle icicle) {16super.onCreate(icicle);17setContentView(R.layout.main);18final Button send = (Button) this.findViewById(R.id.send);19final EditText userid = (EditText)this.findViewById(R.id.userid);20final EditText password = (EditText)this.findViewById(R.id.password);21final EditText from = (EditText)this.findViewById(R.id.from);22final EditText to = (EditText) this.findViewById(R.id.to);23final EditText subject = (EditText)this.findViewById(R.id.subject);24final EditText body = (EditText)this.findViewById(R.id.body);25send.setOnClickListener(new View.OnClickListener() {26public void onClick(View view) {27GMailSender sender = newGMailSender(userid.getText().toString(),28password.getText().toString());29try {30sender.sendMail(subject.getText().toString(),31body.getText().toString(),32from.getText().toString(),33to.getText().toString());34} catch (Exception e) {35Log.e(&SendMail&, e.getMessage(), e);36}37}38});39}40}
本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-!
日本创业公司将开发昆虫型月球探测机器人
谷歌要求为自动驾驶汽车制定新交规
智人时代:人类智能将与机器智能平分秋色
费马大定理证明者获阿贝尔奖Android 调用系统email程序发邮件_中华文本库
第1页/共1页
.t(e nnNCnDneIocOI;dtnnmendT.I e_=)anASel.nEoitienttwtIttNra
(ixe.)epnp"Te/mls"i
,cqi]@ceclj@rgaeie91ooiz.o =mg{Sy"n = v4 n你"mrcinwt条uybqn}eh1 mua1lag"2;短有g信26m4SRlei"."23 一" o3[m
dyasbnS=i)o.(tirBgltem
置邮件认默/设/地址
avxpAnennt.tt.riARTEnirIaIcLeRr(eXm,lidtu taoaeeEiM.l).Etd_
件设标置题//认默邮
pcTEaXiadm.ranTeu nCttber.n.ItEnEeo(ixoAJ)BecSu_t;StmltUdRlan.,itej
发要容置认内/的设默/送
nat_ITdEmintiaX.oTlATaarnm.xE..t cidne,tp(oEXenBudt)eRtero
/系统/邮用件的系调统
e;t请.e(t)avchy"tt送邮e,t(ia择ionri)aesenItsml选件c件rC"tro软A发
=tDO .rE nentICnwtIIerITIn tunSNtt n)nte(nNAe_
[ms{"gc/n@nge" /io }]ma
mggortieoe .=Sosetomt sda
si[c s"ee"ong
om{nermS ;yo@bp gt nytto=o rC/cmioc lo]un. a C/}ga
r orXI(E..t_Inn)ptEatxAtARntesMT,;EertuIutL
tIttuRrtsTratt c_eenE.pCXC(rIA),cEnu.
.pa E).eT;TIuE,trt(EtXA"rntyottTXdI"unR_nerxb
tTnIrRtXAxCetucBUTaEbe"eEt_StrJ"nnr)p..tsuEuI,(
o(ra"mUrgi.ur3;aim risy )U="c.p/s rse/ldpfen:d/i/
;R,.trM_nutIuetSTxnIrXa(rrETtt npt.EAREe)iAu
eypma3rpy mmr
uo"tieyTo rttpr82eostc8) mt"dtaeue )Iors( stnet.taeyhi .we/I tuasuar"/ (csfifhs/ntn "n aatetT;t/gte
saoeoEm)r e.t; Inhrtonsht"nr "rieCIet,i(etutoaneeCCcll
cIatvAi;nirr)tuystrt(tte
第1页/共1页
寻找更多 ""Android平台邮件自动发送功能实现 - 疯狂程序员|Crazy Coder - ITeye技术网站
博客分类:
Android 自动发送邮件
本文简述的是在Android平台如何自动发送邮件(没有邮件编写界面),主要应用场景为忘记密码等安全等级较高的操作,比如我忘记密码了,点击“发送密码到我的邮箱”系统会将密码发送到注册时的电子邮件地址。
Android平台邮件客户端
Gmail: Gmai电子邮件客户端
Email: 通用的电子邮件客户端
Gmail已经支持自动发送了,所以非常简单。在使用时,需要添加
&uses-permission android:name="com.google.android.gm.permission.AUTO_SEND" /& 到AndroidManifest.xml
示例代码如下:
Intent intent = new Intent("com.google.android.gm.action.AUTO_SEND");
intent.setType("plain/text");
String[] reciver = new String[] { "" };
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不支持自动发送,但又是默认邮件客户端,所以需要添加自动发送功能。主要实现步骤为:
编写一个自动发送邮件类
主要功能为:接收用户输入,组装message对象,获取Sender实例,将message发送出去,最后删除message对象(这样已发送的邮件内容不会出现在client中,提高发安全性)
package com.android.email.
import android.app.A
import android.app.ProgressD
import android.content.ContentU
import android.content.C
import android.content.I
import android.os.AsyncT
import android.os.B
import android.text.TextU
import android.util.L
import android.view.V
import android.view.W
import android.net.U
import android.widget.T
import com.android.emailcommon.provider.EmailC
import com.android.emailcommon.provider.EmailContent.A
import com.android.emailcommon.provider.EmailContent.M
import com.android.emailcommon.mail.MessagingE
import com.android.emailcommon.mail.A
import com.android.emailcommon.utility.U
import com.android.emailcommon.mail.AuthenticationFailedE
import com.android.email.EmailAddressV
import com.android.email.mail.S
* Send email in background with account configured in Email application.
* Sending message will not saved as draft or in out-going box. Usage:
* Intent intent = new Intent(&com.android.email.intent.action.sendInBack&);
* String[] reciver = new String[] { &your_& };
* 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);
* Now, attachment and multi-receiver function is unsupported.
* @author melord
public class EmailSendAutoActivity extends Activity implements SendListener {
private static String tag = "EmailSendAutoAcitivity";
private Context mC
private String mTo;
private String mCc;
private String mB
private String mS
private String mB
private EmailAddressValidator mValidator = new EmailAddressValidator();
private SendListener mL
private Toast mW
private boolean enableLog =
* Sending account email address.
private String mSendE
* Sending account id
private long mAccountId = -1;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.mContext =
requestWindowFeature(Window.FEATURE_NO_TITLE);
mListener =
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,
mWaiting = Toast.makeText(this, msg, Toast.LENGTH_LONG);
mWaiting.show();
public void onBackPressed() {
if (mWaiting != null) {
mWaiting.cancel();
super.onBackPressed();
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 =
Long[] ids = EmailContent.Account.getAllAccountIds(this);
if (ids != null && ids.length & 0) {
for (int i = 0; i & ids. i++) {
EmailContent.Account temp = EmailContent.Account
.restoreAccountWithId(this, ids[i]);
if (temp != null && email.equals(temp.getEmailAddress())) {
log("valid account");
mAccountId = ids[i];
* Initialize message from intent.
* @param 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 =
if (!TextUtils.isEmpty(address)) {
Address[] addresses = Address.parse(address.trim());
addr = Address.pack(addresses);
* 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 = mB
message.mSubject = mS
message.mText = mB
message.mAccountKey = account.mId;
// here just used account setting simply
message.mDisplayName = account.getSenderName();
message.mFlagRead =
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);
// 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 {
// 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);
public void onFailed(long accountId, long messageId, Exception ex) {
log("send mail failed : " + ex.toString());
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& {
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");
// 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
Uri uri = message.save(mContext);
if (uri == null) {
Log.e(tag, "save message occured an error");
sendMessage(account, message.mId);
* Sending monitor
* @author melord
interface SendListener {
* Send failed.
* @param accountId
account id
* @param messageId
message id
* @param ex
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);
&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&
Intent intent = new Intent("com.android.email.intent.action.sendInBack");
String[] reciver = new String[] { "" };
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。
chin1361 写道melord 写道chin1361 写道楼主,我用了第一种方法和1楼一样的结果。 想问下调用这个com.google.android.gm.permission.AUTO_SEND权限有没有什么条件?比如版本,需要导入包等。
版本为3.0及其以上. 需要装Gmail.apk.
我换成4.0.3版本,且gmail为4.1.2了还是没成功。这个自定义的权限类在什么位置?是不是我还没下载下来,android——sdk中很多资料无法下载。
如果这样子的话,你反编译一下GMail.apk吧,在AndroidManifest.xml中。
能把你的联系方式给下么QQ或MSN,我把我的代码发给你。能帮我看看么?
gmail apk反编译出来的文件为空。但有在里面有看到autosendactivity.clss这个文件。
melord 写道chin1361 写道楼主,我用了第一种方法和1楼一样的结果。 想问下调用这个com.google.android.gm.permission.AUTO_SEND权限有没有什么条件?比如版本,需要导入包等。版本为3.0及其以上. 需要装Gmail.apk.我换成4.0.3版本,且gmail为4.1.2了还是没成功。这个自定义的权限类在什么位置?是不是我还没下载下来,android——sdk中很多资料无法下载。如果这样子的话,你反编译一下GMail.apk吧,在AndroidManifest.xml中。
chin1361 写道楼主,我用了第一种方法和1楼一样的结果。 想问下调用这个com.google.android.gm.permission.AUTO_SEND权限有没有什么条件?比如版本,需要导入包等。
版本为3.0及其以上. 需要装Gmail.apk.
我换成4.0.3版本,且gmail为4.1.2了还是没成功。这个自定义的权限类在什么位置?是不是我还没下载下来,android——sdk中很多资料无法下载。
楼主,我用了第一种方法和1楼一样的结果。 想问下调用这个com.google.android.gm.permission.AUTO_SEND权限有没有什么条件?比如版本,需要导入包等。版本为3.0及其以上. 需要装Gmail.apk.
楼主,我试了第一种方法,怎么不行啊,在模拟器上和真机上都不行真机上报05-10 09:06:38.880: ERROR/AndroidRuntime(2972): java.lang.SecurityException: Permission Denial: starting Intent { act=com.google.android.gm.action.AUTO_SEND typ=plain/text cmp=com.google.android.gm/.AutoSendActivity (has extras) } from ProcessRecord{47a829b0 2972:com.eagleguard.www.activity/10136} (pid=2972, uid=10136) requires com.google.android.gm.permission.AUTO_SEND很明显,权限并没有加上去,你试着重新编译一下整个工程吧.
浏览: 81967 次
来自: 南京
不错。。eclipse 4 都能运行。。 官网反而成功安装后没 ...
不错,可以使用
melord 写道loogson 写道麻烦问一下,你的Cone ...
loogson 写道麻烦问一下,你的Cone类测试了没有,我使 ...
麻烦问一下,你的Cone类测试了没有,我使用你的Cone测试不 ...5596人阅读
Android(7)
//系统邮件系统的动作为android.content.Intent.ACTION_SENDIntent email = new Intent(android.content.Intent.ACTION_SEND);email.setType("plain/text");emailReciver = new String[]{"", ""};emailSubject = "你有一条短信";emailBody = sb.toString();//设置邮件默认地址email.putExtra(android.content.Intent.EXTRA_EMAIL, emailReciver);//设置邮件默认标题email.putExtra(android.content.Intent.EXTRA_SUBJECT, emailSubject);//设置要默认发送的内容email.putExtra(android.content.Intent.EXTRA_TEXT, emailBody);//调用系统的邮件系统startActivity(Intent.createChooser(email, "请选择邮件发送软件"));
Intent returnIt = new Intent(Intent.ACTION_SEND);
&&&&&&&String[] tos = { "" }; //send to someone
&&&&&&&String[] ccs = { "" }; &//Carbon Copy to someone
&&&&&&&returnIt.putExtra(Intent.EXTRA_EMAIL, tos);
&&&&&&&returnIt.putExtra(Intent.EXTRA_CC, ccs);
&&&&&&&returnIt.putExtra(Intent.EXTRA_TEXT, "body");
&&&&&&&returnIt.putExtra(Intent.EXTRA_SUBJECT, "subject");
Uri uri = Uri.parse("file:///sdcard/mysong.mp3");
returnIt.putExtra(Intent.EXTRA_STREAM, uri);
returnIt.setType("audio/mp3"); &//use this format no matter what your attachment type is&
returnIt.setType("message/rfc882");
Intent.createChooser(returnIt, "Choose Email Client");
startActivity(returnIt);
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:107930次
积分:1017
积分:1017
排名:千里之外
原创:17篇
评论:23条
(1)(1)(3)(8)(11)}

我要回帖

更多关于 java email 发送邮件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信