android mail发送邮件(包含163邮箱及qq邮箱,使用mail.jar,activation.jar,additionnal.jar)

最近项目里有个发邮件的功能,不能调系统发邮件,也不能调用第三方的客户端,还必须可以发网易163邮箱,也可以发QQ邮箱。这让我想起来,当年初学java时自己写了个发送邮件的小demo,就是发给网易邮箱的,用的java 的mail.jar等实现的。


而android这个估计应该也是一样的吧,于是我就开始实现了。


首先导入三个jar包,mail.jar,activation.jar,additionnal.jar。由于当时对其他jar包印象不是很深,只导入了mail.jar,结果包了如下错误

java.lang.NoClassDefFoundError: javax.activation.DataHandler 

后来导入相关jar包就可以了,也就是这三个包配齐就可以了。


一开始,我先从网易邮箱入手了,代码如下:



毕竟demo吗,大家就不要追求其他啥了,首先布局,很简单,就一个按钮

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/bt_send_mail"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="发送邮件"/>
</LinearLayout>

接下来发送邮件的核心代码:

private void send() {
        try {
            Properties props = new Properties();
            // 开启debug调试
            props.setProperty("mail.debug", "true");
            // 发送服务器需要身份验证
            props.setProperty("mail.smtp.auth", "true");
             //设置邮件服务器主机名
            props.setProperty("mail.host", "smtp.163.com");
            // 设置邮件服务器主机名
//            props.setProperty("mail.host", "smtp.qq.com");
            // 发送邮件协议名称
            props.setProperty("mail.transport.protocol", "smtp");

            // 设置环境信息
            Session session = Session.getInstance(props);

            // 创建邮件对象
            Message msg = new MimeMessage(session);

            msg.setSubject("AndroidMail测试");
            // 设置邮件内容
            msg.setText("这是一封由大当家发送的邮件!");
            // 设置发件人
            msg.setFrom(new InternetAddress("---发件人邮箱---"));
            Transport transport = session.getTransport();
            // 连接邮件服务器
            transport.connect("---发件人邮箱账号---", "---发件人邮箱密码---");
            // 发送邮件
            transport.sendMessage(msg, new Address[]{new InternetAddress("收件人邮箱")});
            // 关闭连接
            transport.close();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }


然后在Activity中的具体使用:

public class FeedBackActivity extends BaseActivity {
    @BindView(R.id.bt_send_mail)
    Button btSendMail;
    private MyMailTask myMailTask;

    @Override
    protected int getContentViewId() {
        return R.layout.activity_feed_back;
    }

    @Override
    protected void initData(Bundle savedInstanceState) {

    }


    @OnClick(R.id.bt_send_mail)
    public void onViewClicked() {
        myMailTask=new MyMailTask();
        myMailTask.execute();
    }


    private void send() {
        try {
            Properties props = new Properties();
            // 开启debug调试
            props.setProperty("mail.debug", "true");
            // 发送服务器需要身份验证
            props.setProperty("mail.smtp.auth", "true");
             //设置邮件服务器主机名
            props.setProperty("mail.host", "smtp.163.com");
            // 设置邮件服务器主机名
//            props.setProperty("mail.host", "smtp.qq.com");
            // 发送邮件协议名称
            props.setProperty("mail.transport.protocol", "smtp");

            // 设置环境信息
            Session session = Session.getInstance(props);

            // 创建邮件对象
            Message msg = new MimeMessage(session);

            msg.setSubject("AndroidMail测试");
            // 设置邮件内容
            msg.setText("这是一封由大当家发送的邮件!");
            // 设置发件人
            msg.setFrom(new InternetAddress("---发件人邮箱---"));
            Transport transport = session.getTransport();
            // 连接邮件服务器
            transport.connect("---发件人邮箱账号---", "---发件人邮箱密码---");
            // 发送邮件
            transport.sendMessage(msg, new Address[]{new InternetAddress("收件人邮箱")});
            // 关闭连接
            transport.close();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }



    private class MyMailTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            btSendMail.setText("正在发送中...");
        }

        @Override
        protected Void doInBackground(Void... voids) {
            send();
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            btSendMail.setText("发送成功");
        }

        @Override
        protected void onCancelled() {
            super.onCancelled();
        }
    }
}

