android+意见反馈+通过邮件发送,Android后台发送邮件进行日志反馈

概要

最近在和解决用户反馈的问题,但是出现了不方便的事情.就是获取用户操作日志的问题.想来想去还是用比较隐晦的方法---发送邮件.(需要告知用户,不然会当成流氓的!)

发送邮件分为两种:

调用系统的发邮件功能发送邮件

使用特定的邮箱密码发送邮件

第一种需要用户登陆邮箱,有的用户可能还没有邮箱,不是很方便.所以采用第二种方法:

在APP内部埋好邮箱,密码给特定的邮箱发送邮件附件添加日志.

发送说明发送基础

这里要使用JavaMail的三个jar包:

activation.jar

additionnal.jar

mail.jar

发送流程

设置发送服务器

设置发送账户和密码

设置发送显示的名称,主题,内容和附件

设置接收者地址

发送邮件给接收者

发送实现 权限

发送带有附件的邮件,需要联网权限和读写SD卡权限,需要在Android Manifest.xml文件添加已下权限:

设置发送信息

以下以163邮箱为例,需要提前在163邮箱设置里面开启smtp.

设置需要的常量

//发送账户private static final String SENDER_NAME = "xxxxx@163.com";//发送账户的密码private static final String SENDER_PASS = "xxxxx";//邮箱服务器private static final String VALUE_MAIL_HOST = "smtp.163.com";//邮箱服务器主机private static final String KEY_MAIL_HOST = "mail.smtp.host";//邮箱是否需要鉴权private static final String KEY_MAIL_AUTH = "mail.smtp.auth";//需要鉴权private static final String VALUE_MAIL_AUTH = "true";

设置发送的属性

Properties properties = System.getProperties();

properties.put(KEY_MAIL_HOST, VALUE_MAIL_HOST);

properties.put(KEY_MAIL_AUTH, VALUE_MAIL_AUTH);

获取Session

Session session = Session.getInstance(properties, getAuthenticator());

private Authenticator getAuthenticator() { return new Authenticator(){ @Override

protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(SENDER_NAME, SENDER_PASS);

}

};

}

构建邮件消息

//创建消息MimeMessage mimeMessage = new MimeMessage(session);

try { //设置发送者

mimeMessage.setFrom(new InternetAddress(SENDER_NAME)); //设置接收者

InternetAddress[] addresses = new InternetAddress[]{new InternetAddress(SENDER_NAME)};

mimeMessage.setRecipients(Message.RecipientType.TO, addresses); //设置邮件的主题

mimeMessage.setSubject(title); //设置邮件的内容

MimeBodyPart textPart = new MimeBodyPart();

textPart.setContent(content, "text/html");

Multipart multipart = new MimeMultipart();

multipart.addBodyPart(textPart);

mimeMessage.setContent(multipart); //设置发送时间

mimeMessage.setSentDate(new Date());

} catch (MessagingException e) {

e.printStackTrace();

}

添加文件附件

private void appendFile(MimeMessage message, String filePath) {

try {

Multipart multipart = (Multipart) message.getContent();

MimeBodyPart filePart = new MimeBodyPart();

filePart.attachFile(filePath);

multipart.addBodyPart(filePart);

} catch (IOException e) {

e.printStackTrace();

} catch (MessagingException e) {

e.printStackTrace();

}

}

添加多个文件附件

private void appendMultiFile(MimeMessage message, List pathList) {

try {

Multipart multipart = (Multipart) message.getContent();

for (String path : pathList) {

MimeBodyPart filePart = new MimeBodyPart();

filePart.attachFile(path);

multipart.addBodyPart(filePart);

}

} catch (IOException e) {

e.printStackTrace();

} catch (MessagingException e) {

e.printStackTrace();

}

}

发送邮件

Transport.send(mimeMessage);

发送结果

1.不带附件的邮件:

// 此处省略

2.带附件的邮件

// 此处省略

完整的发送代码

为了方便使用,就写了个发送邮件的单例,代码如下:

