首先这个邮件发送不是给用户来用的,由于咱们技术人员有时候想知道用户使用咱们的应用时候出现了什么错,其实就是个隐蔽发送,用户并不知情。咱们在代码里配置了本身的邮箱账号,错误信息就会发送到咱们的邮箱。咱们就能够根据发过来的错误信息 来改正本身的程序错误。跟用户反馈是不同的。由于用户若是用着用着出现了“应用中止运行”他们确定不会在用户反馈里面写中止运行的缘由吧,因此,咱们代码里面作一个 抓取错误log 的机制,而后 经过咱们的"秘密发送程序"把错误信息发送到咱们的邮箱,岂不是很好的提供了咱们知道本身代码错误的位置以便咱们即便修改。。。(没有测试人员的公司采用这样的方法很好哦)java
看了OS 客户端错误报告邮件发送,以为很不友好,当出现错误的时候,弹出发送报告的弹窗 以后android
选择一个邮箱之后 又出现以下界面,接下来还有更多繁琐的设置apache
上面是使用android 自带 api邮件发送,你们都知道这个方法 ,到最后还会弹出一个系统页面,之后还须要手动发送,并且经测试 ,还要本身填写 接收者api
Intent i = new Intent(Intent.ACTION_SEND); //i.setType("text/plain"); //模拟器 i.setType("message/rfc822"); // 真机 i.putExtra(Intent.EXTRA_EMAIL,new String[] { "1243822155@qq.com" }); i.putExtra(Intent.EXTRA_SUBJECT, "开源中国Android客户端 - 错误报告"); i.putExtra(Intent.EXTRA_TEXT, crashReport); cont.startActivity(Intent.createChooser(i, "发送错误报告"));
若是是客户端报错的话,那么咱们就须要自动发送邮件。这样才比较友好。服务器
因此 认为 经过javaMail 实现自动发邮件是再合适不过的了session
下面是实现方法:app
Onclick 里面方法换成以下:
socket
//这里发送者邮箱,与接收者邮箱 能够写成同样的,同样的话,就是本身向本身发送邮件, //其实获取邮件的是咱们,因此无论谁发送的,咱们要的只是是内容 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); }
下面两个类是实现类:ide
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包网上有不少,能够下载,这个例子也是整合了一下在别的地方学的,只是作了一下小改动,由于看了不少写的不怎么清除,或者有的人,没看明白,不知道从哪改。测试