Próbuję wysłać wiadomość e-mail za pomocą Java:
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendEmail {
public static void main(String [] args) {
// Recipient's email ID needs to be mentioned.
String to = "[email protected]";
// Sender's email ID needs to be mentioned
String from = "[email protected]";
// Assuming you are sending email from localhost
String host = "localhost";
// Get system properties
Properties properties = System.getProperties();
// Setup mail server
properties.setProperty("mail.smtp.host", host);
// Get the default Session object.
Session session = Session.getDefaultInstance(properties);
try{
// Create a default MimeMessage object.
MimeMessage message = new MimeMessage(session);
// Set From: header field of the header.
message.setFrom(new InternetAddress(from));
// Set To: header field of the header.
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));
// Set Subject: header field
message.setSubject("This is the Subject Line!");
// Now set the actual message
message.setText("This is actual message");
// Send message
Transport.send(message);
System.out.println("Sent message successfully....");
}catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
Otrzymuję błąd:
javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;
nested exception is:java.net.ConnectException: Connection refused: connect
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1706)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:525)
Czy ten kod będzie działał do wysyłania wiadomości e-mail?
Odpowiedzi:
Poniższy kod działa bardzo dobrze z serwerem Google SMTP. Musisz podać swoją nazwę użytkownika i hasło Google.
Aktualizacja 11 grudnia 2015 r
Nazwa użytkownika i hasło nie są już zalecanym rozwiązaniem. Jest to spowodowane
Firma Google udostępniła interfejs API Gmaila - https://developers.google.com/gmail/api/?hl=en . Powinniśmy użyć metody oAuth2 zamiast nazwy użytkownika i hasła.
Oto fragment kodu do pracy z interfejsem Gmail API.
GoogleMail.java
Oto fragment kodu, aby utworzyć autoryzowaną usługę Gmail za pośrednictwem protokołu oAuth2.
Utils.java
Aby zapewnić przyjazny dla użytkownika sposób uwierzytelniania oAuth2, skorzystałem z JavaFX, aby wyświetlić następujące okno dialogowe
Klucz do wyświetlenia przyjaznego dla użytkownika okna dialogowego oAuth2 można znaleźć w MyAuthorizationCodeInstalledApp.java i SimpleSwingBrowser.java
źródło
Send
zamiast,send
ale jest to przydatna klasa. Masz jakieś przemyślenia na temat wpływu przechowywania hasła Gmaila w kodzie na bezpieczeństwo?Poniższy kod zadziałał dla mnie.
źródło
Wymagane pliki jar
Kliknij tutaj - Jak dodać zewnętrzne słoiki
źródło
Krótka odpowiedź - nie.
Długa odpowiedź - nie, ponieważ kod opiera się na obecności serwera SMTP działającego na komputerze lokalnym i nasłuchiwania na porcie 25. Serwer SMTP (technicznie MTA lub Mail Transfer Agent) jest odpowiedzialny za komunikację z Mail User Agent (MUA, który w tym przypadku jest procesem Java) do odbierania wychodzących wiadomości e-mail.
Obecnie MTA są zazwyczaj odpowiedzialne za odbieranie wiadomości od użytkowników z określonej domeny. Tak więc w przypadku domeny gmail.com to serwery poczty Google są odpowiedzialne za uwierzytelnianie programów pocztowych, a tym samym przesyłanie wiadomości do skrzynek odbiorczych na serwerach Gmaila. Nie jestem pewien, czy GMail ufa otwartym serwerom przekazującym pocztę, ale z pewnością nie jest łatwym zadaniem przeprowadzenie uwierzytelnienia w imieniu Google, a następnie przekazanie poczty do serwerów Gmaila.
Jeśli przeczytasz FAQ JavaMail na temat używania JavaMail do uzyskiwania dostępu do Gmaila , zauważysz, że nazwa hosta i port wskazują na serwery GMail, a na pewno nie na localhost. Jeśli zamierzasz korzystać z komputera lokalnego, musisz wykonać przekazywanie lub przekazywanie.
Prawdopodobnie będziesz musiał dogłębnie zrozumieć protokół SMTP, jeśli zamierzasz dotrzeć gdziekolwiek, jeśli chodzi o SMTP. Możesz zacząć od artykułu w Wikipedii na temat SMTP , ale dalszy postęp w rzeczywistości będzie wymagał programowania na serwerze SMTP.
źródło
Do wysyłania e-maili potrzebny jest serwer SMTP. Istnieją serwery, które możesz zainstalować lokalnie na swoim komputerze lub możesz użyć jednego z wielu serwerów online. Jednym z bardziej znanych serwerów jest Google:
Właśnie pomyślnie przetestowałem dozwolone konfiguracje SMTP Google na pierwszym przykładzie z Simple Java Mail :
Zwróć uwagę na różne porty i strategie transportu (które obsługują wszystkie niezbędne właściwości).
Co ciekawe, Google wymaga TLS również na porcie 25, mimo że instrukcje Google mówią inaczej .
źródło
Minęło sporo czasu, odkąd to zostało opublikowane. Ale od 13 listopada 2012 mogę sprawdzić, czy port 465 nadal działa.
Zapoznaj się z odpowiedzią GaryMa na tym forum . Mam nadzieję, że pomoże to jeszcze kilku osobom.
źródło
Poniższy kod działa bardzo dobrze. Wypróbuj go jako aplikację java z javamail-1.4.5.jar
źródło
Cóż, nie, nie bez wymiany niektórych części, ponieważ pojawia się błąd. Obecnie próbujesz wysłać pocztę za pośrednictwem serwera SMTP działającego na hoście lokalnym, ale nie masz uruchomionego, stąd
ConnectException
.Zakładając, że kod jest OK (tak naprawdę nie sprawdzałem), będziesz musiał albo uruchomić lokalny serwer SMTP, albo użyć (zdalnego) serwera (od twojego ISP).
Jeśli chodzi o kod, przykłady można znaleźć w pakiecie pobierania JavaMail, jak wspomniano w FAQ :
źródło
Wypróbuj to. To działa dobrze dla mnie. Upewnij się, że przed wysłaniem wiadomości e-mail musisz przyznać dostęp do mniej bezpiecznej aplikacji na swoim koncie Gmail. Więc przejdź do poniższego linku i wypróbuj ten kod java.
Aktywuj Gmaila dla mniej bezpiecznej aplikacji
Musisz zaimportować do projektu plik javax.mail.jar i plik aktywacja.jar.
To jest pełny kod do wysyłania wiadomości e-mail w języku java
źródło
Oto działające rozwiązanie brachu. To jest gwarantowane.
[email protected]
Otwórz ten link poniżej:
https://support.google.com/accounts/answer/6010255?hl=en
Oto mój kod:
źródło
Umieściłem moją działającą klasę Java w Gmailu na pastebin do przeglądu, zwróć szczególną uwagę na metodę "startSessionWithTLS", a być może będziesz w stanie dostosować JavaMail, aby zapewniał tę samą funkcjonalność. http://pastebin.com/VE8Mqkqp
źródło
Twój kod działa poza zestawieniem połączenia z serwerem SMTP. Aby wysyłać do Ciebie wiadomości e-mail, potrzebujesz działającego serwera poczty (SMTP).
Oto twój zmodyfikowany kod. Skomentowałem części, które nie są potrzebne, i zmieniłem tworzenie sesji, więc wymaga Authenticator. Teraz po prostu znajdź SMPT_HOSTNAME, NAZWA UŻYTKOWNIKA i HASŁO, których chcesz użyć (Twój dostawca Internetu zwykle je dostarcza).
Zawsze robię to w ten sposób (używając zdalnego serwera SMTP, który znam), ponieważ uruchomienie lokalnego serwera poczty nie jest takie proste w systemie Windows (najwyraźniej jest to dość łatwe pod Linuksem).
źródło
Rzeczywiście 465 działa, a wyjątek, który otrzymujesz, może być spowodowany nieotwartym portem SMTP 25. Domyślnie numer portu to 25. Jednak możesz go skonfigurować za pomocą agenta pocztowego, który jest dostępny jako open source - Mercury
Dla uproszczenia wystarczy użyć następującej konfiguracji i wszystko będzie dobrze.
Aby uzyskać więcej informacji: zapoznaj się z pełnym przykładem roboczym od podstaw tutaj
źródło
Mam taki sam wyjątek jak ty. Przyczyną tego jest brak zainstalowanego i uruchomionego serwera SMPT na twojej maszynie (ponieważ twój host to localhost). Jeśli używasz systemu Windows 7, nie ma on serwera SMTP. więc będziesz musiał pobrać, zainstalować i skonfigurować domenę oraz utworzyć konta. Użyłem hmailserver jako serwera smtp zainstalowanego i skonfigurowanego na moim lokalnym komputerze. https://www.hmailserver.com/download
źródło
Pełną i bardzo prostą klasę java do wysyłania e-maili za pomocą konta Google (gmail) można znaleźć tutaj,
Wyślij e-mail za pomocą java i konta Google
Wykorzystuje następujące właściwości
źródło