os客戶端 錯誤報告發送

首先這個郵件發送不是給用戶來用的,由於咱們技術人員有時候想知道用戶使用咱們的應用時候出現了什麼錯,其實就是個隱蔽發送,用戶並不知情。咱們在代碼裏配置了本身的郵箱賬號,錯誤信息就會發送到咱們的郵箱。咱們就能夠根據發過來的錯誤信息 來改正本身的程序錯誤。跟用戶反饋是不同的。由於用戶若是用着用着出現了「應用中止運行」他們確定不會在用戶反饋裏面寫中止運行的緣由吧,因此,咱們代碼裏面作一個 抓取錯誤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包網上有不少,能夠下載,這個例子也是整合了一下在別的地方學的,只是作了一下小改動,由於看了不少寫的不怎麼清除,或者有的人,沒看明白,不知道從哪改。測試

相關文章
相關標籤/搜索