niedziela, 11 września 2011

Wysyłanie wiadomości w Javie: JavaMail i Gmail

Bardzo często chcemy aby nasza aplikacja miała możliwość wysyłania maili, czy to aby wysłać mail aktywacyjny dla nowo zarejestrowanych użytkowników czy też w postaci formularza kontaktowego. Na szczęście biblioteki Java zawierają w sobie klasy dzięki którym bardzo łatwo osiągniemy nasz cel. Jeśli nie mamy własnego serwera który odpowiedzialnyby był za wysyłanie poczty możemy użyć do tego celu serwerów Google i usługi Gmail.



Aby wysyłać maile w aplikacjach javowych potrzebujemy biblioteki Javax Mail, możemy ją dodać poprzez zależności w maven-ie:

<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.1</version>
<type>jar</type>
<scope>compile</scope>
</dependency>

lub pobierając ze strony projektu.

Po pobraniu i dołączeniu bibliotek do naszego projektu musimy skonfigurować połączenie z serwerem smtp (odpowiedzialnym za wysyłanie maili), aby to zrobić tworzymy plik konfiguracyjny.

Plik "mail.properties" zawierający ustawienia umieszczamy w folderze głównym zawierającym źródła tak aby był łatwy do znalezienia, jego zawartość powinna wyglądać następująco:

mail.smtp.host= smtp.gmail.com
mail.smtp.port= 587
mail.smtp.auth= true
mail.smtp.starttls.enable = true
mail.smtp.quitwait= false
mail.user= username
mail.password = password
mail.encoding= "utf8"
mail.debug= false

W powyższym pliku ustawiamy host, port oraz dane autoryzacyjne. Opcja mail.smtp.starttls.enable=true wymusza na aplikacji aby używała operacji StartTLS która to ustanawia szyfrowanie TLS w połączeniu sieciowym.
Opcja mail.smtp.quitwait odpowiada za rozłączanie się z serwerem, w normalnych warunkach, nasza aplikacja wysyła polecenie QUIT i czeka na potwierdzenie rozłączenia, my nie musimy czekać, więc zaraz po wysłaniu polecenia rozłączamy się od serwera.
Mając plik konfiguracyjny potrzebujemy kodu który go wczyta i utworzy sesje mailową która odpowiada za wysłanie wiadomości., robimy to wykorzystując mechanizmy Javy a dokładniej klasę Properties

Properties properties = new Properties();

try {

properties.load(this.getClass().getResourceAsStream("/mail.properties"));
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Fatal error");
}


Jeśli mamy wczytane ustawienia możemy przejść do wysyłania maila. Aby to zrobić tworzymy nową sesję (połączenie z serwerem smtp) oraz wiadomość.

Session session = Session.getInstance(properties);

MimeMessage mm = new MimeMessage(session);

try {
mm.setFrom(new InternetAddress(properties.getProperty("ADRES_NADAWCY@example.com"),properties.get Property("NAZWA_NADAWCY")));
mm.setRecipient(Message.RecipientType.TO, new InternetAddress("ADRES_ODBIORCY@example.com","NAZWA_ODBIORCY"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}

mm.setText("WIADOMOSC");
mm.setSubject("TEMAT_MAILA");
Transport t = session.getTransport("smtp");
t.connect(this.getProperty("mail.user"),this.getProperty("mail.password"));
t.sendMessage(mm, mm.getAllRecipients());



Wszystko powinno działać od ręki, z tego co pamiętam, Gmail ma ograniczenie do 500 maili dziennie (w darmowej usłudze) o czym trzeba pamiętać, choć możliwe, że już się to zmieniło.

Brak komentarzy:

Prześlij komentarz