2014-01-13 65 views
0

我正在創建android應用程序,在後臺發送電子郵件而無需用戶交互我已經下載了三個.jar文件,如示例所述並將其添加到清單文件的權限互聯網 。使用smtp和Gmail在Android上發送電子郵件如何使其工作

,但系統顯示錯誤誰能幫助我解決這個錯誤

了我的第一次處理的電子郵件應用程序

logcat的

01-13 23:05:20.028: E/MailApp(4357): Could not send email 
01-13 23:05:20.028: E/MailApp(4357): android.os.NetworkOnMainThreadException 
01-13 23:05:20.028: E/MailApp(4357): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133) 
01-13 23:05:20.028: E/MailApp(4357): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
01-13 23:05:20.028: E/MailApp(4357): at java.net.InetAddress.getLocalHost(InetAddress.java:365) 
01-13 23:05:20.028: E/MailApp(4357): at javax.mail.internet.InternetAddress.getLocalAddress(InternetAddress.java:517) 
01-13 23:05:20.028: E/MailApp(4357): at javax.mail.internet.UniqueValue.getUniqueMessageIDValue(UniqueValue.java:99) 
01-13 23:05:20.028: E/MailApp(4357): at javax.mail.internet.MimeMessage.updateMessageID(MimeMessage.java:2054) 
01-13 23:05:20.028: E/MailApp(4357): at javax.mail.internet.MimeMessage.updateHeaders(MimeMessage.java:2076) 
01-13 23:05:20.028: E/MailApp(4357): at javax.mail.internet.MimeMessage.saveChanges(MimeMessage.java:2042) 
01-13 23:05:20.028: E/MailApp(4357): at javax.mail.Transport.send(Transport.java:117) 
01-13 23:05:20.028: E/MailApp(4357): at com.devleb.emaildemoinbackground.GMailSender.send(GMailSender.java:105) 
01-13 23:05:20.028: E/MailApp(4357): at com.devleb.emaildemoinbackground.MainActivity$1.onClick(MainActivity.java:36) 
01-13 23:05:20.028: E/MailApp(4357): at android.view.View.performClick(View.java:4240) 
01-13 23:05:20.028: E/MailApp(4357): at android.view.View$PerformClick.run(View.java:17721) 
01-13 23:05:20.028: E/MailApp(4357): at android.os.Handler.handleCallback(Handler.java:730) 
01-13 23:05:20.028: E/MailApp(4357): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-13 23:05:20.028: E/MailApp(4357): at android.os.Looper.loop(Looper.java:137) 
01-13 23:05:20.028: E/MailApp(4357): at android.app.ActivityThread.main(ActivityThread.java:5103) 
01-13 23:05:20.028: E/MailApp(4357): at java.lang.reflect.Method.invokeNative(Native Method) 
01-13 23:05:20.028: E/MailApp(4357): at java.lang.reflect.Method.invoke(Method.java:525) 
01-13 23:05:20.028: E/MailApp(4357): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
01-13 23:05:20.028: E/MailApp(4357): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
01-13 23:05:20.028: E/MailApp(4357): at dalvik.system.NativeStart.main(Native Method) 

MainActivity.java

package com.devleb.emaildemoinbackground; 


import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.Window; 
import android.widget.Button; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

    @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      requestWindowFeature(Window.FEATURE_NO_TITLE); 
      setContentView(R.layout.activity_main); 

      Button addImage = (Button) findViewById(R.id.btn); 
      addImage.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View view) { 


        GMailSender mailsender = new GMailSender("[email protected]", "........."); 

        String[] toArr = { "[email protected]"}; 
        mailsender.set_to(toArr); 
        mailsender.set_from("[email protected]"); 
        mailsender.set_subject("This is an email sent using my Mail JavaMail wrapper from an Android device."); 
        mailsender.setBody("Email body."); 

        try { 
         //mailsender.addAttachment("/sdcard/filelocation"); 

         if (mailsender.send()) { 
          Toast.makeText(MainActivity.this, 
            "Email was sent successfully.", 
            Toast.LENGTH_LONG).show(); 
         } else { 
          Toast.makeText(MainActivity.this, "Email was not sent.", 
            Toast.LENGTH_LONG).show(); 
         } 
        } catch (Exception e) { 

         Log.e("MailApp", "Could not send email", e); 
        } 
       } 
      }); 

     } 
    } 

GmailSender.java

package com.devleb.emaildemoinbackground; 



