Android后台发送邮件实现用户反馈

前言

新手一枚,最近在实现用户反馈这个功能,但是因为应用过于简单,没有用到服务器,所以常见的http发送用户反馈没办法实现,想了之后觉得应该可以实现将反馈信息发送到个人邮箱,然后在网上查了一下,发现了一个发送邮件的解决方法,特此转载在这记录一下。(已获得原作者的允许)

原文地址:http://blog.devwiki.net/index.php/2016/08/21/android-background-send-log-mail.html/comment-page-1#comment-20


发送邮件分为两种:

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

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

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

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

发送说明

发送基础

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

  1. activation.jar
  2. additionnal.jar
  3. mail.jar

发送流程

  1. 设置发送服务器
  2. 设置发送账户和密码
  3. 设置发送显示的名称,主题,内容和附件
  4. 设置接收者地址
  5. 发送邮件给接收者

发送实现

权限

发送带有附件的邮件,需要联网权限和读写SD卡权限,需要在Android Manifest.xml文件添加已下权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

设置发送信息

以下以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<String> 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);

当然,这么看很可能会懵逼,原作者也准备了一个demo,非常清晰明了。
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<Void, Void, Boolean> {
 
        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<String> 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<String> 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();
        }
    }
}

对了,我在引用代码的过程中,我收到邮件的中文全为????,所以我在createMessage()方法中的这一行
textPart.setContent(content, "text/html");
下面加了一行代码
textPart.setContent(content, "text/html");
textPart.setText(content,"UTF-8");
邮箱里的文字就显示正常了。

后记

如果你需要完整的项目代码,请到原作者日志下载

http://blog.devwiki.net/index.php/2016/08/21/android-background-send-log-mail.html/comment-page-1#comment-20














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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值