Po co mi maile?
Warunkiem utworzenia konta użytkownika jest podanie poprawnego adresu email, do którego dany użytkownik rzeczywiście ma dostęp.
W kolejnym wpisie omówię dokładniej proces weryfikacji. Na teraz istotne jest to, że moja aplikacja musi być w stanie wysłać do użytkownika maila z linkiem do uaktywnienia konta.
Jak to zrobić?
Korzystam z frameworka Spring Boot (czyli właściwie z nakładki ułatwiającej korzystanie z frameworka Spring zgodnie z zasadą “konwencja ponad konfiguracją”).
Kroki do realizacji mojego celu są następujące:
1. Dodaję zależność w pliku pom.xml:
1 2 3 4 |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> |
2. Piszę kod tworzący i wysyłający wiadomości:
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 |
... import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; @Service public class EmailService { @Autowired private JavaMailSender javaMailSender; public void send(String to, String title, String contents) { MimeMessage mail = javaMailSender.createMimeMessage(); try { MimeMessageHelper helper = new MimeMessageHelper(mail, true); helper.setTo(to); helper.setReplyTo("auto@szafbook.pl"); helper.setFrom("auto@szafbook.pl"); helper.setSubject(title); helper.setText(contents); } catch (MessagingException e) { e.printStackTrace(); } finally { } javaMailSender.send(mail); } } |
3. Ustawiam właściwości aplikacji
1 2 3 4 5 6 7 8 |
... spring.mail.host=serwer.smtp spring.mail.port=nr.portu spring.mail.username=username spring.mail.password=password spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true spring.mail.properties.mail.smtp.auth=true; |
Co może pójść nie tak?
com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first.
Koniecznie jest nadanie wartości true
właściwości spring.mail.properties.mail.smtp.starttls.enable
, a najlepiej całej trójce kończącej powyższy listing.
javax.mail.AuthenticationFailedException: 534-5.7.9 Application-specific password required.
To akurat sprawa typowa dla serwisu GMail. Jeśli chcesz, żeby aplikacja łączyła się z kontem email i w Twoim imieniu wysyłała maile, musisz stworzyć specjalne hasło aplikacji, różne od hasła prywatnego. W każdej chwili możesz podejrzeć listę aplikacji, które korzystają z takiego hasła (na stronie https://security.google.com/settings/security/apppasswords), a także dowolną z nich zablokować.
Google uprzejmie zwraca uwagę, że nadal nie jest to najbezpieczniejsze rozwiązanie.
com.sun.mail.util.MailConnectException: Couldn’t connect to host.
Ten błąd pojawił się, kiedy przełączyłam konto z GMaila na adres email na mojej wirtualnej instancji obsługującej kilka domen. Początkowo myślałam, że Java Mail nie chce pracować z “wirtualnymi” adresami obsługiwanymi przez serwer SMTP w innej domenie. Ostatecznie okazało się jednak, że przyczyną błędu był nadmiarowy biały znak w pliku application.properties 🙂
Ciekawostka: tymczasowe maile
Wiele aplikacji wymusza na użytkowniku podanie działającego adresu email. Główne powody to:
- zwiększenie prawdopodobieństwa, że mamy do czynienia z człowiekiem, a nie robotem,
- umożliwienie spamowania 🙂
- zabezpieczenie użytkownika przed literówką w adresie email, która mogłaby doprowadzić nawet do utraty konta w aplikacji (brak możliwości zresetowania hasła bez działającego adresu).
Wiele osób tworzy sobie dodatkowe konto email, które używane jest do rejestracji w mniej istotnych serwisach (sama mam osobne konto do zakupów internetowych). Zdarza się jednak, że adresu email żąda strona lub aplikacja, z którą na pewno już nigdy nie będziesz mieć nic wspólnego. Co wtedy zrobić?
Możesz założyć tzw. jednorazowe (ang. disposable) konto email, np. w serwisie Guerilla Mail. Poczta, która tam trafia, jest przechowywana przez godzinę niezależnie od tego, czy ktoś ja odczyta, czy nie.
Ocenę moralną pozostawiam Czytelnikowi.
Jedna myśl nt. „Jak wysłać maila z aplikacji webowej w Javie?”