Najpierw pobierz interfejs API JavaMail i upewnij się, że odpowiednie pliki jar znajdują się w ścieżce klasy.
Oto pełny działający przykład korzystania z Gmaila.
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
public class Main {
private static String USER_NAME = "*****"; // GMail user name (just the part before "@gmail.com")
private static String PASSWORD = "********"; // GMail password
private static String RECIPIENT = "[email protected]";
public static void main(String[] args) {
String from = USER_NAME;
String pass = PASSWORD;
String[] to = { RECIPIENT }; // list of recipient email addresses
String subject = "Java send mail example";
String body = "Welcome to JavaMail!";
sendFromGMail(from, pass, to, subject, body);
}
private static void sendFromGMail(String from, String pass, String[] to, String subject, String body) {
Properties props = System.getProperties();
String host = "smtp.gmail.com";
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", host);
props.put("mail.smtp.user", from);
props.put("mail.smtp.password", pass);
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props);
MimeMessage message = new MimeMessage(session);
try {
message.setFrom(new InternetAddress(from));
InternetAddress[] toAddress = new InternetAddress[to.length];
// To get the array of addresses
for( int i = 0; i < to.length; i++ ) {
toAddress[i] = new InternetAddress(to[i]);
}
for( int i = 0; i < toAddress.length; i++) {
message.addRecipient(Message.RecipientType.TO, toAddress[i]);
}
message.setSubject(subject);
message.setText(body);
Transport transport = session.getTransport("smtp");
transport.connect(host, from, pass);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}
catch (AddressException ae) {
ae.printStackTrace();
}
catch (MessagingException me) {
me.printStackTrace();
}
}
}
Oczywiście będziesz chciał zrobić więcej w catch
blokach niż wydrukować ślad stosu, tak jak to zrobiłem w powyższym przykładzie. (Usuń catch
bloki, aby zobaczyć, które wywołania metod z API JavaMail generują wyjątki, aby lepiej zobaczyć, jak je odpowiednio obsługiwać).
Dzięki @jodonnel i wszystkim innym, którzy odpowiedzieli. Daję mu nagrodę, ponieważ jego odpowiedź doprowadziła mnie w 95% do pełnej odpowiedzi.
smtp.gmail.com
. Aby uzyskać szczegółowe informacje, zobacz Konfigurowanie innych klientów poczty .javax.mail.AuthenticationFailedException
i musiałem wyraźnie włączyć „mniej bezpieczne aplikacje” w moich ustawieniach Gmaila: google.com/settings/security/lesssecureapps . Po włączeniu „mniej bezpiecznych aplikacji” kod działałCoś takiego (wygląda na to, że wystarczy zmienić serwer SMTP):
źródło
message.setText("Welcome to JavaMail");
w tym wierszu:message.setContent("<h1>Hello world</h1>", "text/html");
props.put("mail.smtp.starttls.enable", "true")
Inne osoby mają dobre odpowiedzi powyżej, ale chciałem tutaj dodać notatkę o moim doświadczeniu. Przekonałem się, że kiedy używam Gmaila jako wychodzącego serwera SMTP dla mojej aplikacji internetowej, Gmail pozwala mi wysyłać około 10 wiadomości przed odpowiedzią antyspamową, którą muszę ręcznie wykonać, aby ponownie włączyć dostęp SMTP. Wiadomości e-mail, które wysyłałem, nie były spamem, ale były wiadomościami „powitalnymi” witryny, gdy użytkownicy zarejestrowali się w moim systemie. YMMV i ja nie polegalibyśmy na Gmailu w przypadku produkcyjnej aplikacji internetowej. Jeśli wysyłasz wiadomość e-mail w imieniu użytkownika, na przykład zainstalowaną aplikację komputerową (w której użytkownik wprowadza własne dane logowania Gmaila), możesz być w porządku.
Ponadto, jeśli używasz Springa, oto działająca konfiguracja do korzystania z Gmaila do wychodzącego SMTP:
źródło
Mimo że to pytanie jest zamknięte, chciałbym opublikować rozwiązanie dotyczące licznika, ale teraz używam Simple Java Mail (Open Source JavaMail wrapper smtp):
źródło
new Mailer(your login / your session, TransportStrategy.SMTP_TLS).sendMail(email);
Mój pełny kod, jak poniżej, działa dobrze:
źródło
źródło
Wymagane minimum:
źródło
Rozwiązania z kodem opublikowanym mogą powodować problemy, gdy trzeba skonfigurować wiele sesji SMTP w dowolnym miejscu w ramach tej samej maszyny JVM.
Często zadawane pytania dotyczące JavaMail zaleca używanie
zamiast
ponieważ getDefault użyje tylko właściwości podanych przy pierwszym wywołaniu. Wszystkie późniejsze zastosowania instancji domyślnej będą ignorować zmiany właściwości.
Zobacz http://www.oracle.com/technetwork/java/faq-135477.html#getdefaultinstance
źródło
To właśnie robię, gdy chcę wysłać wiadomość e-mail z załącznikiem, działa dobrze. :)
źródło
Łatwą drogą byłoby skonfigurowanie / włączenie konta Gmail dla dostępu POP3. Umożliwiłoby to wysyłanie za pośrednictwem zwykłego SMTP za pośrednictwem serwerów Gmail.
Następnie wystarczy wysłać przez smtp.gmail.com (na porcie 587)
źródło
Cześć, wypróbuj ten kod ....
źródło
Oto łatwa w użyciu klasa do wysyłania e-maili
Gmail
. Musisz dodaćJavaMail
bibliotekę do ścieżki kompilacji lub po prostu użyćMaven
.Przykładowe użycie:
źródło
Jeśli chcesz użyć programu Outlook,
Javamail API
użyjjako host dla więcej i pełnego działającego kodu Sprawdź tę odpowiedź .
źródło
Wartość dodana:
Session.getInstance()
zalecane ponadSession.getDefaultInstance()
źródło