Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

glassfish - mail i autentykacja, javax.mail.SendFailedException: Invalid Addresses

21 views
Skip to first unread message

WOJSAL

unread,
Jan 25, 2010, 10:44:58 AM1/25/10
to
Mam problem z wysylaniem maili z Glassfisha 2.1, na skrzynki zewnetrzne
(skrzynki wewnetrzne - te z domeny: moj_serwer.com) obslugiwane sa bez
problemu). Wyczytalem gdzies, ze przyczyna tego jest blad w JavaMailu i
dopiero wersja beta JavaMail 1.4.4 ten problem ma usuniety.
Wydaje mi sie to dziwne, ze dopiero w wersji 1.4.4 tak podstawowy blad
mialby byc usuniety. Z tym problemem nie da sie praktycznie wyslac
maila (no bo wysylanie maili wewnatrz domeny to skromna mozliwosc).

Co zrobic by wysylac maile na skrzynki zewnetrzne?
Obecnie mam skonfigurowane (z konsoli admininistracyjnej):
Mail host: mx.moj_serwer.com
Default user: moj_user@moj_serwer.com
Transport Protocol:smtp
....

Dodalem ponadto przez konsole property:
mail.smtp.auth: true


Kod wyglada tak:
@Resource(name = "mojaJavaMailSession")
private Session session;


...
Message msg = new MimeMessage(this.session);
msg.setFrom(new InternetAddress(MdConfigAplikacji.EMAIL_ZWROTNY));
msg.addRecipient(Message.RecipientType.TO, new
InternetAddress(md.getSEmail()));
msg.setSubject("Temat");
msg.setContent(sContenet, this.utMail.getContentType());
msg.saveChanges();
/**
* wysylamy maila
*/
Transport.send(msg);
I to chodzi dla skrzynek z domeny "moj_serwer.com" dla reszty swiata - nie.

Cwiczylem tez wariant typu:
Properties props = System.getProperties();
// Setup mail server
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", "mx.moj_serwer.com");
props.put("mail.smtp.auth", true);
// Get session
PwdAuthentificator authenticator = new
PwdAuthentificator("moj_user@moj_serwer.com", "haslo");
Session session = Session.getInstance(props, authenticator);
Transport tr = session.getTransport();
....

I podobnie: chodzi tylko dla skrzynek wenwtraz domeny. Admin twierdzi,
ze do serwera nie dochodzi informacja o tym, ze ma byc autentykacja
(mail.smt.auth=true) i w konsekwencji skutkuje to wyjatkiem:

javax.mail.SendFailedException: Invalid Addresses;
nested exception is:
com.sun.mail.smtp.SMTPAddressFailedException: 554 5.7.1
<woj...@gazeta.pl>: Relay access denied

at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1294)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:635)
at javax.mail.Transport.send0(Transport.java:189)
at javax.mail.Transport.send(Transport.java:140)
....

Pozdrawiam,
Wojtek

Jaroslaw Szczepankiewicz

unread,
Jan 25, 2010, 11:20:49 AM1/25/10
to
Według moich doświadczeń problem leży gdzie indziej, otóż nie zawsze
javamail zachowuje się zgodnie z RFC co skutkuje tym że na niektórych
serwerach zadziała dany sposób autentykacji a na innych nie. Ja miałem
jakieś dwa lata temu problem polegający na tym ze nagle po zmianie
dostawcy smtp przestała działać autentykacja, okazało się że pierwszy
hostingowiec tolerował niezgodne z RFC działanie to jest:

w pierwszej kolejności wysłanie maila
w drugiej kolejności wysłanie danych autentykacji

a drugi dostawca smtp działający zgodnie z RFC już nie. Dlatego w Twoim
przypadku wnioskuje że tak samo jest. I będzie działać poprawnie w
sytuacji kiedy najpierw pójdzie info o autentykacji a później mail.

Próboje analizować swój kod i szukać różnic w stosunku do Twojego
sposobu (używam tego drugiego sposobu z dwóch przedstawionych przez
Ciebie) wykryłem na pierwszu rzut oka trzy:

- nie używam Session.getInstance(...) ale Session.getDefaultInstance(...)

