您的位置:首页 > 移动开发 > Android开发

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

2017-09-21 16:59 525 查看
最近项目里有个发邮件的功能,不能调系统发邮件,也不能调用第三方的客户端,还必须可以发网易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("752231513@qq.com"));
Transport transport = session.getTransport();
// 连接邮件服务器
transport.connect("752231513@qq.com", "授权码(非密码)");
// 发送邮件
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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: