powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Android [игнор отключен] [закрыт для гостей] / AndroidStudio - Java Mail API - скачать письмо
22 сообщений из 22, страница 1 из 1
AndroidStudio - Java Mail API - скачать письмо
    #39447265
Bryk_Alien
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Товарищи!
Помогите пожалуйста примером, как считать письмо с почтового ящика в AndroidStudio
Есть много информации для консоли, например: JavaMail API Проверка сообщений электронной почты
Попытавшись выполнить в AndroidStudio, я сначала ловил ошибку:
Код: plaintext
1.
2.
3.
java.lang.RuntimeException: 
Unable to start activity ComponentInfo
{ru.brykalien.startandroid.myapplication/ru.brykalien.startandroid.myapplication.MainActivity}: 
android.os.NetworkOnMainThreadException
Яндех посоветовал запускать в отдельном потоке, поэтому я обернул всё AsyncTask-ом

Код с AsyncTask
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
    public void funReadEmail() {
        RetreiveFeedTask task = new RetreiveFeedTask();
        task.execute();
    }


    private class RetreiveFeedTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {

            String IMAP_AUTH_EMAIL = USER_LOGIN + MAIL_DOMEN;
            String IMAP_AUTH_PWD = USER_PASS;
            String IMAP_Server = "imap.mail.ru";

            Properties properties = new Properties();
            properties.put("mail.debug", "false");
            properties.put("mail.store.protocol", "imaps");
            properties.put("mail.imap.ssl.enable", "true");
            properties.put("mail.imap.port", "993");

            Session session = Session.getDefaultInstance(properties, new Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(IMAP_AUTH_EMAIL, IMAP_AUTH_PWD );
                }
            });

            try {
                Store store = session.getStore();

                // Подключение к почтовому серверу
                store.connect(IMAP_Server, IMAP_AUTH_EMAIL, IMAP_AUTH_PWD);

                // Папка входящих сообщений
                Folder inbox = store.getFolder("INBOX");

                // Открываем папку в режиме только для чтения
                inbox.open(Folder.READ_ONLY);
                //debugAdd("Количество сообщений : " + String.valueOf(inbox.getMessageCount()));

                if (inbox.getMessageCount() == 0) {
                    return null;
                }

                Message[] messages = inbox.getMessages();
                String msgSbj = messages[1].getSubject();
                // ТУТ ОШИБКА!!!
                String msgTxt = messages[1].getContent().toString();
                /*
                // Последнее сообщение; первое сообщение под номером 1
                Message message = inbox.getMessage(inbox.getMessageCount());
                Multipart mp = (Multipart) message.getContent();
                // Вывод содержимого в консоль
                for (int i = 0; i < mp.getCount(); i++) {
                    BodyPart bp = mp.getBodyPart(i);
                    if (bp.getFileName() == null)
                        System.out.println("    " + i + ". сообщение : '" + bp.getContent() + "'");
                    else
                        System.out.println("    " + i + ". файл : '" + bp.getFileName() + "'");
                }
                */
            } catch (NoSuchProviderException e) {
                debugAdd("NoSuchProvider: " + e.getMessage().toString());
            } catch (MessagingException e) {
                debugAdd("MessagingException: " + e.getMessage().toString());
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            Toast.makeText(getApplicationContext(), "почта проверена", Toast.LENGTH_LONG).show();
        }
    }


