在Android

时间:2015-06-23 06:45:16

标签: android javamail

我最近开始上大学的第一个应用程序,作为我的应用程序的一部分,我需要做一个自定义的电子邮件客户端。这意味着有一个登录活动,用户可以输入他/她的gmail地址和密码来连接到该帐户。 (安全风险在这里并不重要,这个应用程序不会上传到商店,“只在内部”使用)。

连接之后,我们将进入下一个活动,用户可以选择发送新电子邮件,获取收件箱邮件或获取已发送邮件。(之后的另外3项活动)所有这些功能都有如何执行这些功能的指南(在stackoverflow,tutorialspoint等,虽然其中很多不是专门用于Android或不使用AsyncTask),我知道我检查了很多,但所有这些都假设我们想要这些来自我们提供地址和密码的活动。我的第一个目标是只连接到用户的帐户,我似乎无法实现它。到目前为止,我做到了这一点:

Email_LoginActivity.java

public boolean isOnline() {
    ConnectivityManager cm =
            (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    return netInfo != null && netInfo.isConnected();
}


public void connectToTheServer() {
    if (isOnline()) {
        if (usernameInput.getText().toString().isEmpty() || passwordInput.getText().toString().isEmpty())
            Toast.makeText(this, "Enter both username and password!", Toast.LENGTH_LONG).show();
        else {

            class LoginToEmailAccount extends AsyncTask<String, Integer, String> {
//I made this class here so I can get a dialogbox to the activity until the user waits.
                ProgressDialog progress;
                private Folder inbox;
                private Folder sent;
                public static final String INBOX_STRING = "INBOX";
                public static final String SENT_ITEMS_STRING = "MMS_Sent";

                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                    progress = ProgressDialog.show(Email_LoginActivity.this, null, "Login in progress, please wait.", true);
                }

                @Override
                protected String doInBackground(String... args) {

                    final String username = args[0];
                    final String password = args[1];

                    String host = "pop.gmail.com";

                    Properties properties = new Properties();
                    properties.put("mail.pop3s.host", host);
                    properties.put("mail.pop3s.port", "995");
                    properties.put("mail.pop3s.starttls.enable", "true");

                    // Setup authentication, get session
                    Session emailSession = Session.getInstance(properties,
                            new javax.mail.Authenticator() {
                                protected PasswordAuthentication getPasswordAuthentication() {
                                    return new PasswordAuthentication(
                                            username, password);
                                }
                            });

                    try {

                        // create the POP3 store object and connect with the pop server
                        Store store = emailSession.getStore("pop3s");
                        store.connect();

                        //should i create the folders here too?
                        inbox = store.getFolder(INBOX_STRING);
                        sent = store.getFolder(SENT_ITEMS_STRING);

                        //create
                        inbox.create(Folder.HOLDS_MESSAGES);
                        sent.create(Folder.HOLDS_MESSAGES);


                        // open folders
                        inbox.open(Folder.READ_WRITE);
                        sent.open(Folder.READ_WRITE);

                        if(store.isConnected()){
                            Log.i("mytag", "connected");
                        }
                        else{
                            Log.i("mytag", "not connected)");
                        }

                    } catch (NoSuchProviderException e) {
                        e.printStackTrace();
                    } catch (MessagingException e) {
                        e.printStackTrace();
                        Log.i("mytag", "sad times");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }


                    return "Login complete";

                }

                @Override
                protected void onPostExecute(String result) {
                    super.onPostExecute(result);
                    progress.dismiss();
                }


            }
            new LoginToEmailAccount().execute(usernameInput.getText().toString(), passwordInput.getText().toString());
        }

    } else {
        Toast.makeText(this, "Please make sure you have internet connection!", Toast.LENGTH_LONG).show();
    }
}

public void startEmailMainActivity(View view) {
    connectToTheServer(); //here we need a condition to check if the connection was successful before calling the next activity
    Intent intent = new Intent(this, Email_MainActivity.class); //probably gonna need some extra intent info too
    startActivity(intent);
}

(usernameInput和passwordInput是用户向我们提供信息的2 EditText视图,在onCreate中声明)

AndroidManifest.xml有以下

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

我检查了调试模式,并在sent.open(Folder.READ_WRITE)之后收到MessagingException;线。我的主要想法是关注this guide只是为了连接到帐户。顺便进行测试我使this guide在AsyncTask的帮助下工作,它只是有同样的问题,我想在不同的活动上发送电子邮件部分,我不需要提供用户名和密码试。

我应该做些什么?对不起,如果问题太广泛,我们非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

请确保在帐户设置中启用了POP3访问权限。 登录您的帐户并启用POP3。 您还需要启用&#34;安全性较低的应用程序&#34; Gmail设置中的(第三方应用)。