给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. YbSoftwareFactory 代码生成插件【十七】:先进的权限模型体系设计

    目前权限管理系统不少,但通用.灵活.符合现代企事业单位实际工作需要的不多.现有的权限系统绝大多数都是以模块为核心,而本权限模型将摒弃此类普遍的做法,将以组织机构为核心来进行权限系统的设计,因为这更符合 ...

  2. java综合实训第二次

  3. JAG Summer 2012 Day 4 C Connect

    状压dp,由于枚举两维状态会GG,所以只枚举当前位置前m个的状态,就是这个样子大概= =: 呆马: #include <iostream> #include <cstdio> ...

  4. CSS学习之道

    @media的IE-hacks,精彩绝伦 http://blog.keithclark.co.uk/moving-ie-specific-css-into-media-blocks/

  5. 【转】mysql对large page的支持

    昨天同事问我关于大页内存的事,我也只是有个模糊的概念,从别的博客转过来的,先记录下 在 Linux 操作系统上运行内存需求量较大的应用程序时,由于其采用的默认页面大小为 4KB,因而将会产生较多 TL ...

  6. python导入opencv解决no module named cv2问题

    最近ubuntu用的比较多,在写神经网络代码时也会经常接触到python,但是python的环境配置确实是个头疼的问题. 尤其是接触到opencv时,需要导入opencv的库文件,网上也有很多方法,本 ...

  7. [译]Dynamics AX 2012 R2 BI系列-规划分析的注意事项

    https://msdn.microsoft.com/en-us/library/gg731898.aspx       在开始实施AX的分析特性前,有很多事情要考虑.本文描述了你必须考虑的事情,和在 ...

  8. Ajax原理

  9. Apache_proxy负载均衡和Session复制

    今天上网查了查资料,之前使用apache的jk模块做负载均衡.后来觉得jk的负载配置有点死板,只能按照负载权重值来进行请求的分发,没有做到比较智能的负载平衡,并且使用mod_jk访问页面发现确实比较慢 ...

  10. python实现排序算法

    冒泡排序  import randomdef BubbleSort(num):    n=len(num)    for i in range(0,n):        for j in range( ...