因为连接邮箱服务器,发邮件都是耗时操作,所以别放主线程里执行了,我这里用的AsyncTask,你用什么都行,奏是这么简单。来,我们看看有没有收到邮件




哈哈,收到了。好,一鼓作气,来实现qq邮箱。将代码里

props.setProperty("mail.host", "smtp.163.com");

改为

props.setProperty("mail.host", "smtp.qq.com");

不就可以了吗,然后发件人,收件人邮箱换qq的。但,我是万万没想到啊,没喝大力果然不行,报错了

这是什么鬼,为什么还有链接,不管了,点下看看。原来QQ邮箱还需要SSL加密,网易的不需要,所以报错了,网上还有说用什么企业邮箱服务器,smtp.exmail.qq.com

,我实在懒得试,而且我这个就不行了吗。然后加密就加密呗,加入了如下代码

MailSSLSocketFactory msf = new MailSSLSocketFactory();
            msf.setTrustAllHosts(true);
            props.put("mail.smtp.ssl.enable", "true");
            props.put("mail.smtp.ssl.socketFactory", msf);

但运行又报错,又发链接,这次点开,原来是授权码。为了QQ安全,改使用授权码替代邮箱密码进行验证登录。

授权码   QQ邮箱授权码介绍       这里有相关介绍和使用我就不多说了,自己看,说的很清楚

所以QQ邮箱发送,整个代码如下:

public class FeedBackActivity extends BaseActivity {
    @BindView(R.id.bt_send_mail)
    Button btSendMail;
    private MyMailTask myMailTask;

    @Override
    protected int getContentViewId() {
        return R.layout.activity_feed_back;
    }

    @Override
    protected void initData(Bundle savedInstanceState) {

    }


    @OnClick(R.id.bt_send_mail)
    public void onViewClicked() {
        myMailTask=new MyMailTask();
        myMailTask.execute();
    }


    private void send() {
        try {
            Properties props = new Properties();
            // 开启debug调试
            props.setProperty("mail.debug", "true");
            // 发送服务器需要身份验证
            props.setProperty("mail.smtp.auth", "true");
            // 设置邮件服务器主机名
//            props.setProperty("mail.host", "smtp.163.com");
            // 设置邮件服务器主机名
            props.setProperty("mail.host", "smtp.qq.com");
            // 发送邮件协议名称
            props.setProperty("mail.transport.protocol", "smtp");
            MailSSLSocketFactory msf = new MailSSLSocketFactory();
            msf.setTrustAllHosts(true);
            props.put("mail.smtp.ssl.enable", "true");
            props.put("mail.smtp.ssl.socketFactory", msf);

            // 设置环境信息
            Session session = Session.getInstance(props);

            // 创建邮件对象
            Message msg = new MimeMessage(session);

            msg.setSubject("AndroidMail测试");
            // 设置邮件内容
            msg.setText("这是一封由大当家发送的邮件!");
            // 设置发件人
            msg.setFrom(new InternetAddress("[email protected]"));
            Transport transport = session.getTransport();
            // 连接邮件服务器
            transport.connect("[email protected]", "授权码(非密码)");
            // 发送邮件
            transport.sendMessage(msg, new Address[]{new InternetAddress("收件人邮箱")});
            // 关闭连接
            transport.close();
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        }
    }



    private class MyMailTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            btSendMail.setText("正在发送中...");
        }

        @Override
        protected Void doInBackground(Void... voids) {
            send();
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            btSendMail.setText("发送成功");
        }

        @Override
        protected void onCancelled() {
            super.onCancelled();
        }
    }
}

哈哈,大功告成,刚点击了按钮,桌面右下角就出现了


好了,到此发送163和QQ邮箱已经完成,希望能帮助到你们!


三个jar包的下载地址:http://download.csdn.net/download/qq_30548105/9989228



本人个人原创,如有雷同,纯属巧合,或者与本人联系,做改动。请转载或者CV组合标明出处,谢谢!(如有疑问或错误欢迎指出,本人QQ:752231513)

猜你喜欢

转载自blog.csdn.net/qq_30548105/article/details/78054213