2014-01-13 3 views
0

나는 사용자 상호 작용없이 백그라운드에서 이메일을 보내는 안드로이드 응용 프로그램을 만들고 있습니다. 예를 들어 3 개의 .jar 파일을 다운로드했으며 매니페스트 파일에 권한을 추가했습니다. 인터넷. smtp와 Gmail을 사용하여 안드로이드에서 이메일을 보내는 방법

하지만 시스템 디스플레이 오류 누구도 날이 오류

를 해결하는 데 도움이 될 수 있습니다 자사의 전자 메일 응용 프로그램

로그 캣

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 : 응용 프로그램이 주 스레드에서 네트워킹 작업을 수행하려고 할 때 throw되는 예외입니다.

당신이 따라 간 자습서를 말하면 바로 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

관련 문제