Но всё равно ловлю ошибку при попытке получить messages[1].getContent()
Ошибка
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
05-02 12:11:02.698 1466-1493/ru.spline.brykalien.applogin E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
                                                                            Process: ru.spline.brykalien.applogin, PID: 1466
                                                                            java.lang.RuntimeException: An error occured while executing doInBackground()
                                                                                at android.os.AsyncTask$3.done(AsyncTask.java:304)
                                                                                at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
                                                                                at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
                                                                                at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                                at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                                                                                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                                                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                                                at java.lang.Thread.run(Thread.java:818)
                                                                             Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
                                                                                at javax.mail.internet.MimeUtility.quote(MimeUtility.java:910)
                                                                                at javax.mail.internet.ParameterList.quote(ParameterList.java:650)
                                                                                at javax.mail.internet.ParameterList.access$0(ParameterList.java:649)
                                                                                at javax.mail.internet.ParameterList$ToStringBuffer.addNV(ParameterList.java:618)
                                                                                at javax.mail.internet.ParameterList.toString(ParameterList.java:599)
                                                                                at javax.mail.internet.ContentType.toString(ContentType.java:220)
                                                                                at com.sun.mail.imap.IMAPMessage.getDataHandler(IMAPMessage.java:621)
                                                                                at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:1398)
                                                                                at ru.spline.brykalien.applogin.MainScreen$RetreiveFeedTask.doInBackground(MainScreen.java:146)
                                                                                at ru.spline.brykalien.applogin.MainScreen$RetreiveFeedTask.doInBackground(MainScreen.java:105)
                                                                                at android.os.AsyncTask$2.call(AsyncTask.java:292)
                                                                                at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                                at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                                                                                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                                                                                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                                                                                at java.lang.Thread.run(Thread.java:818) 

Посоветуйте что делать, вторые сутки сижу :(
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39447298
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bryk_Alien messages[1].getContent()
Первое сообщение по индексу 0, а не 1.
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39447307
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bryk_AlienЯндех посоветовал запускать в отдельном потоке, поэтому я обернул всё AsyncTask-ом
Все сетевые операции проверяют в каком потоке выполняются и если поток основной (UI), то вываливают ошибку.
Все тяжелые действия нужно выносить в отдельные потоки.
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39447326
Bryk_Alien
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman,

Да, я знаю что 0, просто проверял - осталось...
Ну AsyncTask - это же отдельный поток? )) Вот я в него и вывел...
Вываливается при попытке запросить messages[1].getContent()
Может, из AsyncTask-а можно каким-то образом вернуть массив писем Message[] ?
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39447436
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bryk_Alienвернуть массив писем
вернуть куда? На экран? В виджет?
Может сразу в БД записать и позже прочитаете в активити из БД.
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39447442
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bryk_AlienНу AsyncTask - это же отдельный поток?
Верно.
Bryk_AlienВываливается при попытке запросить messages[1].getContent()
Вываливается на том, что метод возвращает null и затем к нему идет обращение.
Что с null делать собрался?
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39447527
Bryk_Alien
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123вернуть куда? На экран? В виджет?
Может сразу в БД записать и позже прочитаете в активити из БД.Да, спасибо, в БД - было бы идеально
Сначала (для отладки) думал возвращать в какое-нибудь TextView заголовок и тело письма, но выяснил, что из отдельного потока это будет сделать проблематично :)

wadman ,
То есть, messages[1].getContent() == NULL а я к нему применяю метод .toString() который из-за этого и вылетает?
Переделал код следующим образом:
переделанный код AsyncTask
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
    private class RetreiveFeedTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {

            String IMAP_AUTH_EMAIL = USER_LOGIN + MAIL_DOMEN;
            String IMAP_AUTH_PWD = USER_PASS;
            String IMAP_Server = "imap.mail.ru";

            Properties properties = new Properties();
            properties.put("mail.debug", "false");
            properties.put("mail.store.protocol", "imaps");
            properties.put("mail.imap.ssl.enable", "true");
            properties.put("mail.imap.port", "993");

            Session session = Session.getDefaultInstance(properties, new Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(USER_LOGIN + MAIL_DOMEN, USER_PASS);
                }
            });

            try {
                Store store = session.getStore();

                // Подключение к почтовому серверу
                store.connect(IMAP_Server, IMAP_AUTH_EMAIL, IMAP_AUTH_PWD);
                // Папка входящих сообщений
                Folder inbox = store.getFolder("INBOX");
                // Открываем папку в режиме только для чтения
                inbox.open(Folder.READ_ONLY);

                int intLastMail = inbox.getMessageCount();

                Message[] messages = inbox.getMessages();
                Message message = messages[0];

                String msgSbj1 = messages[0].getSubject();
                String msgSbj2 = message.getSubject();

                Multipart mp1 = (Multipart) messages[0].getContent();
                Multipart mp2 = (Multipart) message.getContent();

                int unreadMessageCount = inbox.getUnreadMessageCount();

                /*
                // Вывод содержимого в консоль
                for (int i = 0; i < mp1.getCount(); i++) {
                    BodyPart bp = mp1.getBodyPart(i);
                    if (bp.getFileName() == null)
                        System.out.println("    " + i + ". сообщение : '" + bp.getContent() + "'");
                    else
                        System.out.println("    " + i + ". файл : '" + bp.getFileName() + "'");
                }
                */

            } catch (NoSuchProviderException e) {
                Log.e("MyErr", e.getMessage().toString(), e);
            } catch (MessagingException e) {
                Log.e("MyErr", e.getMessage().toString(), e);
            } catch (IOException e) {
                Log.e("MyErr", e.getMessage().toString(), e);
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            Toast.makeText(getApplicationContext(), "почта проверена", Toast.LENGTH_LONG).show();
        }
    }


