给APP增加了一个用户反馈的小功能,由于懒的搭服务器,所以就用邮件的形式进行通信,有如下两种方式:

1.使用调用手机上的其他程序完成邮件发送

2.使用javamail进行邮件发送

这里果断使用javamail,因为我们大多数并不会在手机上使用邮件APP

使用javamail需要三个jar包,分别是additional.jar、mail.jar和activation.jar,可以到google官网下载:https://code.google.com/archive/p/javamail-android/downloads

我当时是因为没法上google的域名,baidu了好多,导包之后各种 java.lang.NoClassDefFoundError: javax.activation.DataHandler 错误,这是因为导入的activation.jar包有问题,这里放上从google下载的:

http://download.csdn.net/detail/u012062785/9685867

eclipse导入jar包方法:

1.在项目的根目录下,新建文件夹libs,将下载的3个jar包放入该文件夹

2.选中项目,右键->Properties->Java Build Path->Libraries,选择Add External JARs,找到项目下lib目录的3个jar包,完成导入

接下来直接上源码

 package com.pngcui.testmail;

 import java.util.Properties;

 import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage; public class MailSend { private String mailContext; public MailSend(String context){
this.mailContext = context;
} public void sendMail() throws MessagingException{
Properties props = new Properties();
//使用smtp代理,且使用网易163邮箱
props.put("mail.smtp.host", "smtp.163.cn");
//设置验证
props.put("mail.smtp.auth", "true");
MyAuthenticator myauth = new MyAuthenticator("发件人邮箱@163.com", "密码");
Session session = Session.getInstance(props,myauth);
//打开调试开关
session.setDebug(true);
MimeMessage message = new MimeMessage(session);
InternetAddress fromAddress = null;
//发件人邮箱地址
fromAddress = new InternetAddress("发件人邮箱@163.com");
message.setFrom(fromAddress); InternetAddress toAddress = new InternetAddress("收件人邮箱地址");
message.addRecipient(Message.RecipientType.TO, toAddress);
message.setSubject("邮件标题");
message.setText(mailContext);// 设置邮件内容
//message.setFileName("邮件附件");
message.saveChanges(); //存储信息 Transport transport = null;
transport = session.getTransport("smtp");
transport.connect("smtp.163.com", "发件人邮箱@163.com", "密码");
transport.sendMessage(message, message.getAllRecipients()); transport.close();
} class MyAuthenticator extends javax.mail.Authenticator {
private String strUser;
private String strPwd; public MyAuthenticator(String user, String password) {
this.strUser = user;
this.strPwd = password;
} @Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(strUser, strPwd);
}
}
}

最后附录几个我遇到的问题

1.Authentication认证失败,是因为你的密码或者邮箱地址有误,163的邮箱尽量不要使用新申请的,而且这个密码是客户端授权密码,不是你的邮箱登录密码!

2. com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 163 smtp4,遇到这个问题是被反垃圾了==,在邮件标题或者邮件正文不要出现test或者helloworld的内容,否则网易会认为是垃圾邮件,导致无法发送出去。无法发送的原因可以参考http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html

最后调用new MailSend("邮件正文").sendMail();就可以发送出去了!!

Android开发之JavaMail发送邮件(用户反馈)的更多相关文章

  1. Android开发之InstanceState详解

    Android开发之InstanceState详解   本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...

  2. 【Android UI】Android开发之View的几种布局方式及实践

    引言 通过前面两篇: Android 开发之旅:又见Hello World! Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理 ...

  3. Android开发之旅: Intents和Intent Filters(理论部分)

    引言 大部分移动设备平台上的应用程序都运行在他们自己的沙盒中.他们彼此之间互相隔离,并且严格限制应用程序与硬件和原始组件之间的交互. 我们知道交流是多么的重要,作为一个孤岛没有交流的东西,一定毫无意义 ...

  4. Android开发之Java必备基础

    Android开发之Java必备基础 Java类型系统 Java语言基础数据类型有两种:对象和基本类型(Primitives).Java通过强制使用静态类型来确保类型安全,要求每个变量在使用之前必须先 ...

  5. Android 开发之旅:深入分析布局文件&又是“Hello World!”

    http://www.cnblogs.com/skynet/archive/2010/05/20/1740277.html 引言 上篇可以说是一个分水岭,它标志着我们从Android应用程序理论进入实 ...

  6. [置顶] Android开发之serviceManager分析

    Android 开发之serviceManager分析 在Android系统中用到最多的通信机制就是Binder,Binder主要由Client.Server.ServiceManager和Binde ...

  7. Android开发之InstanceState详解(转)---利用其保存Activity状态

    Android开发之InstanceState详解   本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...

  8. Android开发之旅5:应用程序基础及组件

    引言 上篇Android开发之旅:应用程序基础及组件介绍了应用程序的基础知识及Android的四个组件,本篇将介绍如何激活组关闭组件等.本文的主题如下: 1.激活组件:意图(Intents) 1.1. ...

  9. Android开发之旅4:应用程序基础及组件

    引言 为了后面的例子做准备,本篇及接下来几篇将介绍Android应用程序的原理及术语,这些也是作为一个Android的开发人员必须要了解,且深刻理解的东西.本篇的主题如下: 1.应用程序基础 2.应用 ...

随机推荐

  1. python利用redis构成一个队列

    例子在 http://peter-hoffmann.com/2012/python-simple-queue-redis-queue.html 英文 http://www.django-china.c ...

  2. Oracle提示大全

    Hint概述 基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比. 此时就需要DBA进行 ...

  3. 161229、SpringMVC的各种参数绑定方式

    1. 基本数据类型(以int为例,其他类似): Controller代码: @RequestMapping("saysth.do") public void test(int co ...

  4. Breeze库API总结(Spark线性代数库)(转载)

    导入 import breeze.linalg._ import breeze.numerics._ Spark Mllib底层的向量.矩阵运算使用了Breeze库,Breeze库提供了Vector/ ...

  5. Java的文件读写操作

    file(内存)----输入流---->[程序]----输出流---->file(内存) 当我们读写文本文件的时候,采用Reader是非常方便的,比如FileReader,InputStr ...

  6. SSO之CAS单点登录实例演示

    本文目录: 一.概述 二.演示环境 三.JDK安装配置 四.安全证书配置 五.部署CAS-Server相关的Tomcat 六.部署CAS-Client相关的Tomcat 七. 测试验证SSO 一.概述 ...

  7. 《编写可维护的JavaScript》——JavaScript编码规范(二)

    昨天是我偶像生日,现在整个人都还好兴奋啊O(∩_∩)O~  闲话少说,让我先发篇随笔留念一下^_^ ////////////////////////////////正文分割线///////////// ...

  8. [课程设计]Sprint Three 回顾与总结&发表评论&团队贡献分

    Sprint Three 回顾与总结&发表评论&团队贡献分 ● 一.回顾与总结 (1)回顾 燃尽图: Sprint计划-流程图: milestones完成情况如下: (2)总结 本次冲 ...

  9. Codeforces Round #363 (Div. 2)A-D

    699A 题意:在一根数轴上有n个东西以相同的速率1m/s在运动,给出他们的坐标以及运动方向,问最快发生的碰撞在什么时候 思路:遍历一遍坐标,看那两个相邻的可能相撞,更新ans #include< ...

  10. springmvc使用freemarker

    首先需要添加freemarker.jar到项目,如果项目中有spring或者spirngmvc,需要整合,首先配置freemarkerConfig,代码结构如下 <!-- 设置freeMarke ...