Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Чтение почты из Oracle через Java Mail API / 20 сообщений из 20, страница 1 из 1
28.09.2016, 18:02
    #39317224
bajys
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
Доброго времени суток! Столкнулась с такой проблемой, необходимо прочитать почту средствами Oracle.
Написала Java class, в котором подключаюсь к почтовому серверу imapmail - zimbra через протокол imap и протокол защищенного соединения starttls, порт 143. В Oracle вызываю процедуру соединения с сервером из данного класса. Выходит данная ошибка.

DEBUG: getProvider() returning javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc]
connecting...
* OK IMAP4rev1 proxy server ready
A0 CAPABILITY
* CAPABILITY ACL BINARY CATENATE CHILDREN CONDSTORE ENABLE ESEARCH ESORT I18NLEVEL=1 ID IDLE IMAP4rev1 LIST-EXTENDED LIST-STATUS LITERAL+ MULTIAPPEND NAMESPACE QRESYNC QUOTA RIGHTS=ektx SASL-IR SEARCHRES SORT THREAD=ORDEREDSUBJECT UIDPLUS UNSELECT WITHIN XLIST STARTTLS LOGINDISABLED
A0 OK completed
A1 LOGIN exchangeadmin exchangeadmin1123132
NO cleartext logins disabled
A1 BAD invalid command
javax.mail.AuthenticationFailedException: invalid command
at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:293)
at javax.mail.Service.connect(Service.java:234)
at MailHandlerImpl.connectToServerSSL(MailHandler:71)

Пыталась подключиться к imapmail той же процедурой к порту 993 через протокол imap и ssl, выдает следующую ошибку:
DEBUG: getProvider() returning javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc]
connecting...
javax.mail.MessagingException: null;
nested exception is:
java.io.IOException
at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:298)
at javax.mail.Service.connect(Service.java:234)
at MailHandlerImpl.connectToServerSSL(MailHandler:71)

Кто-нибудь сталкивался с такой проблемой? Есть варианты решения ее???
...
Рейтинг: 0 / 0
28.09.2016, 18:55
    #39317258
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
...
Рейтинг: 0 / 0
28.09.2016, 19:03
    #39317263
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
Basil A. Sidorov JavaMail IMAP Summary .

так в javamail баг:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
   The current IMAP protocol specification (RFC 2060) requires the
   implementation of the LOGIN command which uses clear-text passwords.
   Many sites may choose to disable this command unless encryption is
   active for security reasons.  An IMAP server MAY advertise that the
   LOGIN command is disabled by including the LOGINDISABLED capability
   in the capability response.  Such a server will respond with a tagged
   "NO" response to any attempt to use the LOGIN command.

   An IMAP server which implements STARTTLS MUST implement support for
   the LOGINDISABLED capability on unencrypted connections.

   An IMAP client which complies with this specification MUST NOT issue 
   the LOGIN command if this capability is present. 
...
Рейтинг: 0 / 0
28.09.2016, 19:42
    #39317288
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
Запрет использования LOGIN - обязанность клиента , а не библиотеки .
Библиотека упрощает написание клиента , но не более того.
Лень делать клиента самому - разбирайтесь с Apache Commons Net .
...
Рейтинг: 0 / 0
28.09.2016, 22:35
    #39317355
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
Basil A. SidorovЗапрет использования LOGIN - обязанность клиента , а не библиотеки .
Библиотека упрощает написание клиента , но не более того.

ну как же так... оно же само берет и посылает команду LOGIN и перекрыть это поведение никак нельзя (понятно что ТС нужно выставить mail.imap.starttls.enable и mail.imap.starttls.required, но суть не в этом) - поэтому в этом месте библиотека выступает клиентом (у IMAPFolder команды можно посылать к примеру, а здесь нет). Сервер говорит: у меня тут такая важная информация, что мне ни в коем случае нельзя посылать логин и пароль в чистом виде, а оно берет и посылает - баг, да к тому же еще и в безопасности.
...
Рейтинг: 0 / 0
29.09.2016, 07:54
    #39317441
bajys
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
Basil A. Sidorov,

А почему из среды Java работает данный код и без проблем подключается к серверу и читает сообщения?
...
Рейтинг: 0 / 0
29.09.2016, 07:56
    #39317442
bajys
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
Андрей Панфилов,


Properties props = new Properties();
props.setProperty("mail.imap.starttls.enable", "true");
props.setProperty("mail.imap.starttls.required", "true");
props.setProperty("mail.imap.ssl.socketFactory.class", "test.ExchangeSSLSocketFactory");
props.setProperty("mail.imap.ssl.socketFactory.fallback", "false");
oMailSession = Session.getInstance(props, null);
oMailStore = oMailSession.getStore(sProtocol);
oMailStore.connect(sHost, sPort, sUser, sPass);

Все включено.