import java.util.Date; 
import java.util.Properties; 

import javax.activation.CommandMap; 
import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.activation.FileDataSource; 
import javax.activation.MailcapCommandMap; 
import javax.mail.BodyPart; 
import javax.mail.Multipart; 
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; 

public class GMailSender extends javax.mail.Authenticator { 
    private String _user; 
     private String _pass; 

     private String[] _to; 
     private String _from; 

     private String _port; 
     private String _sport; 

     private String _host; 

     private String _subject; 
     private String _body; 

     private boolean _auth; 

     private boolean _debuggable; 

     private Multipart _multipart; 


     public GMailSender() { 
     _host = "smtp.gmail.com"; // default smtp server 
     _port = "465"; // default smtp port 
     _sport = "465"; // default socketfactory port 

     _user = "[email protected]"; // username 
     _pass = "..........."; // password 
     _from = "[email protected]"; // email sent from 
     _subject = ""; // email subject 
     _body = "test email message sended!!"; // email body 

     _debuggable = false; // debug mode on or off - default off 
     _auth = true; // smtp authentication - default on 

     _multipart = new MimeMultipart(); 

     // There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added. 
     MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
     mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); 
     mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
     mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); 
     mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 
     mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); 
     CommandMap.setDefaultCommandMap(mc); 
     } 

     public GMailSender(String user, String pass) { 
     this(); 

     _user = user; 
     _pass = pass; 
     } 

     public boolean send() throws Exception { 
     Properties props = _setProperties(); 

     if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { 
      Session session = Session.getInstance(props, this); 

      MimeMessage msg = new MimeMessage(session); 

      msg.setFrom(new InternetAddress(_from)); 

      InternetAddress[] addressTo = new InternetAddress[_to.length]; 
      for (int i = 0; i < _to.length; i++) { 
      addressTo[i] = new InternetAddress(_to[i]); 
      } 
      msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 

      msg.setSubject(_subject); 
      msg.setSentDate(new Date()); 

      // setup message body 
      BodyPart messageBodyPart = new MimeBodyPart(); 
      messageBodyPart.setText(_body); 
      _multipart.addBodyPart(messageBodyPart); 

      // Put parts in message 
      msg.setContent(_multipart); 

      // send email 
      Transport.send(msg); 

      return true; 
     } else { 
      return false; 
     } 
     } 

     public void addAttachment(String filename) throws Exception { 
     BodyPart messageBodyPart = new MimeBodyPart(); 
     DataSource source = new FileDataSource(filename); 
     messageBodyPart.setDataHandler(new DataHandler(source)); 
     messageBodyPart.setFileName(filename); 

     _multipart.addBodyPart(messageBodyPart); 
     } 

     @Override 
     public javax.mail.PasswordAuthentication getPasswordAuthentication() { 
     return new javax.mail.PasswordAuthentication(_user,_pass); 
     } 

     private Properties _setProperties() { 
     Properties props = new Properties(); 

     props.put("mail.smtp.host", _host); 

     if(_debuggable) { 
      props.put("mail.debug", "true"); 
     } 

     if(_auth) { 
      props.put("mail.smtp.auth", "true"); 
     } 

     props.put("mail.smtp.port", _port); 
     props.put("mail.smtp.socketFactory.port", _sport); 
     props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
     props.put("mail.smtp.socketFactory.fallback", "false"); 

     return props; 
     } 

     // the getters and setters 
     public String getBody() { 
     return _body; 
     } 

     public void setBody(String _body) { 
     this._body = _body; 
     } 

    public String[] get_to() { 
     return _to; 
    } 

    public void set_to(String[] _to) { 
     this._to = _to; 
    } 

    public String get_from() { 
     return _from; 
    } 

    public void set_from(String _from) { 
     this._from = _from; 
    } 

    public String get_subject() { 
     return _subject; 
    } 

    public void set_subject(String _subject) { 
     this._subject = _subject; 
    } 

    } 

回答

0

NetworkOnMainThreadException:應用程序嘗試在其主線程上執行聯網操作時引發的異常。

簡單地說,你所遵循的教程是相當日期appears to be from 2010。要麼找到一個教程,它使用異步發送電子郵件或自己修改代碼,以便它使用異步。異步已經在很久以前推出了,因此所有涉及網絡的事情都必須使用它來實現。

here is link that illustrates how to use asynctask

NetworkOnMainThreadException Reference Post

Possible Answer Post
Sending Email Tutorial August 2013

相關問題