Android发送邮件

项目中有些关键日志需要从客户手中拿到,为了方便的收集日志在客户端中加入邮件发送功能(虽然使用分享功能也能发送邮件,前提需要客户登录手机的邮箱才行,比较麻烦,而且还进入页面,用户体验不太好)。

主要实现了发送邮件,抄送,发送附件功能

先看一下效果图:

涉及到3个jar以及封装的接口

JEmailHelper.java
package jwzhangjie.com.javaemail;

import android.os.AsyncTask;

import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.activation.CommandMap;
import javax.activation.MailcapCommandMap;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

/**
 * Created by zhangjie on 15/8/31.
 */
public class JEmailHelper {

    private int port = 553;  //smtp协议使用的端口
    private String host = "smtp.163.com"; // 发件人邮件服务器
    private String user = "*******@163.com";   // 使用者账号
    private String password = "********"; //使用者密码

    private List<String> emailTos;
    private List<String> emailCCs;
    private String subject;
    private String body;
    private List<String> paths;

    enum SendStatus {
        SENDING, UNDO, SENDOK, SENDFAIL
    }

    ;

    private SendStatus sendStatus;

    public interface JieEmailInfterface {
        void startSend();

        void SendStatus(SendStatus sendStatus);
    }

    private JieEmailInfterface jieEmailInfterface;

    public void setJieEmailInfterface(JieEmailInfterface jieEmailInfterface) {
        this.jieEmailInfterface = jieEmailInfterface;
    }

    public JEmailHelper() {
        sendStatus = SendStatus.UNDO;
    }

    //构造发送邮件帐户的服务器,端口,帐户,密码
    public JEmailHelper(String host, int port, String user, String password) {
        this.port = port;
        this.user = user;
        this.password = password;
        this.host = host;
        sendStatus = SendStatus.UNDO;
    }

    /**
     * @param emailTos 主要接收人的电子邮箱列表
     * @param emailCCs 抄送人的电子邮箱列表
     * @param subject  邮件标题
     * @param body     正文内容
     * @param paths    发送的附件路径集合
     */
    public void setParams(List<String> emailTos, List<String> emailCCs, String subject, String body,
                          List<String> paths) {
        this.emailTos = emailTos;
        this.emailCCs = emailCCs;
        this.subject = subject;
        this.body = body;
        this.paths = paths;
    }

    public void sendEmail() {
        new JieAsynTask().execute();
    }

    private void sendEmailBg() throws Exception {
        Properties properties = new Properties();
        properties.put("mail.smtp.host", host);
        properties.put("mail.smtp.port", port);
        properties.put("mail.smtp.auth", "true");//true一定要加引号
        properties.put("mail.transport.protocol", "smtp");

        JieAuthenticator jieAuth = new JieAuthenticator(user, password);

        Session session = Session.getInstance(properties, jieAuth);
        //创建一个消息
        MimeMessage msg = new MimeMessage(session);

        //设置发送人
        msg.setFrom(new InternetAddress(user));

        //设置主要接收人
        if (emailTos != null && !emailTos.isEmpty()) {
            int size = emailTos.size();
            InternetAddress[] addresses = new InternetAddress[size];
            for (int i = 0; i < size; i++) {
                addresses[i] = new InternetAddress(emailTos.get(i));
            }
            msg.setRecipients(Message.RecipientType.TO, addresses);
        }

        //设置抄送人的电子邮件
        if (emailCCs != null && !emailCCs.isEmpty()) {
            int size = emailCCs.size();
            InternetAddress[] addresses = new InternetAddress[size];
            for (int i = 0; i < size; i++) {
                addresses[i] = new InternetAddress(emailCCs.get(i));
            }
            msg.setRecipients(Message.RecipientType.CC, addresses);
        }

        msg.setSubject(subject);

        //创建一个消息体
        MimeBodyPart msgBodyPart = new MimeBodyPart();
        msgBodyPart.setText(body);

        //创建Multipart增加其他的parts
        Multipart mp = new MimeMultipart();
        mp.addBodyPart(msgBodyPart);

        //创建文件附件
        for (String path : paths) {
            MimeBodyPart fileBodyPart = new MimeBodyPart();
            fileBodyPart.attachFile(path);
            mp.addBodyPart(fileBodyPart);
        }

        //增加Multipart到消息体中
        msg.setContent(mp);
        //设置日期
        msg.setSentDate(new Date());
        //设置附件格式
        MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
        mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
        mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
        mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
        mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
        mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
        CommandMap.setDefaultCommandMap(mc);
        //发送消息
        Transport.send(msg);
    }

    class JieAuthenticator extends Authenticator {
        private String strUser;
        private String strPwd;

        public JieAuthenticator(String user, String password) {
            this.strUser = user;
            this.strPwd = password;
        }

        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(strUser, strPwd);
        }
    }

    class JieAsynTask extends AsyncTask<Void, Void, SendStatus> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            if (jieEmailInfterface != null) {
                jieEmailInfterface.startSend();
            }
        }

        @Override
        protected void onPostExecute(SendStatus result) {
            super.onPostExecute(result);
            if (jieEmailInfterface != null) {
                jieEmailInfterface.SendStatus(result);
            }
            sendStatus = SendStatus.UNDO;
        }

        @Override
        protected SendStatus doInBackground(Void... params) {
            try {
                sendStatus = SendStatus.SENDING;
                sendEmailBg();
                sendStatus = SendStatus.SENDOK;
            } catch (Exception e) {
                e.printStackTrace();
                sendStatus = SendStatus.SENDFAIL;
            }
            return sendStatus;
        }
    }
}