test.ExchangeSSLSocketFactory

package test;
import javax.net.SocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.*;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.*;

public class ExchangeSSLSocketFactory extends SSLSocketFactory {

private SSLSocketFactory sslSocketFactory;
private SocketFactory socketFactory;
public ExchangeSSLSocketFactory() {

try {
socketFactory = SocketFactory.getDefault();
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, new TrustManager[]{new EmptyTrustManager()}, null);
sslSocketFactory = (SSLSocketFactory) context.getSocketFactory();
} catch (Exception e) {
throw new RuntimeException(e);
}
}

private final class EmptyTrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] cert, String authType) throws CertificateException {
}

public void checkServerTrusted(X509Certificate[] cert, String authType) throws CertificateException {
}

public X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[0];
}
}

public static SocketFactory getDefault() {
return new ExchangeSSLSocketFactory();
}

@Override
public Socket createSocket(Socket socket, String s, int i, boolean flag) throws IOException {
return sslSocketFactory.createSocket(socket, s, i, flag);
}

@Override
public Socket createSocket(InetAddress inaddr, int i, InetAddress inaddr1, int j) throws IOException {
return socketFactory.createSocket(inaddr, i, inaddr1, j);
}

@Override
public Socket createSocket(InetAddress inaddr, int i) throws IOException {
return socketFactory.createSocket(inaddr, i);
}

@Override
public Socket createSocket(String s, int i, InetAddress inaddr, int j) throws IOException {
return socketFactory.createSocket(s, i, inaddr, j);
}

@Override
public Socket createSocket(String s, int i) throws IOException {
return socketFactory.createSocket(s, i);
}

@Override
public Socket createSocket() throws IOException {
return socketFactory.createSocket();
}

@Override
public String[] getDefaultCipherSuites() {
return sslSocketFactory.getSupportedCipherSuites();
}

@Override
public String[] getSupportedCipherSuites() {
return sslSocketFactory.getSupportedCipherSuites();
}
}
...
Рейтинг: 0 / 0
29.09.2016, 07:57
    #39317443
bajys
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
Basil A. Sidorov,

Я правильно поняла из Oracle я с помощью JAVA MAIL API не смогу достучаться до почтового сервера?
...
Рейтинг: 0 / 0
29.09.2016, 08:58
    #39317465
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
bajys,

какая версия javamail у вас в базу-то загружена? при беглом просмотре кода javamail ( https://java.net/projects/javamail/pages/Home), даже с учетом изменений, при capabilities вашего IMAP выкидывает исключение "No login methods supported!", а не слепо шлет LOGIN
...
Рейтинг: 0 / 0
29.09.2016, 09:28
    #39317491
bajys
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
Андрей Панфилов,
mail-1.4.7
...
Рейтинг: 0 / 0
29.09.2016, 09:33
    #39317498
bajys
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
Андрей Панфилов,

Это я соединяюсь с imapmail, протокол ssl используется..
При соединении с zimbra использую порт 143 и props.setProperty("mail.imap.starttls.enable", "true");

package MailHandler;


import javax.mail.*;

import java.math.BigDecimal;

import java.util.*;
import java.lang.*;
import javax.mail.internet.InternetAddress;




public class MailHandler {

static Session oMailSession = null;
static Store oMailStore = null;
static Folder oCurrentFolder = null;

static boolean bIsConnected = false;

static String sHost = "host_name";
static String sUser = "user";
static String sPass = "pass";
static String sProtocol = "imap";
static int sPort = 993;


public static void main(String[] args) {
try {

connectToServerSSL(sHost, sPort, sProtocol, sUser, sPass);


} catch (Throwable ex) {
ex.printStackTrace();
}

}

public static void connectToServerSSL(String sHost, int sPort, String sProtocol, String sUser, String sPass)
throws Exception {
if (bIsConnected) {
throw new Exception("Already connected to a mailserver - disconnect first");
}
try {

Properties props = new Properties();
props.setProperty("mail.imap.ssl.enable", "true");
props.setProperty("mail.imap.starttls.required", "true");
props.setProperty("mail.imap.ssl.socketFactory.class", "MailHandler.ExchangeSSLSocketFactory");
props.setProperty("mail.imap.ssl.socketFactory.fallback", "false");

oMailSession = Session.getInstance(props, null);
oMailSession.setDebug(true);
oMailStore = oMailSession.getStore(sProtocol);
System.out.println("connecting...");
oMailStore.connect(sHost, sPort, sUser, sPass);
System.err.println("!!!!done");
bIsConnected = true;
} catch (Exception e) {
throw new RuntimeException(e);
}
}














}
...
Рейтинг: 0 / 0
29.09.2016, 15:40
    #39317946
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
Андрей Панфиловну как же так... оно же само берет и посылает команду LOGIN и перекрыть это поведение никак нельзяСхреновли нельзя, если есть свойства, которые разрешают LOGIN по умолчанию .
...
Рейтинг: 0 / 0
29.09.2016, 18:25
    #39318085
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
Basil A. SidorovСхреновли нельзя, если есть свойства, которые разрешают LOGIN по умолчанию .Эт чет вы путаете, а еще девушку в документацию тыкали. Есть протокол IMAP, у которого подразумевается, что прежде чем работать с почтовым ящиком клиент должен аутентифицироваться, аутентифицироваться можно несколькими способами, а именно:
рукопожатие после команды AUTH LOGIN

рукопожатие после команды AUTH PLAIN

...

команда LOGIN <user> <password> (не рукопожатие после команды, а сразу команда)

то что вы пишите о "если есть свойства, которые разрешают LOGIN" - они про рукопожатие, и работают они так: сервер анонсирует возможность подобной аутентификации и в "клиенте" она разрешена - тогда "библиотека" имеет полное право послать команду AUTH LOGIN и после этого выполнить аутентификацию, т.е. mail.imap.auth.login.disable - это про AUTH LOGIN, к команде LOGIN, которая зафиксирована в протоколе:

автор* OK IMAP4rev1 proxy server ready
A0 CAPABILITY
* CAPABILITY ACL BINARY CATENATE CHILDREN CONDSTORE ENABLE ESEARCH ESORT I18NLEVEL=1 ID IDLE IMAP4rev1 LIST-EXTENDED LIST-STATUS LITERAL+ MULTIAPPEND NAMESPACE QRESYNC QUOTA RIGHTS=ektx SASL-IR SEARCHRES SORT THREAD=ORDEREDSUBJECT UIDPLUS UNSELECT WITHIN XLIST STARTTLS LOGINDISABLED
A0 OK completed
A1 LOGIN exchangeadmin exchangeadmin1123132
NO cleartext logins disabled
A1 BAD invalid command

mail.imap.auth.login.disable никаго отношения не имеет, а учитывая, что сервер анонсирует LOGINDISABLED, то библиотека не имеет никакого права посылать команду LOGIN.

Из всего этого можно сделать вывод, что у ТС в класпасе какая-то бажная библиотека торчит, поскольку в общедоступном коде javamail такого поведения нет и все сделано в соответствии с RFC.
...
Рейтинг: 0 / 0
29.09.2016, 18:50
    #39318099
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
Андрей ПанфиловИз всего этого можно сделать вывод, что у ТС в класпасе какая-то бажная библиотека торчит
Нет там никакого "класпаса", как и нет никаких "библиотке". Это Oracle Database JVM, которая, конечно же, имеет кучу нюансов.
Версию Oracle БД нам не удосужились сообщить. Поэтому на сколько древняя там версия Java и JavaMail сказать сложно. Но то что древняя, это почти наверняка.
...
Рейтинг: 0 / 0
29.09.2016, 18:54
    #39318100
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
BlazkowiczНет там никакого "класпаса", как и нет никаких "библиотке". Это Oracle Database JVM, которая, конечно же, имеет кучу нюансов.
Версию Oracle БД нам не удосужились сообщить. Поэтому на сколько древняя там версия Java и JavaMail сказать сложно. Но то что древняя, это почти наверняка.
Вроде писала:
bajysАндрей Панфилов,
mail-1.4.7
только доверия к этому у меня нет.
...
Рейтинг: 0 / 0
29.09.2016, 18:55
    #39318101
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
bajysА почему из среды Java работает данный код и без проблем подключается к серверу и читает сообщения?
Потому что там другая Java и другой JavaMail
...
Рейтинг: 0 / 0
29.09.2016, 19:02
    #39318107
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
Андрей ПанфиловbajysАндрей Панфилов,
mail-1.4.7
только доверия к этому у меня нет.
А это легко проверить. Что тут у нас в строчках 293 и 298?
http://grepcode.com/file/repo1.maven.org/maven2/javax.mail/mail/1.4.7/com/sun/mail/imap/IMAPStore.java?av=f

Что-то совсем не то что выкидывает исключения.
...
Рейтинг: 0 / 0
30.09.2016, 09:17
    #39318324
bajys
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
Blazkowicz,

Спасибо. Вы оказались правы, в БД Oracle Java – 1.6.0, JavaMail – 1.3.1. Я так понимаю, если JavaMail обновить до 1.4.7, данная проблема разрешится?
...
Рейтинг: 0 / 0
30.09.2016, 09:24
    #39318329
Garrick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
Blazkowicz,

По-моему в самой последней версии Oracle 12g javamail 1.3.1
...
Рейтинг: 0 / 0
30.09.2016, 09:25
    #39318330
Garrick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение почты из Oracle через Java Mail API
Garrick,

...опередили
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Чтение почты из Oracle через Java Mail API / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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