Android获取崩溃日志并上传到邮箱

好吧,老板要获取崩溃日志并上传服务器,已经实现了,这个比较简单,主要说说上传到邮箱的一个主意的地方:

上传到服务器和邮箱需要4个jar包(android-crash-1.0.jar,activation.jar,additionnal.jar,mail.jar),我是在别人的博客上面下载的,还需要积分,下载链接:点击打开链接。其实不用下载,大牛已经上传到jcenter上面了,直接在Android studio中就可以搜索到然后关联就好了


如果不放心的话就花点积分下载关联也行。下面贴代码:


主要是一个发送邮件的类

import java.io.File;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

/*
    {
        //上传到163邮箱中
        EmailSender sender=new EmailSender();
        //设置服务器地址和端口,网上搜的到
        sender.setProperties("smtp.163.com","25");
        //分别设置发件人,邮件标题和文本内容
        sender.setMessage("自己的163邮箱账号","EmailSender","Java Mail ");
        //设置收件人
        sender.setReceiver(new String[]{"自己的163账号"});
        //添加附件
        //这个附件的路径是我手机里的啊,要发你得换成你手机里正确的路径
        sender.addAttachment(filePath);
        *//**
         *  发送邮件
         *
         *  重点来了!!!!!!
         * password:此处应该填写我们第一步那里生成的授权码(我就是错在这里.......         * 这里的授权码不是账号登录时候的密码,是为了第三方客户端登录用的授权码(也可以看做密码,但是不能跟账户密码相同)
         * 参考:https://blog.csdn.net/th226/article/details/79052561
         * 
         *//*
        sender.sendEmail("smtp.163.com","自己的163账号","这里是在163里设置POP3/SMTP的时候设置的授权码");
        //sender.setMessage("你的163邮箱账号", "EmailS//ender", "Java Mail ");这里面两个邮箱账号要一致
      }
*/
public class EmailSender {
    private Properties properties;
    private Session session;
    private Message message;
    private MimeMultipart multipart;

    public EmailSender() {
        super();
        this.properties = new Properties();
    }

    public void setProperties(String host, String post) {
        //地址
        this.properties.put("mail.smtp.host", host);
        //端口号
        this.properties.put("mail.smtp.post", post);
        //是否验证
        this.properties.put("mail.smtp.auth", true);
        this.session = Session.getInstance(properties);
        this.message = new MimeMessage(session);
        this.multipart = new MimeMultipart("mixed");
    }

    /**
     * 设置收件人
     *
     * @param receiver
     * @throws MessagingException
     */
    public void setReceiver(String[] receiver) throws MessagingException {
        InternetAddress[] address = new InternetAddress[receiver.length];
        for (int i = 0; i < receiver.length; i++) {
            address[i] = new InternetAddress(receiver[i]);
        }
        this.message.setRecipients(Message.RecipientType.TO, address);
    }

    /**
     * 设置邮件
     *
     * @param from    来源
     * @param title   标题
     * @param content 内容
     * @throws AddressException
     * @throws MessagingException
     */
    public void setMessage(String from, String title, String content) throws AddressException, MessagingException {
        this.message.setFrom(new InternetAddress(from));
        this.message.setSubject(title);
        //纯文本的话用setText()就行,不过有附件就显示不出来内容了
        MimeBodyPart textBody = new MimeBodyPart();
        textBody.setContent(content, "text/html;charset=gbk");
        this.multipart.addBodyPart(textBody);
    }

    /**
     * 添加附件
     *
     * @param filePath 文件路径
     * @throws MessagingException
     */
    public void addAttachment(String filePath) throws MessagingException {
        FileDataSource fileDataSource = new FileDataSource(new File(filePath));
        DataHandler dataHandler = new DataHandler(fileDataSource);
        MimeBodyPart mimeBodyPart = new MimeBodyPart();
        mimeBodyPart.setDataHandler(dataHandler);
        mimeBodyPart.setFileName(fileDataSource.getName());
        this.multipart.addBodyPart(mimeBodyPart);
    }

    /**
     * 发送邮件
     *
     * @param host    地址
     * @param account 账户名
     * @param pwd     密码
     * @throws MessagingException
     */
    public void sendEmail(String host, String account, String pwd) throws MessagingException {
        //发送时间
        this.message.setSentDate(new Date());
        //发送的内容,文本和附件
        this.message.setContent(this.multipart);
        this.message.saveChanges();
        //创建邮件发送对象,并指定其使用SMTP协议发送邮件
        Transport transport = session.getTransport("smtp");
        //登录邮箱
        transport.connect(host, account, pwd);
        //发送邮件
        transport.sendMessage(message, message.getAllRecipients());
        //关闭连接
        transport.close();
    }
}

然后在创建的第一个activity中开一个子线程实现上传方法:

new Thread(new Runnable() {
    @Override
    public void run() {
      
            try {
              
                 //上传成功后接着上传到QQ邮箱中
                    EmailSender sender = new EmailSender();
                    //设置服务器地址和端口,网上搜的到
                    sender.setProperties("smtp.qq.com", "25");
                    //分别设置发件人,邮件标题和文本内容
                    sender.setMessage("自己的qq邮箱账号", "EmailSender", "Java Mail ");
                    //设置收件人
                    sender.setReceiver(new String[]{"自己的qq邮箱地址"});
                    //添加附件,就是获取的bug日志先保存到本地文件,然后获取文件的绝对路径
                    sender.addAttachment(filePath);
                 /**
                  *  发送邮件
                     *
                  * 重点来了!!!!!!
                     * password:此处应该填写我们第一步那里生成的授权码(我就是错在这里.......                     * 这里的授权码不是账号登录时候的密码,是为了第三方客户端登录用的授权码(也可以看做密码,但是不能跟账户密码相同)
                     * 参考:https://blog.csdn.net/th226/article/details/79052561
                  * QQ中的授权码需要登录QQ邮箱——设置——账户——POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务——开启服务
                     * 
                  */
                    sender.sendEmail("smtp.qq.com", "自己的qq邮箱地址", "授权码");
                    //sender.setMessage("你的163邮箱账号", "EmailS//ender", "Java Mail ");这里面两个邮箱账号要一致

                    //上传成功后清除本地文件和缓存数据
                    File file = new File(filePath);
                 file.delete();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    }
}).start();

这里面的授权码很重要,不是账号的密码,获取授权码的步骤:主要说QQ的

登录QQ邮箱——设置——账户——POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务——开启服务——将(POP3/SMTP服务 (如何使用 Foxmail 等软件收发邮件?))开启,开启的时候回提示有个授权码,这个授权码就是上面发送文件的时候要设置的,不然是无法连接QQ邮箱的,163邮箱的授权码获取也是同样的步骤



  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值