`

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

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



在这里你可以学到:



什么是Intent和Intent Fileter
如何发送Email
如何发送特定的标题和内容的Emil
如何发送给多人
如何抄送和密送
如何发送附件
一:什么是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代码 
<?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> 

<?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>

Java代码 
/** 发送邮件测试界面 
* @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);  
    }  


/** 发送邮件测试界面
* @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);
}
}    这是我们运行应用,点击按钮就会看到如下效果:





三:分析发送代码
主要的发送代码如下:



Java代码 
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); 首先构造一个Action为SENDTO的Action
其次创建一个Uri,他是一个mailto的邮件链接,也就是接收地址.
再通过Intent.EXTRA_SUBJECT和Intent.EXTRA_TEXT传递标题和文本的数据,记住,一定要使用这些常量,这是标准,否则Email客户端不认识,那样你传递的标题和文本就不起作用了。
然后就是startActivity进行打开,系统会根据Intent自动匹配找到能处理这个intent的应用,如图列表,有很多个,我们这里选择网易掌上邮,就打开了一个邮件发送界面,如我们所愿,邮件地址、标题和内容都在了,很成功.
intent中的数据传递是以Extra的方式进行put后传递的,然后在使用的时候getter取出使用。
四:发送给多人以及抄送和密送
发送给多人以及抄送和密送都很简单,查找Intent类中的Extra常量,发送有这么三个常量:Intent.EXTRA_EMAIL,Intent.EXTRA_CC,Intent.EXTRA_BCC。这三个分别用于传递“接受人地址列表”、“抄送人地址列表”和“密送人地址列表”,传递的都是String[]类型的Email地址,如果数组中有多个地址,就可以发送给多人。发送的函数修改如下,我们看下效果:





Java代码 
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 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代码也做修改。



Xml代码 
<Button 
    android:id="@+id/send_to_btn"    
    android:layout_width="fill_parent"   
    android:layout_height="wrap_content"   
    android:text="SendTo Action"/> 

<Button
android:id="@+id/send_to_btn" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="SendTo Action"/>  Java代码 
/* * 发送邮件测试界面 
* @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);  
    }  


/* * 发送邮件测试界面
* @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客户端的配置,如下:





Java代码 
<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> 

<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> 从以上代码总结:



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






附加Email客户端中提取Email地址,抄送,标题,附件等信息的源代码分析.
Java代码 
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;  
    } 
  • 大小: 32.5 KB
  • 大小: 40.5 KB
  • 大小: 27.8 KB
  • 大小: 53 KB
分享到:
评论

相关推荐

    Android邮件发送详解源代码

    对应博客地址 http://blog.csdn.net/michael__li/article/details/6995141

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

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

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

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

    Android中Intent习惯用法

    本文着重讲一下Android中一些常见的Intent的习惯用法,比如如何通过Intent发送短信、发送邮件、启动摄像机拍照录视频、设置闹铃、打开WIFI设置界面等等。 限于篇幅,本文分为上下两篇,这是上篇。 发送短信 发送短信...

    Google Android SDK开发范例大全(第3版) 1/5

    《Google Android SDK开发范例大全(第3版)》在上一版的基础上,以Android手机应用程序开发(采用Android SDK 2.3.3)为主题,超过200多个范例全面且深度地整合了手机、网络及服务等多个开发领域,为读者提高程序设计...

    Android开发资料合集-World版!

    9.24、运用JAVA MAIL包实现发GMAIL邮件 230 9.26、ANDROID键盘响应 236 9.27、后台监听某个按键 238 9.28、VECTOR用法 239 9.29、CURSOR 242 9.30、把一个字符串写进文件 244 9.31、把文件内容读出到一个字符串 245 ...

    Google Android SDK开发范例大全(第3版) 4/5

    《Google Android SDK开发范例大全(第3版)》在上一版的基础上,以Android手机应用程序开发(采用Android SDK 2.3.3)为主题,超过200多个范例全面且深度地整合了手机、网络及服务等多个开发领域,为读者提高程序设计...

    Google Android SDK开发范例大全(第3版) 3/5

    《Google Android SDK开发范例大全(第3版)》在上一版的基础上,以Android手机应用程序开发(采用Android SDK 2.3.3)为主题,超过200多个范例全面且深度地整合了手机、网络及服务等多个开发领域,为读者提高程序设计...

    Google Android SDK开发范例大全(第3版) 5/5

    《Google Android SDK开发范例大全(第3版)》在上一版的基础上,以Android手机应用程序开发(采用Android SDK 2.3.3)为主题,超过200多个范例全面且深度地整合了手机、网络及服务等多个开发领域,为读者提高程序设计...

    详解android环境下的即时通讯

    通俗讲就是把一个人要发送给另外一个人的消息对象(文字,音视频,文件)通过消息通道(C/S实时通信)进行传输的服务。即时通讯应该包括四种形式,在线直传、在线代理、离线代理、离线扩展。在线直传指不经过服务器,...

    Android 开发技巧

    9.24、运用JAVA MAIL包实现发GMAIL邮件 230 9.26、ANDROID键盘响应 236 9.27、后台监听某个按键 238 9.28、VECTOR用法 239 9.29、CURSOR 242 9.30、把一个字符串写进文件 244 9.31、把文件内容读出到一个字符串 245 ...

    微信公众号极速开发实战项目源代码

    SpringBoot 2.x 集成QQ邮箱、网易系邮箱、Gmail邮箱发送邮件 项目下载并导入IDE 开启开发模式 消息交互详解 自定义菜单 授权获取用户信息 一键导出微信所有用户信息到Excel 如何使用JSSDK 微信买单 微信...

Global site tag (gtag.js) - Google Analytics