При вызове .getContent() любым из способов
Код: plaintext
1.
                Multipart mp1 = (Multipart) messages[0].getContent();
                Multipart mp2 = (Multipart) message.getContent();
получаю ошибку
та же ошибка
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
05-02 17:52:25.193 7630-7693/ru.spline.brykalien.applogin E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
                                                                            Process: ru.spline.brykalien.applogin, PID: 7630
                                                                            java.lang.RuntimeException: An error occured while executing doInBackground()
                                                                                at android.os.AsyncTask$3.done(AsyncTask.java:304)
                                                                                at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
                                                                                at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
                                                                                at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                                at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                                                                                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                                                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                                                at java.lang.Thread.run(Thread.java:818)
                                                                             Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
                                                                                at javax.mail.internet.MimeUtility.quote(MimeUtility.java:910)
                                                                                at javax.mail.internet.ParameterList.quote(ParameterList.java:650)
                                                                                at javax.mail.internet.ParameterList.access$0(ParameterList.java:649)
                                                                                at javax.mail.internet.ParameterList$ToStringBuffer.addNV(ParameterList.java:618)
                                                                                at javax.mail.internet.ParameterList.toString(ParameterList.java:599)
                                                                                at javax.mail.internet.ContentType.toString(ContentType.java:220)
                                                                                at com.sun.mail.imap.IMAPMessage.getDataHandler(IMAPMessage.java:621)
                                                                                at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:1398)
                                                                                at ru.spline.brykalien.applogin.MainScreen$RetreiveFeedTask.doInBackground(MainScreen.java:157)
                                                                                at ru.spline.brykalien.applogin.MainScreen$RetreiveFeedTask.doInBackground(MainScreen.java:105)
                                                                                at android.os.AsyncTask$2.call(AsyncTask.java:292)
                                                                                at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                                at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                                                                                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                                                                                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                                                                                at java.lang.Thread.run(Thread.java:818) 

