Android邮件发送详解

转载:http://flysnow.iteye.com/blog/1128354

Android中我为什么发不了邮件???我手机里明明有邮件客户端的,可我为什么不能调用它发送邮件???相信这是很多人会问的问题,手机里有Email客户端,可是偏偏在自己的应用里调用不了,抑或是不知道怎么调用,还有的是一直认为自己写对了,可是偏偏不能调用,无奈之下只能却网上找段代码粘贴上,ok,可以了。。可是你知道别人的代码为什么可以?你知道调用Email是怎么工作的吗?如果你又像给多人发邮件,还想发送附件,怎么做?又迷糊了吧?所以需要搞懂原理才能一通百通,举一反三,而这就是这篇博文要写的,也是你可以在这篇博文中学到的。

我们新建一个工程SendEmail,基于Android1.6实现。然后定义布局文件和代码如下:

Xml代码:

[html] view plaincopy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <Button
  8. android:id="@+id/send_btn"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:text="Send Action"
  12. />
  13. </LinearLayout>

Java代码:

[java] view plaincopy

  1. /** 发送邮件测试界面
  2. * */
  3. public class SendEmailActivity extends Activity implements View.OnClickListener{
  4. private Button mSendBtn;
  5. /** Called when the activity is first created. */
  6. @Override
  7. public void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.main);
  10. mSendBtn=(Button)findViewById(R.id.send_btn);
  11. mSendBtn.setOnClickListener(this);
  12. }
  13. @Override
  14. public void onClick(View v) {
  15. switch(v.getId()){
  16. case R.id.send_btn:
  17. startSendEmailIntent();
  18. break;
  19. }
  20. }
  21. private void startSendEmailIntent(){
  22. Intent data=new Intent(Intent.ACTION_SENDTO);
  23. data.setData(Uri.parse("mailto:[email protected]"));
  24. data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");
  25. data.putExtra(Intent.EXTRA_TEXT, "这是内容");
  26. startActivity(data);
  27. }
  28. }

这是我们运行应用,点击按钮就会看到如下效果:


分析发送代码 

主要的发送代码如下:

[java] view plaincopy

  1. Intent data=new Intent(Intent.ACTION_SENDTO);
  2. data.setData(Uri.parse("mailto:[email protected]"));
  3. data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");
  4. data.putExtra(Intent.EXTRA_TEXT, "这是内容");
  5. startActivity(data);
  1. 首先构造一个Action为SENDTO的Action
  2. 其次创建一个Uri,他是一个mailto的邮件链接,也就是接收地址.
  3. 再通过Intent.EXTRA_SUBJECT和Intent.EXTRA_TEXT传递标题和文本的数据,记住,一定要使用这些常量,这是标准,否则Email客户端不认识,那样你传递的标题和文本就不起作用了。
  4. 然后就是startActivity进行打开,系统会根据Intent自动匹配找到能处理这个intent的应用,如图列表,有很多个,我们这里选择网易掌上邮,就打开了一个邮件发送界面,如我们所愿,邮件地址、标题和内容都在了,很成功.
  5. intent中的数据传递是以Extra的方式进行put后传递的,然后在使用的时候getter取出使用。

发送给多人以及抄送和密送

发送给多人以及抄送和密送都很简单,查找Intent类中的Extra常量,发送有这么三个常量:Intent.EXTRA_EMAIL,Intent.EXTRA_CC,Intent.EXTRA_BCC。这三个分别用于传递“接受人地址列表”、“抄送人地址列表”和“密送人地址列表”,传递的都是String[]类型的Email地址,如果数组中有多个地址,就可以发送给多人。发送的函数修改如下,我们看下效果:

[java] view plaincopy

  1. private void startSendEmailIntent(){
  2. Intent data=new Intent(Intent.ACTION_SENDTO);
  3. data.setData(Uri.parse("mailto:[email protected]"));
  4. data.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]","[email protected]"});
  5. data.putExtra(Intent.EXTRA_CC, new String[]{"[email protected]"});
  6. data.putExtra(Intent.EXTRA_BCC, new String[]{"[email protected]"});
  7. data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");
  8. data.putExtra(Intent.EXTRA_TEXT, "这是内容");
  9. startActivity(data);
  10. }

发送附件

Email‘客户端的发送Activity提供了两个Intent Filter,一个用于发送普通邮件,一个用户发送带有附件的邮件。区分很很容易的,发送普通邮件的那个Intent Filter配置的Action SENDTO,而带有附件的邮件则是SEND,所以是2个不一样,但是哪些比如附加“标题”,“内容”,“抄送”,“发送多人”等等还是通用的。布局文件新增一个按钮,用于发送带有附件的邮件,Activity代码也做修改。

[html] view plaincopy

  1. <Button
  2. android:id="@+id/send_to_btn"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:text="SendTo Action"/>

[java] view plaincopy

  1. /* * 发送邮件测试界面
  2. * @author 飞雪无情 个人博客:http://flysnow.iteye.com/
  3. * @since 2011-7-19
  4. */
  5. public class SendEmailActivity extends Activity implements View.OnClickListener{
  6. private Button mSendBtn;
  7. private Button mSendToBtn;
  8. /** Called when the activity is first created. */
  9. @Override
  10. public void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.main);
  13. mSendBtn=(Button)findViewById(R.id.send_btn);
  14. mSendToBtn=(Button)findViewById(R.id.send_to_btn);
  15. mSendBtn.setOnClickListener(this);
  16. mSendToBtn.setOnClickListener(this);
  17. }
  18. @Override
  19. public void onClick(View v) {
  20. switch(v.getId()){
  21. case R.id.send_btn:
  22. startSendEmailIntent();
  23. break;
  24. case R.id.send_to_btn:
  25. startSendToEmailIntent();
  26. break;
  27. }
  28. }
  29. private void startSendEmailIntent(){
  30. Intent data=new Intent(Intent.ACTION_SENDTO);
  31. data.setData(Uri.parse("mailto:[email protected]"));
  32. data.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]","[email protected]"});
  33. data.putExtra(Intent.EXTRA_CC, new String[]{"[email protected]"});
  34. data.putExtra(Intent.EXTRA_BCC, new String[]{"[email protected]"});
  35. data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");
  36. data.putExtra(Intent.EXTRA_TEXT, "这是内容");
  37. startActivity(data);
  38. }
  39. private void startSendToEmailIntent(){
  40. Intent data=new Intent(Intent.ACTION_SEND);
  41. data.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
  42. data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");
  43. data.putExtra(Intent.EXTRA_TEXT, "这是内容");
  44. data.putExtra(Intent.EXTRA_STREAM, Uri.parse(""));
  45. data.setType("text/plain");
  46. startActivity(data);
  47. }
  48. }

运行应用,我们看到效果图里最小面的附件标识,说明已经可以发送附件了.

发送附件最重要的就是Action必须为SEND,type一定要设置setType(""),还要为Intent.EXTRA_STREAM赋值,类型为Uri,一个附件的Uri。这样才能发送附件。

客户端Email应用的发送Activity配置

这是Android1.6自带Email客户端的配置,如下:

[html] view plaincopy

  1. <activity
  2. android:name=".activity.MessageCompose"
  3. android:label="@string/app_name"
  4. android:enabled="false"
  5. >
  6. <intent-filter>
  7. <action android:name="android.intent.action.VIEW" />
  8. <action android:name="android.intent.action.SENDTO" />
  9. <data android:scheme="mailto" />
  10. <category android:name="android.intent.category.DEFAULT" />
  11. <category android:name="android.intent.category.BROWSABLE" />
  12. </intent-filter>
  13. <intent-filter android:label="@string/app_name">
  14. <action android:name="android.intent.action.SEND" />
  15. <data android:mimeType="text/plain" />
  16. <data android:mimeType="image/*" />
  17. <data android:mimeType="video/*" />
  18. <category android:name="android.intent.category.DEFAULT" />
  19. </intent-filter>
  20. </activity>