- używam: session.setDebug(false), przed session.getTransport; (nie
pamietam czy to pozostałość debugowania czy świadomie pozostawienie
wpływające na zachowanie biblioteki

- przed wysyłką i bezpośrednio po korzystam z metod:
transport.connect();
... (wysyłka)
transport.close();

sprawdź te trzy rzeczy

juni

unread,
Jan 25, 2010, 12:29:49 PM1/25/10
to Jaroslaw Szczepankiewicz
Użytkownik Jaroslaw Szczepankiewicz napisał:

>
> - nie używam Session.getInstance(...) ale Session.getDefaultInstance(...)
>

Przy Session.getDefaultInstance() mialem jakis wyjatek (nie moge teraz
tego przetestowac, dlatego tez nie potrafie powiedziec teraz, jaki to
byl wyjatek).

> - używam: session.setDebug(false), przed session.getTransport; (nie
> pamietam czy to pozostałość debugowania czy świadomie pozostawienie
> wpływające na zachowanie biblioteki

setDebug(false) - tego nie cwiczylem.

>
> - przed wysyłką i bezpośrednio po korzystam z metod:
> transport.connect();


To probowalem w wersjach:
- connect()
- connect(host, user, password)
Bez rezultatu, tj.: lokalne skrzynki sa obslugiwane a reszta swiata - nie.

> ... (wysyłka)
> transport.close();

To mialem zawsze w wariancie drugim.

Pozdrawiam,
Wojtek

juni

unread,
Jan 25, 2010, 12:38:00 PM1/25/10
to Jaroslaw Szczepankiewicz
Użytkownik Jaroslaw Szczepankiewicz napisał:

>
> a drugi dostawca smtp działający zgodnie z RFC już nie. Dlatego w Twoim
> przypadku wnioskuje że tak samo jest. I będzie działać poprawnie w
> sytuacji kiedy najpierw pójdzie info o autentykacji a później mail.
>

W jaki sposob moge wplynac na kolejnosc wysylania autentykacji i maila?
Jak moge sprawdzic kolejnosc tych wyslanych informacji?

Dzialam na Linuksie.

Dodam jeszcze, ze serwer jest skonfigurowany poprawnie - chodzi
wysylanie maili przez ten serwer na testowane konto mailowe, z klienta
pocztowego.

Pozdrawiam,
Wojtek

Dariusz Dudek

unread,
Jan 25, 2010, 4:51:58 PM1/25/10
to
Ja korzystam z takiej wersji (mniej więcej)

Properties props = System.getProperties();
// Setup mail server
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", "mx.moj_serwer.com");

props.put("mail.smtp.auth", "true"); // "true" a nie true
props.put("mail.smtp.user", "moj_user");
// Get session
URLName uname = new URLName("smtp://moj_user@moj_serwer.com");
PasswordAuthentication pa = new PasswordAuthentication("moj_user", "haslo");
Session session = Session.getInstance(props);
session.setPasswordAuthentication(uname, pa);

Jaroslaw Szczepankiewicz

unread,
Jan 26, 2010, 3:19:04 AM1/26/10
to
juni pisze:

> Użytkownik Jaroslaw Szczepankiewicz napisał:
>
>>
>> a drugi dostawca smtp działający zgodnie z RFC już nie. Dlatego w
>> Twoim przypadku wnioskuje że tak samo jest. I będzie działać poprawnie
>> w sytuacji kiedy najpierw pójdzie info o autentykacji a później mail.
>>
>
> W jaki sposob moge wplynac na kolejnosc wysylania autentykacji i maila?
> Jak moge sprawdzic kolejnosc tych wyslanych informacji?


o ile dobrze pamietam jezeli wrzucisz setDebug(true), komunikacja smtp
bedzie wyrzucana na stdout,

adudczak

unread,
Jan 27, 2010, 3:33:08 AM1/27/10
to
Jeżeli instalowałeś GlassFisha z pakietów dla konkretnego distro to
zerknij czy nie masz w nim jakiejś trefnej (innej niż Sun)
implementacji javamail.

Miałem kiedyś podobny problem na kontenerze Tomcat, który był
zainstalowany z pakietów. Z tego co pamiętam usunąłem z Tomcata te
jary i wszystko było ok. Nie używałem GlassFisha, wiem, że inaczej
tam działają classloadery, ale może pokombinuj w tą stronę.

pozdr. ad

0 new messages