Получается ошибка где-то внутри методов JavaMail API?
Письмо-то есть...
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39447577
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bryk_AlienСначала (для отладки)
для отладки пиши Lod.debug("тра та та"
Это работает и из потоков.
Смотреть в AS в окошке логов.
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39447617
Bryk_Alien
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Докопал я до следующего:
Message.getContent() вызывает метод getContent() описанный в классе MimeMessage.class
MimeMessage.getContent()
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
    public Object getContent() throws IOException, MessagingException {
        if(this.cachedContent != null) {
            return this.cachedContent;
        } else {
            Object c;
            try {
                c = this.getDataHandler().getContent();
            } catch (FolderClosedIOException var3) {
                throw new FolderClosedException(var3.getFolder(), var3.getMessage());
            } catch (MessageRemovedIOException var4) {
                throw new MessageRemovedException(var4.getMessage());
            }

            if(MimeBodyPart.cacheMultipart && (c instanceof Multipart || c instanceof Message) && (this.content != null || this.contentStream != null)) {
                this.cachedContent = c;
            }

            return c;
        }
    }


В методе MimeMessage.getContent() происходит вызов другого метода: this.getDataHandler() , описанный в классе IMAPMessage.class
IMAPMessage.getDataHandler()
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    public synchronized DataHandler getDataHandler() throws MessagingException {
        this.checkExpunged();
        if(this.dh == null) {
            this.loadBODYSTRUCTURE();
            if(this.type == null) {
                ContentType ct = new ContentType(this.bs.type, this.bs.subtype, this.bs.cParams);
                this.type = ct.toString();
            }

            if(this.bs.isMulti()) {
                this.dh = new DataHandler(new IMAPMultipartDataSource(this, this.bs.bodies, this.sectionId, this));
            } else if(this.bs.isNested() && this.isREV1()) {
                this.dh = new DataHandler(new IMAPNestedMessage(this, this.bs.bodies[0], this.bs.envelope, this.sectionId == null?"1":this.sectionId + ".1"), this.type);
            }
        }

        return super.getDataHandler();
    }


getDataHandler() в том же классе вызывает this.loadBODYSTRUCTURE() :
IMAPMessage.loadBODYSTRUCTURE()
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    private synchronized void loadBODYSTRUCTURE() throws MessagingException {
        if(this.bs == null) {
            synchronized(this.getMessageCacheLock()) {
                try {
                    IMAPProtocol pex = this.getProtocol();
                    this.checkExpunged();
                    this.bs = pex.fetchBodyStructure(this.getSequenceNumber());
                } catch (ConnectionException var3) {
                    throw new FolderClosedException(this.folder, var3.getMessage());
                } catch (ProtocolException var4) {
                    this.forceCheckExpunged();
                    throw new MessagingException(var4.getMessage(), var4);
                }

                if(this.bs == null) {
                    this.forceCheckExpunged();
                    throw new MessagingException("Unable to load BODYSTRUCTURE");
                }
            }
        }
    }


В котором происходит инициализация переменной bs , имеющей тип BODYSTRUCTURE
Сам класс BODYSTRUCTURE имеет переменную "public ParameterList cParams ",
которая заполняется методом parseParameters
BODYSTRUCTURE.parseParameters
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
    private ParameterList parseParameters(Response r) throws ParsingException {
        r.skipSpaces();
        ParameterList list = null;
        byte b = r.readByte();
        if(b == 40) {
            list = new ParameterList();

            while(true) {
                String name = r.readString();
                if(parseDebug) {
                    System.out.println("DEBUG IMAP: parameter name " + name);
                }

                if(name == null) {
                    throw new ParsingException("BODYSTRUCTURE parse error: " + this.type + "/" + this.subtype + ": " + "null name in parameter list");
                }

                String value = r.readString();
                if(parseDebug) {
                    System.out.println("DEBUG IMAP: parameter value " + value);
                }

                list.set(name, value);
                if(r.readByte() == 41) {
                    list.set((String)null, "DONE");
                    break;
                }
            }
        } else {
            if(b != 78 && b != 110) {
                throw new ParsingException("Parameter list parse error");
            }

            if(parseDebug) {
                System.out.println("DEBUG IMAP: parameter list NIL");
            }

            r.skip(2);
        }

        return list;
    }


У меня parseParameters получает на вход набор символов:
Код: plaintext
1.
2.
3.
* 1 FETCH (BODYSTRUCTURE (
("text" "plain" ("charset" "utf-8") NIL NIL "base64" 24 0 NIL NIL NIL NIL)
("text" "html" ("charset" "utf-8") NIL NIL "base64" 72 0 NIL NIL NIL NIL) 
"alternative" ("boundary" NIL)))

Я разбил на строки, чтобы всем было удобнее читать.
Так вот, в моём случае парсинг проходит 3 раза, получая значения name и value:
1) name = "charset", value = "utf-8"
2) name = "charset", value = "utf-8"
3) name = "boundary", value = NULL

И вот в третьем случае, когда происходит list.set(name, value); и появляется эта ошибка:
Method threw 'java.lang.NullPointerException' exception. Cannot evaluate javax.mail.internet.ParameterList.toString()

Соответственно ошибка наследуется в getDataHandler(), когда происходит инициализация
Код: plaintext
ContentType ct = new ContentType(this.bs.type, this.bs.subtype, this.bs.cParams)