从以上代码总结:

  1. 一个Activity定义了2个Intent Filter用于发送不同类型邮件。
  2. SENDTO发送普通邮件,SEND可以发送普通和带有附件的,不过最好主要用于发送附件。
  3. 使用SENDTO时,必须为Intent设置Data,也就是Uri,内容为"mailto:emailaddr",否则不能匹配,因为有schema必须为mailto的限制
  4. 使用SEND时必须要设置type,也就是使用setType()方法,type只能为以前xml定义的4个。不过我测试了text/*也可以,其他的没测试.
  5. 发送附件只能使用SEND这个Action.

附加Email客户端中提取Email地址,抄送,标题,附件等信息的源代码分析.

[java] view plaincopy

  1. void initFromIntent(Intent intent) {
  2. //提取接受人地址列表
  3. String[] extraStrings = intent.getStringArrayExtra(Intent.EXTRA_EMAIL);
  4. if (extraStrings != null) {
  5. addAddresses(mToView, extraStrings);
  6. }
  7. //提取抄送人地址列表
  8. extraStrings = intent.getStringArrayExtra(Intent.EXTRA_CC);
  9. if (extraStrings != null) {
  10. addAddresses(mCcView, extraStrings);
  11. }
  12. //提取密送人地址列表
  13. extraStrings = intent.getStringArrayExtra(Intent.EXTRA_BCC);
  14. if (extraStrings != null) {
  15. addAddresses(mBccView, extraStrings);
  16. }
  17. //提取标题
  18. String extraString = intent.getStringExtra(Intent.EXTRA_SUBJECT);
  19. if (extraString != null) {
  20. mSubjectView.setText(extraString);
  21. }
  22. //提取Uri中的接受人地址
  23. final Uri dataUri = intent.getData();
  24. if (dataUri != null) {
  25. if ("mailto".equals(dataUri.getScheme())) {
  26. initializeFromMailTo(dataUri.toString());
  27. } else {
  28. String toText = dataUri.getSchemeSpecificPart();
  29. if (toText != null) {
  30. addAddresses(mToView, toText.split(","));
  31. }
  32. }
  33. }
  34. //提取邮件内容
  35. CharSequence text = intent.getCharSequenceExtra(Intent.EXTRA_TEXT);
  36. if (text != null) {
  37. mMessageContentView.setText(text);
  38. }
  39. //提取附件,可以看出Action必须是SEND.EXTRA_STREAM中有数据
  40. //type不能为null,这样才能提取倒附件.
  41. if (Intent.ACTION_SEND.equals(intent.getAction()) && intent.hasExtra(Intent.EXTRA_STREAM)) {
  42. String type = intent.getType();
  43. Uri stream = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
  44. if (stream != null && type != null) {
  45. if (MimeUtility.mimeTypeMatches(type, Email.ACCEPTABLE_ATTACHMENT_SEND_TYPES)) {
  46. addAttachment(stream);
  47. }
  48. }
  49. }
  50. // Finally - expose fields that were filled in but are normally hidden, and set focus
  51. if (mCcView.length() > 0) {
  52. mCcView.setVisibility(View.VISIBLE);
  53. }
  54. if (mBccView.length() > 0) {
  55. mBccView.setVisibility(View.VISIBLE);
  56. }
  57. setNewMessageFocus();
  58. mDraftNeedsSaving = false;
  59. }
时间: 2024-11-05 13:10:00

Android邮件发送详解的相关文章

Android WebView 开发详解

Android WebView 开发详解 1.概览: Android WebView 做为承载网页的载体控件,他在网页显示的过程中会产生一些事件,并回调给我们的应用程序,以便我们在网页加载过程中做应用程序想处理的事情.比如说客户端需要显示网页加载的进度.网页加载发生错误等等事件. WebView提供两个事件回调类给应用层,分别为WebViewClient,WebChromeClient开发者可以继承这两个类,接手相应事件处理.WebViewClient 主要提供网页加载各个阶段的通知,比如网页开

Android 四大组件 详解

[置顶] Android四大组件详解 分类: Android四大组件2013-02-09 16:23 19411人阅读 评论(13) 收藏 举报 Android开发 注:本文主要来自网易的一个博主的文章,经过阅读,总结,故留下文章在此 Android四大基本组件介绍与生命周期 Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity : 应用程序中,一个

Android中Context详解 ---- 你所不知道的Context

转载至 :http://blog.csdn.net/qinjuning 前言:本文是我读<Android内核剖析>第7章 后形成的读书笔记 ,在此向欲了解Android框架的书籍推荐此书. 大家好,  今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中 时刻的在与它打交道,例如:Service.BroadcastReceiver.Activity等都会利用到Context的相关方法 : 说它陌生,完全是 因为我们真正的不懂Context

Android相机开发详解(一)

Android相机开发详解(一) 请支持原创,尊重原创,转载请注明出处:http://blog.csdn.net/kangweijian(来自kangweijian的csdn博客) Android相机开发能够实现打开相机,前后摄像头切换,摄像预览,保存图片,浏览已拍照图片等相机功能. Android相机开发详解(一)主要实现打开相机,摄像预览,前后置摄像头切换,保存图片等四个功能. Android相机开发详解(二)主要实现翻页浏览相片,触控缩放浏览图片,删除图片,发送图片等四个功能. Andro

Android中Context详解 ---- 你所不知道的Context (转载)

Android中Context详解 ---- 你所不知道的Context (转载) http://blog.csdn.net/qinjuning 大家好,  今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中 时刻的在与它打交道,例如:Service.BroadcastReceiver.Activity等都会利用到Context的相关方法 : 说它陌生,完全是 因为我们真正的不懂Context的原理.类结构关系.一个简单的问题是,一个应用

U-Mail邮件服务器详解邮件延时

在快节奏的信息社会,我们要求邮件"又好又快"的传送,即保证高安全性之外,还需要及时传 输.但是由于国际互联网环境的复杂特殊性及企业邮件系统自身原因,邮件延迟送达的现象很常见,这往往给企业业务拓展带来不利影响,毕竟商机转瞬即逝,谁能 抢先一步抓住,谁就能独占鳌头守住财富.那么,邮件延迟是什么原因呢?有没有好的解决方案?据统计,目前对于这个问题针对措施做得最好的是U-Mail邮 件服务器,小编特意请来U-Mail何工程师详解一番. 问:邮件延时对于企业,尤其是外贸类公司来说,既常见,同时负

Android Service使用详解

Service是Android系统中的四大组件之一,主要有两个应用场景:后台运行和跨进程访问.Service可以在后台执行长时间运行操作而不提供用户界面,除非系统必须回收内存资源,否则系统不会停止或销毁服务.服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行. 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC) 需要注意的是,Service是在主线程里执行操作的,可能会因为执行耗时操作而导致ANR 一.基础知识 Service可以分为以下三种形式

Android中Context详解 ---- 你所不知道的Context(转)

Android中Context详解 ---- 你所不知道的Context(转)                                              本文出处 :http://blog.csdn.net/qinjuning 前言:本文是我读<Android内核剖析>第7章 后形成的读书笔记 ,在此向欲了解Android框架的书籍推荐此书. 大家好,  今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中 时刻的在与它打

Android Notification通知详解

Android Notification通知详解 Notification: (一).简介: 显示在手机状态栏的通知.Notification所代表的是一种具有全局效果的通知,程序一般通过NotificationManager服务来发送Notification. Android3.0增加了Notification.Builder类,该类可以轻松地创建Notification对象. (二).Notification.Builder类中提供的方法: builder.setAutoCancel();