package net.devwiki.mailsender; import android.os.AsyncTask; import java.io.IOException;

import java.util.Date;

import java.util.List;

import java.util.Properties; import javax.mail.Authenticator;

import javax.mail.Message;

import javax.mail.MessagingException;

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 DevWiki on 2016/8/21.

*/

public class MailManager {

private static final String SENDER_NAME = "xxxxx@163.com";

private static final String SENDER_PASS = "xxxxx";

private static final String VALUE_MAIL_HOST = "smtp.163.com";

private static final String KEY_MAIL_HOST = "mail.smtp.host";

private static final String KEY_MAIL_AUTH = "mail.smtp.auth";

private static final String VALUE_MAIL_AUTH = "true";public static MailManager getInstance() {

return InstanceHolder.instance;

}private MailManager() {

}private static class InstanceHolder {

private static MailManager instance = new MailManager();

}class MailTask extends AsyncTask {

private MimeMessage mimeMessage; public MailTask(MimeMessage mimeMessage) {

this.mimeMessage = mimeMessage;

} @Override

protected Boolean doInBackground(Void... voids) {

try {

Transport.send(mimeMessage);

return Boolean.TRUE;

} catch (MessagingException e) {

e.printStackTrace();

return Boolean.FALSE;

}

}

}public void sendMail(final String title, final String content) {

MimeMessage mimeMessage = createMessage(title, content);

MailTask mailTask = new MailTask(mimeMessage);

mailTask.execute();

}public void sendMailWithFile(String title, String content, String filePath) {

MimeMessage mimeMessage = createMessage(title, content);

appendFile(mimeMessage, filePath);

MailTask mailTask = new MailTask(mimeMessage);

mailTask.execute();

}public void sendMailWithMultiFile(String title, String content, List pathList) {

MimeMessage mimeMessage = createMessage(title, content);

appendMultiFile(mimeMessage, pathList);

MailTask mailTask = new MailTask(mimeMessage);

mailTask.execute();

}private Authenticator getAuthenticator() {

return new Authenticator() {

@Override

protected PasswordAuthentication getPasswordAuthentication() {

return new PasswordAuthentication(SENDER_NAME, SENDER_PASS);

}

};

}private MimeMessage createMessage(String title, String content) {

Properties properties = System.getProperties();

properties.put(KEY_MAIL_HOST, VALUE_MAIL_HOST);

properties.put(KEY_MAIL_AUTH, VALUE_MAIL_AUTH);

Session session = Session.getInstance(properties, getAuthenticator());

MimeMessage mimeMessage = new MimeMessage(session);

try {

mimeMessage.setFrom(new InternetAddress(SENDER_NAME));

InternetAddress[] addresses = new InternetAddress[]{new InternetAddress(SENDER_NAME)};

mimeMessage.setRecipients(Message.RecipientType.TO, addresses);

mimeMessage.setSubject(title);

MimeBodyPart textPart = new MimeBodyPart();

textPart.setContent(content, "text/html");

Multipart multipart = new MimeMultipart();

multipart.addBodyPart(textPart);

mimeMessage.setContent(multipart);

mimeMessage.setSentDate(new Date());

} catch (MessagingException e) {

e.printStackTrace();

}

return mimeMessage;

}private void appendFile(MimeMessage message, String filePath) {

try {

Multipart multipart = (Multipart) message.getContent();

MimeBodyPart filePart = new MimeBodyPart();

filePart.attachFile(filePath);

multipart.addBodyPart(filePart);

} catch (IOException e) {

e.printStackTrace();

} catch (MessagingException e) {

e.printStackTrace();

}

}private void appendMultiFile(MimeMessage message, List pathList) {

try {

Multipart multipart = (Multipart) message.getContent();

for (String path : pathList) {

MimeBodyPart filePart = new MimeBodyPart();

filePart.attachFile(path);

multipart.addBodyPart(filePart);

}

} catch (IOException e) {

e.printStackTrace();

} catch (MessagingException e) {

e.printStackTrace();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值