Ну и вываливается в конце концов в getDataHandler() в следующей строке на операции this.type = ct.toString();
ContentType.toString()
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    public String toString() {
        if(this.primaryType != null && this.subType != null) {
            StringBuffer sb = new StringBuffer();
            sb.append(this.primaryType).append('/').append(this.subType);
            if(this.list != null) {
                sb.append(this.list.toString(sb.length() + 14));
            }

            return sb.toString();
        } else {
            return null;
        }
    }

на строке sb.append(this.list.toString(sb.length() + 14));

И получаем многострадальную
Код: plaintext
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference

Я кончил.
Если у Вас будут идеи как это лечить, я с благодарностью готов их испытать
Хотя бы узнать, это ошибка в полученной информации о письме (см. FETCH BODYSTRUCTURE ) или глюки в самом JavaMail API и стоит подправить класс?
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39447620
Bryk_Alien
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скорее всего проблема в BODYSTRUCTURE, так как я всячески нахожу примеры, где рядом с "boundary" находится какое-то значение:

Код: plaintext
1.
2.
3.
BODYSTRUCTURE (
("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 10 1 NIL NIL NIL NIL)
("text" "html" ("charset" "utf-8") NIL NIL "7bit" 35 1 NIL NIL NIL NIL)
 "alternative" ("boundary" "001a113a6490bbcac5051c86cddc") NIL)

А у меня там NIL
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39447680
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bryk_Alienили глюки в самом JavaMail API и стоит подправить класс?
Как же у других-то работает и глюк до сих пор никто не заметил? :)

https://github.com/anistark/EmailReader/blob/master/src/com/stark/emailreader/EmailReaderActivity.java посмотри тут, например.
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39447788
Bryk_Alien
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman ,
проблема, как мне кажется, кроется в BODYSTRUCTURE
Проверяю почту на GMail:

Код: plaintext
1.
2.
3.
* 8 FETCH (BODYSTRUCTURE (
("TEXT" "PLAIN" ("CHARSET" "utf-8") NIL NIL "BASE64" 66 1 NIL NIL NIL)
("TEXT" "HTML" ("CHARSET" "utf-8") NIL NIL "BASE64" 120 2 NIL NIL NIL) 
"ALTERNATIVE" ("BOUNDARY" "--ALT--Am2u8n9ZbFnX8vDkjpVRN4zvtSXMpEjS1493798088") NIL NIL))

И никакой ошибки не происходит!

а с mail.ru:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
* 361 FETCH (BODYSTRUCTURE (
("text" "plain" ("charset" "utf-8") NIL NIL "quoted-printable" 746 0 NIL NIL NIL NIL)
("text" "html" ("charset" "utf-8") NIL NIL "quoted-printable" 38622 0 NIL NIL NIL NIL) 
"alternative" ("boundary" NIL)))
или
* 371 FETCH (BODYSTRUCTURE (
("text" "plain" ("charset" "utf-8") NIL NIL "7bit" 16 0 NIL NIL NIL NIL)
("text" "html" ("charset" "utf-8") NIL NIL "7bit" 37 0 NIL NIL NIL NIL) 
"alternative" ("boundary" NIL)))

И получаю ошибку при заполнении параметра ParameterList

------------------------
пример не заработал,
код смотрел, застрял на непонятном optionReader = new BufferedReader(new InputStreamReader(System.in));
с ходу не разобрался что это - в течении дня постараюсь вникнуть
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39447810
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bryk_Alienкод смотрел, застрял на непонятном optionReader = new BufferedReader(new InputStreamReader(System.in));
https://developer.android.com/reference/java/lang/System.html
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39448124
AndroidNeedHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оставил в Работе запрос, может кто внесёт изменения в mail.jar да я проверю.
А так, видимо, придётся создавать ящики на gmail.com , так как mail.ru часто возвращает в структуре письма параметр ("boundary" NIL)
А Javamail API от этого вылетает
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39448358
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndroidNeedHelpОставил в Работе запрос, может кто внесёт изменения в mail.jar да я проверю.
Там поглумятся (как показывает опыт) и все...

Вот, 100% работающий со всеми сервисами майлер, довольно известный https://github.com/k9mail/k-9/tree/master/k9mail-library/src/main/java/com/fsck/k9/mail
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39448365
AndroidNeedHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman,

