Java 在后台发送电子邮件-Android

Java 在后台发送电子邮件-Android,java,android,email,Java,Android,Email,我有这段代码,两个简单的类:一个邮件发送者和一个只有一个按钮的主要Android活动。这是活动代码: package com.py.spycam; import javax.mail.MessagingException; import javax.mail.NoSuchProviderException; import javax.mail.internet.AddressException; import android.app.Activity; import android.os.Bu

我有这段代码,两个简单的类:一个邮件发送者和一个只有一个按钮的主要Android活动。这是活动代码:

package com.py.spycam;

import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.internet.AddressException;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public void onClickMail(View v) {
        String[] to = {"toaddress"};
        SMTPMail mail = new SMTPMail("user", "pass");
        try {
            mail.send("sender", to, "prova", "prova bpdy");
            Toast.makeText(this, "Mail sent", Toast.LENGTH_SHORT).show();
        } catch (NoSuchProviderException e) {
            Toast.makeText(this, "Unable to send email (NoSuchProviderException)", Toast.LENGTH_SHORT).show();
        } catch (AddressException e) {
            Toast.makeText(this, "Unable to send email (AddressException)", Toast.LENGTH_SHORT).show();
        } catch (MessagingException e) {
            Toast.makeText(this, "Unable to send email (MessagingException)", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            Toast.makeText(this, "Unable to send email (general Exception)", Toast.LENGTH_SHORT).show();
        }

    }

}
这是邮件发送者:

package com.py.spycam;

import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SMTPMail {
    private String host;
    private String from;
    private String pass;
    private Properties props;

    public SMTPMail(String _user, String _pass) {
        host = "smtp.gmail.com";
        from = _user;
        pass = _pass;
        props = System.getProperties();

        /* Props settings */
        props.put("mail.smtp.starttls.enable", "true"); // added this line
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.user", from);
        props.put("mail.smtp.password", pass);
        props.put("mail.smtp.port", "587");
        props.put("mail.smtp.auth", "true");
    }

    public void send(String from, String[] to, String subject, String body)
            throws AddressException, MessagingException, NoSuchProviderException {
            //throws AddressException, MessagingException {

        Session session = Session.getDefaultInstance(props, null);
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));

        InternetAddress[] toAddress = new InternetAddress[to.length];

        // To get the array of addresses
        for(int i=0; i < to.length; i++ ) { // changed from a while loop
            toAddress[i] = new InternetAddress(to[i]);
        }

        for(int i=0; i < toAddress.length; i++) { // changed from a while loop
            message.addRecipient(Message.RecipientType.TO, toAddress[i]);
        }
        message.setSubject(subject);
        message.setText(body);
        Transport transport = session.getTransport("smtp");
        transport.connect(host, from, pass);
        transport.sendMessage(message, message.getAllRecipients());
        transport.close();
    }


}
非常基本

android线程模型有两条规则

1) 不要阻塞主线程。 2) 不要从另一个线程操作主(“UI”)线程

您通过对主线程进行网络调用来阻塞主线程,违反了其中的第一条。将发送邮件移动到其他线程。考虑一个简单的线程或一个

另外,请参阅开发人员文档中关于

另外,请注意,您当前似乎已启用,这是一件好事。这会检测到您“不应该做的事情”,例如在主线程上进行网络调用,如果这样做,会抛出异常

非常基本

android线程模型有两条规则

1) 不要阻塞主线程。 2) 不要从另一个线程操作主(“UI”)线程

您通过对主线程进行网络调用来阻塞主线程,违反了其中的第一条。将发送邮件移动到其他线程。考虑一个简单的线程或一个

另外,请参阅开发人员文档中关于


另外,请注意,您当前似乎已启用,这是一件好事。这会检测到您“不应该做的事情”,例如在主线程上进行网络调用,如果这样做,会抛出异常

