`

Android中我为什么发不了邮件--Android邮件发送详解

阅读更多

       版权所有@飞雪无情,转载请著名出处:http://flysnow.iteye.com/blog/1128354

 

 

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

 

在这里你可以学到:

 

  1. 什么是Intent和Intent Fileter
  2. 如何发送Email
  3. 如何发送特定的标题和内容的Emil
  4. 如何发送给多人
  5. 如何抄送和密送
  6. 如何发送附件

一:什么是Intent和Intent Fileter

关于这个详细介绍请参考 :

Android系列教程之十:Intents and Intent Filters(一)

Android系列教程之十一:Intents and Intent Filters(二) 

Android系列教程之十二:Intents and Intent Filters(三) 

二:如何发送Email

          通过上面就会知道Android应用之间的通信是通过Intent这个东西,如果手机中有实现了你想要功能的应用那么你就不用麻烦去实现一个拉。直接使用就可以,比如这里的发送邮件。

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

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<Button
	android:id="@+id/send_btn"  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Send Action"
    />
</LinearLayout>

 

 /** 发送邮件测试界面
 * @author 飞雪无情 个人博客:http://flysnow.iteye.com/
 * @since 2011-7-19
 */
public class SendEmailActivity extends Activity implements View.OnClickListener{
	private Button mSendBtn;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mSendBtn=(Button)findViewById(R.id.send_btn);
        mSendBtn.setOnClickListener(this);
    }
	@Override
	public void onClick(View v) {
		switch(v.getId()){
		case R.id.send_btn:
			startSendEmailIntent();
			break;
		}
	}
	private void startSendEmailIntent(){
		Intent data=new Intent(Intent.ACTION_SENDTO);
		data.setData(Uri.parse("mailto:qq10000@qq.com"));
		data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");
		data.putExtra(Intent.EXTRA_TEXT, "这是内容");
		startActivity(data);
	}
}

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

 



三:分析发送代码 

主要的发送代码如下:

 

Intent data=new Intent(Intent.ACTION_SENDTO);
data.setData(Uri.parse("mailto:qq10000@qq.com"));
data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");
data.putExtra(Intent.EXTRA_TEXT, "这是内容");
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地址,如果数组中有多个地址,就可以发送给多人。发送的函数修改如下,我们看下效果:

 

private void startSendEmailIntent(){
		Intent data=new Intent(Intent.ACTION_SENDTO);
		data.setData(Uri.parse("mailto:qq10000@qq.com"));
		data.putExtra(Intent.EXTRA_EMAIL, new String[]{"ls8707@163.com","ls8708@163.com"});
		data.putExtra(Intent.EXTRA_CC, new String[]{"ls8709@163.com"});
		data.putExtra(Intent.EXTRA_BCC, new String[]{"ls810@163.com"});
		data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");
		data.putExtra(Intent.EXTRA_TEXT, "这是内容");
		startActivity(data);
	}


五,发送附件

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

 

<Button
	android:id="@+id/send_to_btn"  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="SendTo Action"/>
 
 /* * 发送邮件测试界面
 * @author 飞雪无情 个人博客:http://flysnow.iteye.com/
 * @since 2011-7-19
 */
public class SendEmailActivity extends Activity implements View.OnClickListener{
	private Button mSendBtn;
	private Button mSendToBtn;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mSendBtn=(Button)findViewById(R.id.send_btn);
        mSendToBtn=(Button)findViewById(R.id.send_to_btn);
        mSendBtn.setOnClickListener(this);
        mSendToBtn.setOnClickListener(this);
    }
	@Override
	public void onClick(View v) {
		switch(v.getId()){
		case R.id.send_btn:
			startSendEmailIntent();
			break;
		case R.id.send_to_btn:
			startSendToEmailIntent();
			break;
		}
	}
	private void startSendEmailIntent(){
		Intent data=new Intent(Intent.ACTION_SENDTO);
		data.setData(Uri.parse("mailto:qq10000@qq.com"));
		data.putExtra(Intent.EXTRA_EMAIL, new String[]{"ls8707@163.com","ls8708@163.com"});
		data.putExtra(Intent.EXTRA_CC, new String[]{"ls8709@163.com"});
		data.putExtra(Intent.EXTRA_BCC, new String[]{"ls810@163.com"});
		data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");
		data.putExtra(Intent.EXTRA_TEXT, "这是内容");
		startActivity(data);
	}
	private void startSendToEmailIntent(){
		Intent data=new Intent(Intent.ACTION_SEND);
		data.putExtra(Intent.EXTRA_EMAIL, new String[]{"ls8707@163.com"});
		data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");
		data.putExtra(Intent.EXTRA_TEXT, "这是内容");
		data.putExtra(Intent.EXTRA_STREAM, Uri.parse(""));
		data.setType("text/plain");
		startActivity(data);
	}
}

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


 

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

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

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

 

 

<activity
            android:name=".activity.MessageCompose"
            android:label="@string/app_name"
            android:enabled="false"
            >
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.SENDTO" />
                <data android:scheme="mailto" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
            </intent-filter>
            <intent-filter android:label="@string/app_name">
                <action android:name="android.intent.action.SEND" />
                <data android:mimeType="text/plain" />
                <data android:mimeType="image/*" />
                <data android:mimeType="video/*" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </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地址,抄送,标题,附件等信息的源代码分析.
void initFromIntent(Intent intent) {
        
        //提取接受人地址列表
        String[] extraStrings = intent.getStringArrayExtra(Intent.EXTRA_EMAIL);
        if (extraStrings != null) {
            addAddresses(mToView, extraStrings);
        }
//提取抄送人地址列表
        extraStrings = intent.getStringArrayExtra(Intent.EXTRA_CC);
        if (extraStrings != null) {
            addAddresses(mCcView, extraStrings);
        }
//提取密送人地址列表
        extraStrings = intent.getStringArrayExtra(Intent.EXTRA_BCC);
        if (extraStrings != null) {
            addAddresses(mBccView, extraStrings);
        }
//提取标题
        String extraString = intent.getStringExtra(Intent.EXTRA_SUBJECT);
        if (extraString != null) {
            mSubjectView.setText(extraString);
        }

        //提取Uri中的接受人地址
        final Uri dataUri = intent.getData();
        if (dataUri != null) {
            if ("mailto".equals(dataUri.getScheme())) {
                initializeFromMailTo(dataUri.toString());
            } else {
                String toText = dataUri.getSchemeSpecificPart();
                if (toText != null) {
                    addAddresses(mToView, toText.split(","));
                }
            }
        }

       //提取邮件内容
        
        CharSequence text = intent.getCharSequenceExtra(Intent.EXTRA_TEXT);
        if (text != null) {
            mMessageContentView.setText(text);
        }
        
      //提取附件,可以看出Action必须是SEND.EXTRA_STREAM中有数据
     //type不能为null,这样才能提取倒附件.
        
        if (Intent.ACTION_SEND.equals(intent.getAction()) && intent.hasExtra(Intent.EXTRA_STREAM)) {
            String type = intent.getType();
            Uri stream = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
            if (stream != null && type != null) {
                if (MimeUtility.mimeTypeMatches(type, Email.ACCEPTABLE_ATTACHMENT_SEND_TYPES)) {
                    addAttachment(stream);
                }
            }
        }
        
        // Finally - expose fields that were filled in but are normally hidden, and set focus
        
        if (mCcView.length() > 0) {
            mCcView.setVisibility(View.VISIBLE);
        }
        if (mBccView.length() > 0) {
            mBccView.setVisibility(View.VISIBLE);
        }
        setNewMessageFocus();
        mDraftNeedsSaving = false;
    }
 
  • 大小: 53 KB
  • 大小: 27.8 KB
  • 大小: 40.5 KB
  • 大小: 32.5 KB
11
0
分享到:
评论
3 楼 diyangxia 2014-05-09  
错了,应该是即使加了mailto uri也会弹出很多发信息的应用
2 楼 diyangxia 2014-05-09  
ActionSEND如果不加mailto的话,那会直接弹出所有可以发送的客户端,而不是仅仅邮件
1 楼 cyy2yjp 2013-04-27  
报错啊! 说找不到 这个Activity   我用你的代码运行了也一样

相关推荐

    Android邮件发送详解源代码

    首先,我们需要了解Android邮件发送的基本原理。Android系统提供了JavaMail API的封装,我们可以通过Intent服务来调用系统内置的邮件客户端完成邮件的发送。这个过程主要包括以下几个步骤: 1. 创建邮件内容:邮件...

    发邮件Demo_Android

    "发邮件Demo_Android"是一个针对这一需求的示例项目,它演示了如何在不依赖其他第三方应用或系统自带邮件应用的前提下,通过后台服务完成邮件发送。 首先,我们来理解Android中的服务(Service)。Service是Android...

    Android发送邮件的方法实例详解

    在android手机中实现发送邮件的功能也是不可缺少的。如何实现它呢?下面以简单的例子进行说明。 程序如下: import java.util.regex.Matcher; import java.util.regex.Pattern; import android.app.Activity; ...

    ZX-Android-Intent详解

    ### ZX-Android-Intent详解 #### 一、Intent的基本概念及作用 在Android开发中,`Intent`扮演着至关重要的角色。它是一个用于描述要执行的动作的抽象对象,主要用于协助完成Android应用程序内部不同组件间的通信。...

    基于Android的邮件客户端系统

    【Android邮件客户端系统详解】 在移动设备上,一个基于Android的邮件客户端系统是用户与电子邮件交互的重要工具。这种系统允许用户方便地收发邮件,管理邮箱,并与其他应用程序集成,提高工作效率。本文将深入探讨...

    android-mail.jar

    《Android邮件发送技术详解——基于android-mail.jar》 在Android应用开发中,有时我们需要实现邮件发送功能,例如向用户发送验证码、更新通知等。要实现这个功能,开发者通常需要引入相应的库支持。本文将深入探讨...

    Android用JavaMail发送邮件

    为了克服这一限制,可以采用JavaMail库直接将邮件发送至指定邮箱,而无需依赖用户的邮件客户端。 #### JavaMail简介 JavaMail是一个强大的Java库,它提供了用于发送和接收电子邮件的标准接口。JavaMail构建在...

    完整邮件客户端

    由于文件名列表中只给出了“Android”,我们可以推测此邮件客户端是为Android平台设计的。在Android开发中,有以下几点值得注意: 1. 权限管理:为了访问网络和发送邮件,项目需要在AndroidManifest.xml中声明...

    Android开发应用实战详解源代码

    6.7 来电邮件通知 6.8 内存和存储卡 6.9 实现定时闹钟 6.10 黑名单 6.11 桌面背景图片轮换 6.12 监听发送短信状态 6.13 修改默认开机显示 6.14 小结 第7章 娱乐和多媒体应用 7.1 获取图片的宽和高 7.1.1 实现原理 ...

    Android 邮件客户端通过 IMAP 设置企业邮箱

    - 如有需要,可以修改“您的姓名”字段,以更改邮件发送时显示的发件人名称。 **步骤9:完成设置** - 完成以上步骤后,即可开始使用263企业邮箱在Android设备上收发邮件。 **步骤10:邮件大小设置** - 如果遇到...

    Android代码-Attendee-Android

    《构建基于Firebase的Android会议应用——Attendee-Android详解》 在移动开发领域,Android以其开源、灵活性和广泛的设备支持,成为了许多开发者首选的平台。而Firebase,作为Google提供的一个全面的后端开发平台,...

    android邮箱客户端K9可运行版

    3. **邮件过滤与规则**:用户可以设置过滤规则,根据发件人、主题或关键词自动处理邮件,如归档、删除或标记为已读。 4. **签名与模板**:K9支持自定义邮件签名,还可以创建预设的邮件模板,提高回复效率。 5. **...

    Android_Intent详解

    6. **Extras**:用于传递附加信息,例如在发送电子邮件时,可以将邮件的主题、正文等内容存储在Extras中。 #### 三、Intent的解析与匹配 应用程序组件可以通过声明一个或多个**IntentFilter**来告诉Android它们...

    Android核心技术与实例详解.pdf

    ### Android核心技术与实例详解 #### 一、Android概述 Android 是一个基于 Linux 内核的开源移动操作系统,由 Google 公司领导开发。它不仅包括操作系统本身,还包含了一个核心的应用程序框架,允许开发者利用其...

    Android网络开发技术实战详解

    总之,Android网络开发涵盖了多种技术,包括HTML5网页制作、HTTP通信、URL处理、邮件发送和RSS订阅等。理解并熟练掌握这些知识点,对于开发功能丰富的Android应用程序至关重要。开发者不仅需要理解网络通信的基本...

    黑马程序员Android入学考试题目(附详解)

    【Android入学考试知识点详解】 Android是Google开发的一款开源操作系统,广泛应用于智能手机、平板电脑和智能电视等设备。作为Android开发者,掌握基础知识至关重要。本篇将根据"黑马程序员Android入学考试"的题目...

Global site tag (gtag.js) - Google Analytics