Спасибо, большое!
Сейчас поставлю, отпишусь о результатах!
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39448824
AndroidNeedHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак, проблема решена.
Действительно, был глюк в Javamail API, который исправили в более поздних версиях. Я скачал 1.6.0-rc1
Выложу на всякий случай примеры для AndroidStudio:

В папку libs нужно закинуть файлы:
Код: plaintext
1.
2.
 activation.jar 
 additionnal.jar 
 mail.jar  (библиотека может иметь любое имя, например, " javax.mail-1.6.0-rc1.jar ")
Так же надо не забыть прописать их в build.gradle:
пример build.gradle
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.0"

    defaultConfig {
        applicationId "ru.brykalien.startandroid.checkingmails"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
    compile files('libs/activation.jar')
    compile files('libs/additionnal.jar')
    compile files('libs/javax.mail-1.6.0-rc1.jar')
}

Далее - пример layout и java
activity_main.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="ru.brykalien.startandroid.checkingmails.MainActivity">

    <Button
        android:id="@+id/btnGMailPOP3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="GMail POP3"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginLeft="8dp"
        app:layout_constraintLeft_toLeftOf="parent" />

    <Button
        android:id="@+id/btnMailRuPOP3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="Mail.Ru POP3"
        android:layout_marginLeft="8dp"
        app:layout_constraintTop_toBottomOf="@+id/btnGMailPOP3"
        app:layout_constraintLeft_toLeftOf="parent"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp" />

    <Button
        android:id="@+id/btnGMailIMAP"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="7dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="GMail IMAP"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btnMailRuIMAP"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="8dp"
        android:layout_marginTop="8dp"
        android:text="Mail.Ru IMAP"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btnGMailIMAP"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp" />

    <ScrollView
        android:layout_width="368dp"
        android:layout_height="match_parent"
        android:layout_marginBottom="0dp"
        android:layout_marginTop="128dp"
        android:scrollbarStyle="insideOverlay"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.195"
        tools:layout_editor_absoluteX="8dp">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="8dp"
            android:orientation="horizontal"
            app:layout_constraintTop_toBottomOf="@+id/btnMailRuIMAP"
            tools:layout_editor_absoluteX="8dp">

            <TextView
                android:id="@+id/textView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="8dp"
                android:layout_marginLeft="8dp"
                android:layout_marginStart="8dp"
                android:text="Hello World!"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent" />
        </LinearLayout>
    </ScrollView>

</android.support.constraint.ConstraintLayout>

MainActivity.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
package ru.brykalien.startandroid.checkingmails;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private TextView textView;
    private String sBtnPressed = "";
    public static String sReturnMailsInfo = "";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btnGMailPOP3 = (Button) findViewById(R.id.btnGMailPOP3);
        Button btnMailRuPOP3 = (Button) findViewById(R.id.btnMailRuPOP3);
        Button btnGMailIMAP = (Button) findViewById(R.id.btnGMailIMAP);
        Button btnMailRuIMAP = (Button) findViewById(R.id.btnMailRuIMAP);
        textView = (TextView) findViewById(R.id.textView);

        //CheckingMails.check(host, mailStoreType, username, password);

        btnGMailPOP3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Intent intent = new Intent(MainActivity.this, EmailsList.class);
                //startActivity(intent);
                //CheckingMails.check(host, mailStoreType, username, password);
                sBtnPressed = "btnGMailPOP3";
                sReturnMailsInfo = "";
                RetreiveFeedTask task = new RetreiveFeedTask();
                task.execute();
            }
        });


        btnMailRuPOP3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sBtnPressed = "btnMailRuPOP3";
                sReturnMailsInfo = "";
                RetreiveFeedTask task = new RetreiveFeedTask();
                task.execute();
            }
        });

        btnGMailIMAP.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sBtnPressed = "btnGMailIMAP";
                sReturnMailsInfo = "";
                RetreiveFeedTask task = new RetreiveFeedTask();
                task.execute();
            }
        });

        btnMailRuIMAP.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sBtnPressed = "btnMailRuIMAP";
                sReturnMailsInfo = "";
                RetreiveFeedTask task = new RetreiveFeedTask();
                task.execute();
            }
        });

    }


    private class RetreiveFeedTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {
            if (sBtnPressed == "btnGMailPOP3") {
                CheckingPop3.check("pop.gmail.com", "pop3", "login@gmail.com", "password");
            }
            if (sBtnPressed == "btnMailRuPOP3") {
                CheckingPop3.check("pop.mail.ru", "pop3s", "login@mail.ru", "password");
            }
            if (sBtnPressed == "btnGMailIMAP") {
                CheckingIMAP.check("imap.gmail.com", "imaps", "login@gmail.com", "password");
            }
            if (sBtnPressed == "btnMailRuIMAP") {
                CheckingIMAP.check("imap.mail.ru", "imaps", "login@mail.ru", "password");
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            Toast.makeText(getApplicationContext(), "почта проверена", Toast.LENGTH_LONG).show();
            textView.setText(sReturnMailsInfo);
        }
    }


}

