首先这个邮件发送不是给用户来用的,因为我们技术人员有时候想知道用户使用我们的应用时候出现了什么错,其实就是个隐蔽发送,用户并不知情。我们在代码里配置了自己的邮箱帐号,错误信息就会发送到我们的邮箱。我们就可以根据发过来的错误信息 来改正自己的程序错误。跟用户反馈是不一样的。因为用户如果用着用着出现了“应用停止运行”他们肯定不会在用户反馈里面写停止运行的原因吧,所以,我们代码里面做一个 抓取错误log 的机制,然后 通过我们的"秘密发送程序"把错误信息发送到我们的邮箱,岂不是很好的提供了我们知道自己代码错误的位置以便我们即使修改。。。(没有测试人员的公司采用这样的方法很好哦)
看了OS 客户端错误报告邮件发送,觉得很不友好,当出现错误的时候,弹出发送报告的弹窗 之后
选择一个邮箱以后 又出现如下界面,接下来还有更多繁琐的设置
上面是使用android 自带 api邮件发送,大家都知道这个方法 ,到最后还会弹出一个系统页面,以后还需要手动发送,而且经测试 ,还要自己填写 接收者
Intent i = new Intent(Intent.ACTION_SEND); //i.setType("text/plain"); //模拟器 i.setType("message/rfc822"); // 真机 i.putExtra(Intent.EXTRA_EMAIL,new String[] { "[email protected]" }); i.putExtra(Intent.EXTRA_SUBJECT, "开源中国Android客户端 - 错误报告"); i.putExtra(Intent.EXTRA_TEXT, crashReport); cont.startActivity(Intent.createChooser(i, "发送错误报告"));
如果是客户端报错的话,那么我们就需要自动发送邮件。这样才比较友好。
所以 认为 通过javaMail 实现自动发邮件是再合适不过的了
下面是实现方法:
Onclick 里面方法换成如下:
//这里发送者邮箱,与接收者邮箱 可以写成一样的,一样的话,就是自己向自己发送邮件, //其实获取邮件的是我们,所以不管谁发送的,我们要的只是是内容 public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); try { MailSender ms = new MailSender("smtp.qq.com","邮箱","邮箱登陆密码",true); ms.sendMail("开源中国Android客户端 - 错误报告", crashReport, "发送者邮箱", "接收者邮箱"); } catch (Exception e) { e.printStackTrace(); } // 退出 // MyActivityManager.getScreenManager().AppExit(cont); MyActivityManager.getScreenManager().AppExceptionToHome(cont); }
下面两个类是实现类:
public class MailSender extends javax.mail.Authenticator { private String user; private String password; private Session session; static { Security.addProvider(new JsseProvider()); } /** * * @param mailhost 接收服务器:pop.exmail.qq.com(使用SSL,端口号995) 发送服务器:smtp.exmail.qq.com(使用SSL,端口号465) 这里只使用发送 * @param user 邮箱 * @param password 邮箱密码 * @param sslFlag 如果端口号是 465 的话 就设置 true */ public MailSender(String mailhost, String user, String password, boolean sslFlag) { this.user = user; this.password = password; Properties props = new Properties(); props.setProperty("mail.transport.protocol", "smtp"); props.setProperty("mail.host", mailhost); props.put("mail.smtp.auth", "true"); if (sslFlag) { props.put("mail.smtp.port", "465"); props.put("mail.smtp.socketFactory.port", "465"); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.socketFactory.fallback", "false"); } else { props.put("mail.smtp.port", "25"); } props.setProperty("mail.smtp.quitwait", "false"); session = Session.getDefaultInstance(props, this); } @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user, password); } /** * * @param subject 邮件标题 * @param body 邮件内容 * @param sender 发送者 * @param recipients 接收者 * @throws Exception */ public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception { MimeMessage message = new MimeMessage(session); DataHandler handler = new DataHandler(new ByteArrayDataSource( body.getBytes(), "text/plain")); message.setSender(new InternetAddress(sender)); message.setSubject(subject); message.setDataHandler(handler); message.setFrom(new InternetAddress(sender)); if (recipients.indexOf(',') > 0) message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients)); else message.setRecipient(Message.RecipientType.TO, new InternetAddress( recipients)); Transport.send(message); } public class ByteArrayDataSource implements DataSource { private byte[] data; private String type; public ByteArrayDataSource(byte[] data, String type) { super(); this.data = data; this.type = type; } public ByteArrayDataSource(byte[] data) { super(); this.data = data; } public void setType(String type) { this.type = type; } @Override public String getContentType() { if (type == null) return "application/octet-stream"; else return type; } @Override public InputStream getInputStream() throws IOException { return new ByteArrayInputStream(data); } @Override public String getName() { return "ByteArrayDataSource"; } @Override public OutputStream getOutputStream() throws IOException { throw new IOException("Not Supported"); } } }
public final class JsseProvider extends Provider { private static final long serialVersionUID = 1L; protected JsseProvider() { super("HarmonyJSSE", 1.0, "Harmony JSSE Provider"); AccessController.doPrivileged(new java.security.PrivilegedAction<Void>() { @Override public Void run() { put("SSLContext.TLS", "org.apache.harmony.xnet.provider.jsse.SSLContextImpl"); put("Alg.Alias.SSLContext.TLSv1", "TLS"); put("KeyManagerFactory.X509", "org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl"); put("TrustManagerFactory.X509", "org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl"); return null; } }); } }
javaMail 需要的三个jar包网上有很多,可以下载,这个例子也是整合了一下在别的地方学的,只是做了一下小改动,因为看了很多写的不怎么清除,或者有的人,没看明白,不知道从哪改。