请显示完整的错误堆栈跟踪这是我仍在努力解决的另一个问题。。。哪里应该是错误堆栈跟踪?我知道我现在忙得不可开交了,它被称为LogCat,应该是Eclipse中的一个视图,或者可以通过终端中的
adb LogCat
访问。您正在捕获所有异常,而不是记录它们。不使用Toast(或者另外使用Log)来输出异常(或者只使用e.printStackTrace()来快速而不整洁地查看)。此外,这里还有一个示例,说明您正在尝试执行的操作(尽管此代码也有一些问题,比如使用UI线程发送电子邮件):我尝试按照@charlictollins发布的链接中的说明进行操作,但没有成功。我将在稍后添加带有LogCat输出的注释。请显示完整的错误堆栈跟踪这是我仍在尝试解决的另一个问题。。。哪里应该是错误堆栈跟踪?我知道我现在忙得不可开交了,它被称为LogCat,应该是Eclipse中的一个视图,或者可以通过终端中的
adb LogCat
访问。您正在捕获所有异常,而不是记录它们。不使用Toast(或者另外使用Log)来输出异常(或者只使用e.printStackTrace()来快速而不整洁地查看)。此外,这里还有一个示例,说明您正在尝试执行的操作(尽管此代码也有一些问题,比如使用UI线程发送电子邮件):我尝试按照@charlictollins发布的链接中的说明进行操作,但没有成功。稍后,我将添加一条带有LogCat输出的注释。
01-17 01:41:41.550: W/System.err(23420): android.os.NetworkOnMainThreadException
01-17 01:41:41.550: W/System.err(23420):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
01-17 01:41:41.555: W/System.err(23420):    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
01-17 01:41:41.555: W/System.err(23420):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
01-17 01:41:41.555: W/System.err(23420):    at java.net.InetAddress.getByName(InetAddress.java:289)
01-17 01:41:41.555: W/System.err(23420):    at java.net.InetSocketAddress.<init>(InetSocketAddress.java:105)
01-17 01:41:41.555: W/System.err(23420):    at java.net.InetSocketAddress.<init>(InetSocketAddress.java:90)
01-17 01:41:41.555: W/System.err(23420):    at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:233)
01-17 01:41:41.555: W/System.err(23420):    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:189)
01-17 01:41:41.555: W/System.err(23420):    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1359)
01-17 01:41:41.555: W/System.err(23420):    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:412)
01-17 01:41:41.555: W/System.err(23420):    at javax.mail.Service.connect(Service.java:288)
01-17 01:41:41.560: W/System.err(23420):    at javax.mail.Service.connect(Service.java:169)
01-17 01:41:41.560: W/System.err(23420):    at com.py.spycam.SMTPMail.send(SMTPMail.java:55)
01-17 01:41:41.560: W/System.err(23420):    at com.py.spycam.MainActivity.onClickMail(MainActivity.java:29)
01-17 01:41:41.560: W/System.err(23420):    at java.lang.reflect.Method.invokeNative(Native Method)
01-17 01:41:41.560: W/System.err(23420):    at java.lang.reflect.Method.invoke(Method.java:511)
01-17 01:41:41.560: W/System.err(23420):    at android.view.View$1.onClick(View.java:3586)
01-17 01:41:41.560: W/System.err(23420):    at android.view.View.performClick(View.java:4084)
01-17 01:41:41.560: W/System.err(23420):    at android.view.View$PerformClick.run(View.java:16966)
01-17 01:41:41.560: W/System.err(23420):    at android.os.Handler.handleCallback(Handler.java:615)
01-17 01:41:41.560: W/System.err(23420):    at android.os.Handler.dispatchMessage(Handler.java:92)
01-17 01:41:41.565: W/System.err(23420):    at android.os.Looper.loop(Looper.java:137)
01-17 01:41:41.565: W/System.err(23420):    at android.app.ActivityThread.main(ActivityThread.java:4931)
01-17 01:41:41.565: W/System.err(23420):    at java.lang.reflect.Method.invokeNative(Native Method)
01-17 01:41:41.565: W/System.err(23420):    at java.lang.reflect.Method.invoke(Method.java:511)
01-17 01:41:41.565: W/System.err(23420):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
01-17 01:41:41.565: W/System.err(23420):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
01-17 01:41:41.565: W/System.err(23420):    at dalvik.system.NativeStart.main(Native Method)