CheckingPop3.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
package ru.brykalien.startandroid.checkingmails;

import android.util.Log;

import java.util.Properties;

import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;

public class CheckingPop3 {

    public static void check(String host, String storeType, String user, String password)
    {
        try {

            //create properties field
            Properties properties = new Properties();

            properties.put("mail.pop3.host", host);
            properties.put("mail.pop3.port", "995");
            properties.put("mail.pop3.starttls.enable", "true");
            Session emailSession = Session.getDefaultInstance(properties);

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

            store.connect(host, user, password);

            //create the folder object and open it
            Folder emailFolder = store.getFolder("INBOX");
            emailFolder.open(Folder.READ_ONLY);

            // retrieve the messages from the folder in an array and print it
            Message[] messages = emailFolder.getMessages();
            System.out.println("messages.length---" + messages.length);

            MainActivity.sReturnMailsInfo = "";

            for (int i = 0, n = messages.length; i < n; i++) {
                Message message = messages[i];
                System.out.println("---------------------------------");
                System.out.println("Email Number " + (i + 1));
                System.out.println("Subject: " + message.getSubject());
                System.out.println("From: " + message.getFrom()[0]);
                System.out.println("Text: " + message.getContent().toString());

                // Выводим на главный экран
                MainActivity.sReturnMailsInfo = MainActivity.sReturnMailsInfo + "---------------------------------\n";
                MainActivity.sReturnMailsInfo = MainActivity.sReturnMailsInfo + "Email Number " + (i + 1) + "\n";
                MainActivity.sReturnMailsInfo = MainActivity.sReturnMailsInfo + "Subject: " + message.getSubject() + "\n";
                MainActivity.sReturnMailsInfo = MainActivity.sReturnMailsInfo + "From: " + message.getFrom()[0] + "\n";
                MainActivity.sReturnMailsInfo = MainActivity.sReturnMailsInfo + "Text: " + message.getContent().toString() + "\n";
            }

            //close the store and folder objects
            emailFolder.close(false);
            store.close();

        } catch (NoSuchProviderException e) {
            Log.e("MyErr", "Ошибка в NoSuchProviderException.", e);
        } catch (MessagingException e) {
            Log.e("MyErr", "Ошибка в MessagingException.", e);
        } catch (Exception e) {
            Log.e("MyErr", "Неизвестная ошибка!!!", e);
        }
    }
}

CheckingIMAP.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
package ru.brykalien.startandroid.checkingmails;

import android.util.Log;

import java.util.Properties;

import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;

public class CheckingIMAP {