package jwzhangjie.com.javaemail;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class JavaEmailActivity extends Activity {

    JEmailHelper helper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_java_email);
        helper = new JEmailHelper();
    }

    public void sendMail(View view) {

        List<String> files = new ArrayList<String>();
        files.add("/mnt/sdcard/test.txt");
        List<String> toEmail = new ArrayList<String>();
        toEmail.add("[email protected]");
        List<String> ccEmail = new ArrayList<String>();
        ccEmail.add("1067*****@qq.com");
        ccEmail.add("352****@qq.com");
        helper.setParams(toEmail, ccEmail, "Android发送测试邮件", "Dear All:这是一封测试邮件!", files);
        helper.setJieEmailInfterface(new JEmailHelper.JieEmailInfterface() {
            @Override
            public void startSend() {
                showInfo("开始发送邮件");
            }

            @Override
            public void SendStatus(JEmailHelper.SendStatus sendStatus) {
                switch (sendStatus) {
                    case SENDOK:
                        showInfo("发送邮件成功");
                        break;
                    case SENDFAIL:
                        showInfo("发送邮件失败");
                        break;
                    case SENDING:
                        showInfo("邮件正在发送中,请稍后重试");
                        break;
                }
            }
        });
        helper.sendEmail();
    }

    public void showInfo(String msg){
        Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
    }
}

三个jar的地址:

http://pan.baidu.com/s/1bnbi7zp

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-27 05:46:17

Android发送邮件的相关文章

关于Android发送邮件

Google 在发表 Android 手机平台时,强调的是超强大的网络支持能力,因此,无论通过 GPRS.3G的电信网络或者是Wifi的无线WLAN网络,都能够发EMAIL. 发送邮件中使用的Intent 行为为 android.content.Intent.ACTION_SEND .实际上在 Android 上使用的邮件发送服务是调用Gmail程序,而非直接使用SMTP的Protocol .现在介绍本篇需要使用到的功能清单: •验证用户输入是否为正确的邮箱格式:•用户可以先把手动输入邮箱,也可

Android 发送邮件以及定时发送邮件的实现

本文以腾讯企业邮箱为例,展示如何发送邮件 及相关问题  选择腾讯企业邮箱是因为腾讯企业邮箱一般都是开启了smtp服务 项目地址:https://gitee.com/bimingcong/MySendEmail 具体的smtp服务开启方式如下: 设置---->客户端设置---->记住红色框内的发送服务器地址smtp.exmail.qq.com 以及要用到的SSL端口号465 首先用android系统发送邮件的话  需要用到针对android的邮件发送包 在此我们可以在Gradle 里边加入所需的

Android开发之发送邮件功能的实现(源代码分享)

Android开发中可能会碰到如何发送邮件的困扰,之前我也查了相关的文档,博友们也分享了不少的发送邮件的办法,总共有3种把,我仔细阅读了下,发现有的讲的太过复杂跟麻烦,不够清晰,我今天就来分享下我认为的最好用的办法来解决该问题,使用Andorid-MAIL Jar包.首先我们先要下载以下四个文件 然后呢在Android平台上发送邮件呢,肯定先要检查网络的状态,网络状态可用的情况下才能发送邮件成功啊(别往了获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. ) publ

android源码大放送(实战开发必备),免费安卓demo源码,例子大全文件详细列表

免费安卓demo源码,例子大全文件详细列表 本列表源码永久免费下载地址:http://www.jiandaima.com/blog/android-demo 卷 yunpan 的文件夹 PATH 列表 卷序列号为 0000-73EC E:. │ jiandaima.com文件列表生成.bat │ 例子大全说明.txt │ 本例子永久更新地址~.url │ 目录列表2016.03.10更新.txt │ ├─前台界面 │ ├─3D标签云卡片热门 │ │ Android TagCloudView云标签

Android代码速查,写给新手的朋友们[转]

原文地址:http://www.open-open.com/lib/view/open1397286499090.html 0 android 创建按钮 Button button = new Button(this); 1 android 创建输入框 EditText editText = new EditText(this); 2 android 创建文本 TextView textView = new TextView(this); 3 android 设置文本显示内容TextView t

android中调用系统的发送短信、发送邮件、打电话功能

1 调用发送短信功能: Uri smsToUri = Uri.parse("smsto:"); Intent sendIntent = new Intent(Intent.ACTION_VIEW, smsToUri); sendIntent.putExtra("address", "123456"); //电话号码,这行去掉的话,默认就没有电话 sendIntent.putExtra("sms_body","短信内容

Android 使用 Gmail 来发送邮件

1. [代码]SendMail.java package org.apache.android.mail; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; public class SendMail extend

获取Android崩溃crash信息并写入日志发送邮件

一.实现Thread.UncaughtExceptionHandlerUnChecked异常发生时,由于没有相应的try…catch处理该异常对象,所以Java运行环境将会终止,程序将退出,也就是我们所说的Crash.Java API提供了一个全局异常捕获处理器,Android应用在Java层捕获Crash依赖的就是Thread.UncaughtExceptionHandler处理器接口,通常我们只需实现这个接口,并重写其中的uncaughtException方法,在该方法中可以读取Crash的

android后台发送邮件

 public class SendEmail { private static final String TAG = "SendEmail"; //要发送Email地址 private String mailTo = null; //邮件发送来源地址 private String mailFrom = null; //SMTP主机地址 private String smtpHost = null; //是否启用调试 private boolean debug = false; p