    public static void check(String host, String storeType, String user, String password)
    {
        try {

            //create properties field
            Properties properties = new Properties();

            properties.put("mail.imap.host", host);
            properties.put("mail.imap.port", "995");
            properties.put("mail.imap.starttls.enable", "true");
            Session emailSession = Session.getDefaultInstance(properties);

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

            store.connect(host, user, password);

            //create the folder object and open it
            Folder emailFolder = store.getFolder("INBOX");
            emailFolder.open(Folder.READ_ONLY);

            // retrieve the messages from the folder in an array and print it
            Message[] messages = emailFolder.getMessages();
            System.out.println("messages.length---" + messages.length);

            for (int i = 0, n = messages.length; i < n; i++) {
                Message message = messages[i];
                System.out.println("---------------------------------");
                System.out.println("Email Number " + (i + 1));
                System.out.println("Subject: " + message.getSubject());
                System.out.println("From: " + message.getFrom()[0]);
                System.out.println("Text: " + message.getContent().toString());
                // Выводим на главный экран
                MainActivity.sReturnMailsInfo = MainActivity.sReturnMailsInfo + "---------------------------------\n";
                MainActivity.sReturnMailsInfo = MainActivity.sReturnMailsInfo + "Email Number " + (i + 1) + "\n";
                MainActivity.sReturnMailsInfo = MainActivity.sReturnMailsInfo + "Subject: " + message.getSubject() + "\n";
                MainActivity.sReturnMailsInfo = MainActivity.sReturnMailsInfo + "From: " + message.getFrom()[0] + "\n";
                MainActivity.sReturnMailsInfo = MainActivity.sReturnMailsInfo + "Text: " + message.getContent().toString() + "\n";

            }

            //close the store and folder objects
            emailFolder.close(false);
            store.close();

        } catch (NoSuchProviderException e) {
            Log.e("MyErr", "Ошибка в NoSuchProviderException.", e);
        } catch (MessagingException e) {
            Log.e("MyErr", "Ошибка в MessagingException.", e);
        } catch (Exception e) {
            Log.e("MyErr", "Неизвестная ошибка!!!", e);
        }
    }


}

...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39448908
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndroidNeedHelpТак же надо не забыть прописать их в build.gradle:
он разве сам не качает, если строчки прописать?
Т.е. никаких jar файлов искать не надо.
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39449119
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndroidNeedHelpДействительно, был глюк в Javamail API, который исправили в более поздних версиях. Я скачал 1.6.0-rc1
Выложу на всякий случай примеры для AndroidStudio:
Дак тебе стоит почитать про gradle и как в нем подключать.
При подключении как раз указывается версия, которая автоматом подхватывается.
Можно указать и "выше такой-то" версии.
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39449121
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndroidNeedHelp
Код: java
1.
2.
3.
4.
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile files('libs/activation.jar')
    compile files('libs/additionnal.jar')
    compile files('libs/javax.mail-1.6.0-rc1.jar')


Эта одна строка включает три нижние.
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39449200
AndroidNeedHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman,

Спасибо, я не знал :)
...
Рейтинг: 0 / 0
AndroidStudio - Java Mail API - скачать письмо
    #39449217
AndroidNeedHelp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я оставлю для случайного посетителя ещё и следующую информацию:

Если не получается получить тело письма конструкцией
Код: java
1.
2.
3.
4.
5.
Message[] messages = emailFolder.getMessages();
Message message = messages[i];
String sText = (String) message.getContent();
//или
Multipart mp = (Multipart) message.getContent();

а вместо этого Вы получаете ошибку:
Код: plaintext
1.
2.
com.sun.mail.imap.IMAPInputStream cannot be cast to javax.mail.Multipart
или
javax.mail.util.SharedByteArrayInputStream cannot be cast to javax.mail.Multipart
Это значит, что нужно обновить activation.jar , например, отсюда: android-activation-1.6.0-rc1.jar
Описание ошибки нашёл тут :
авторQ: When reading a multipart message, why is the getContent method returning an IMAPInputStream (or SharedByteArrayInputStream) instead of a MimeMultipart object?
A: This usually happens because the JavaBeans Activation Framework (JAF) can't find the mailcap configuration file included in the mail.jar file. JAF uses the thread's context class loader to look for the configuration file. If the context class loader is not set properly, this can fail. Most application servers should set the context class loader properly, but at least some versions of Tomcat do not. One workaround is to put the mail.jar file in Tomcat's lib directory instead of including it in the war file. Another workaround is to add code such as the following to the beginning of your application:
> Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
And of course you should always make sure the message you're dealing with is a multipart message before calling the getContent method, using something like
> if (msg.isMimeType("multipart/*"))
as described above and in this example.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Android [игнор отключен] [закрыт для гостей] / AndroidStudio - Java Mail API - скачать письмо
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]