Как отправить электронное письмо с помощью приложения Java с помощью GMail, Yahoo или Hotmail?

Можно ли отправить электронное письмо с моего приложения Java с помощью учетной записи GMail? Я настроил почтовый сервер моей компании с Java-приложением для отправки электронной почты, но это не собирается сокращать его, когда я распространяю приложение. Приемлемы любые ответы на использование Hotmail, Yahoo или GMail.

Сначала загрузите API JavaMail и убедитесь, что соответствующие файлы jar находятся в вашем пути к classам.

Вот полный рабочий пример с помощью GMail.

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(); } } } 

Естественно, вы захотите сделать больше в блоках catch чем распечатать трассировку стека, как это было в приведенном выше примере. (Удалите блоки catch чтобы увидеть, какие вызовы методов из JavaMail API исключают исключения, чтобы вы могли лучше видеть, как правильно их обрабатывать.)


Спасибо @jodonnel и всем, кто ответил. Я даю ему щедрость, потому что его ответ привел меня примерно на 95% пути к полному ответу.

Что-то вроде этого (похоже, вам просто нужно изменить свой SMTP-сервер):

 String host = "smtp.gmail.com"; String from = "user name"; Properties props = System.getProperties(); props.put("mail.smtp.host", host); props.put("mail.smtp.user", from); props.put("mail.smtp.password", "asdfgh"); props.put("mail.smtp.port", "587"); // 587 is the port number of yahoo mail props.put("mail.smtp.auth", "true"); Session session = Session.getDefaultInstance(props, null); MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); InternetAddress[] to_address = new InternetAddress[to.length]; int i = 0; // To get the array of addresses while (to[i] != null) { to_address[i] = new InternetAddress(to[i]); i++; } System.out.println(Message.RecipientType.TO); i = 0; while (to_address[i] != null) { message.addRecipient(Message.RecipientType.TO, to_address[i]); i++; } message.setSubject("sending in a group"); message.setText("Welcome to JavaMail"); // alternately, to send HTML mail: // message.setContent("

Welcome to JavaMail

", "text/html"); Transport transport = session.getTransport("smtp"); transport.connect("smtp.mail.yahoo.co.in", "user name", "asdfgh"); transport.sendMessage(message, message.getAllRecipients()); transport.close();

Другие люди имеют хорошие ответы выше, но я хотел добавить примечание о моем опыте здесь. Я обнаружил, что при использовании Gmail в качестве исходящего SMTP-сервера для моего веб-приложения Gmail позволяет отправлять только сообщения ~ 10 или более сообщений с ответами на антиспам, которые я должен выполнить вручную, чтобы повторно активировать SMTP-доступ. Письма, которые я отправлял, не были спамом, но были «приветственными» сообщениями на сайте, когда пользователи регистрировались в моей системе. Итак, YMMV, и я бы не стал полагаться на Gmail для производства Webapp. Если вы отправляете электронное письмо от имени пользователя, например, установленное настольное приложение (где пользователь вводит свои собственные учетные данные Gmail), может быть, все в порядке.

Кроме того, если вы используете Spring, вот рабочий конфиг для использования Gmail для исходящего SMTP:

         mail.debug=true mail.smtp.auth=true mail.smtp.socketFactory.class=java.net.SocketFactory mail.smtp.socketFactory.fallback=false    

Несмотря на то, что этот вопрос закрыт, я хотел бы опубликовать встречное решение, но теперь с помощью Simple Java Mail (Open Source JavaMail smtp wrapper):

 final Email email = new Email(); String host = "smtp.gmail.com"; Integer port = 587; String from = "username"; String pass = "password"; String[] to = {"[email protected]"}; email.setFromAddress("", from); email.setSubject("sending in a group"); for( int i=0; i < to.length; i++ ) { email.addRecipient("", to[i], RecipientType.TO); } email.setText("Welcome to JavaMail"); new Mailer(host, port, from, pass).sendMail(email); // you could also still use your mail session instead new Mailer(session).sendMail(email); 

Мой полный код, как показано ниже, хорошо работает:

 package ripon.java.mail; import java.util.*; import javax.mail.*; import javax.mail.internet.*; public class SendEmail { public static void main(String [] args) { // Sender's email ID needs to be mentioned String from = "[email protected]"; String pass ="test123"; // Recipient's email ID needs to be mentioned. String to = "[email protected]"; String host = "smtp.gmail.com"; // Get system properties Properties properties = System.getProperties(); // Setup mail server properties.put("mail.smtp.starttls.enable", "true"); properties.put("mail.smtp.host", host); properties.put("mail.smtp.user", from); properties.put("mail.smtp.password", pass); properties.put("mail.smtp.port", "587"); properties.put("mail.smtp.auth", "true"); // 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 transport = session.getTransport("smtp"); transport.connect(host, from, pass); transport.sendMessage(message, message.getAllRecipients()); transport.close(); System.out.println("Sent message successfully...."); }catch (MessagingException mex) { mex.printStackTrace(); } } } 
 //set CLASSPATH=%CLASSPATH%;activation.jar;mail.jar import javax.mail.*; import javax.mail.internet.*; import java.util.*; public class Mail { String d_email = "[email protected]", d_password = "****", d_host = "smtp.gmail.com", d_port = "465", m_to = "[email protected]", m_subject = "Testing", m_text = "Hey, this is the testing email using smtp.gmail.com."; public static void main(String[] args) { String[] to={"[email protected]"}; String[] cc={"[email protected]"}; String[] bcc={"[email protected]"}; //This is for google Mail.sendMail("[email protected]", "password", "smtp.gmail.com", "465", "true", "true", true, "javax.net.ssl.SSLSocketFactory", "false", to, cc, bcc, "hi baba don't send virus mails..", "This is my style...of reply..If u send virus mails.."); } public synchronized static boolean sendMail( String userName, String passWord, String host, String port, String starttls, String auth, boolean debug, String socketFactoryClass, String fallback, String[] to, String[] cc, String[] bcc, String subject, String text) { Properties props = new Properties(); //Properties props=System.getProperties(); props.put("mail.smtp.user", userName); props.put("mail.smtp.host", host); if(!"".equals(port)) props.put("mail.smtp.port", port); if(!"".equals(starttls)) props.put("mail.smtp.starttls.enable",starttls); props.put("mail.smtp.auth", auth); if(debug) { props.put("mail.smtp.debug", "true"); } else { props.put("mail.smtp.debug", "false"); } if(!"".equals(port)) props.put("mail.smtp.socketFactory.port", port); if(!"".equals(socketFactoryClass)) props.put("mail.smtp.socketFactory.class",socketFactoryClass); if(!"".equals(fallback)) props.put("mail.smtp.socketFactory.fallback", fallback); try { Session session = Session.getDefaultInstance(props, null); session.setDebug(debug); MimeMessage msg = new MimeMessage(session); msg.setText(text); msg.setSubject(subject); msg.setFrom(new InternetAddress("[email protected]")); for(int i=0;i 

Необходимый минимум:

 import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class MessageSender { public static void sendHardCoded() throws AddressException, MessagingException { String to = "[email protected]"; final String from = "[email protected]"; Properties properties = new Properties(); properties.put("mail.smtp.starttls.enable", "true"); properties.put("mail.smtp.auth", "true"); properties.put("mail.smtp.host", "smtp.gmail.com"); properties.put("mail.smtp.port", "587"); Session session = Session.getInstance(properties, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(from, "BeNice"); } }); MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); message.setSubject("Hello"); message.setText("What's up?"); Transport.send(message); } } 

Опубликованные решения кода могут вызвать проблемы, когда вам нужно настроить несколько SMTP-сессий в любом месте одной и той же JVM.

Часто задаваемые вопросы по JavaMail

 Session.getInstance(properties); 

вместо

 Session.getDefaultInstance(properties); 

потому что getDefault будет использовать только свойства, данные при первом вызове. Все последующие использования экземпляра по умолчанию будут игнорировать изменения свойств.

См. http://www.oracle.com/technetwork/java/faq-135477.html#getdefaultinstance

Это то, что я делаю, когда хочу отправить электронное письмо с приложением, отлично работаю. 🙂

  public class NewClass { public static void main(String[] args) { try { Properties props = System.getProperties(); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.port", "465"); // smtp port Authenticator auth = new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("username-gmail", "password-gmail"); } }; Session session = Session.getDefaultInstance(props, auth); MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress("[email protected]")); msg.setSubject("Try attachment gmail"); msg.setRecipient(RecipientType.TO, new InternetAddress("username-g[email protected]")); //add atleast simple body MimeBodyPart body = new MimeBodyPart(); body.setText("Try attachment"); //do attachment MimeBodyPart attachMent = new MimeBodyPart(); FileDataSource dataSource = new FileDataSource(new File("file-sent.txt")); attachMent.setDataHandler(new DataHandler(dataSource)); attachMent.setFileName("file-sent.txt"); attachMent.setDisposition(MimeBodyPart.ATTACHMENT); Multipart multipart = new MimeMultipart(); multipart.addBodyPart(body); multipart.addBodyPart(attachMent); msg.setContent(multipart); Transport.send(msg); } catch (AddressException ex) { Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex); } catch (MessagingException ex) { Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex); } } } 

Легким путем было бы настроить учетную запись gmail для доступа к POP3. Это позволит вам отправлять через обычный SMTP через серверы gmail.

Затем вы просто отправляете через smtp.gmail.com (на порт 587)

Привет, попробуйте этот код ….

 package my.test.service; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Message; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class Sample { public static void main(String args[]) { final String SMTP_HOST = "smtp.gmail.com"; final String SMTP_PORT = "587"; final String GMAIL_USERNAME = "[email protected]"; final String GMAIL_PASSWORD = "xxxxxxxxxx"; System.out.println("Process Started"); Properties prop = System.getProperties(); prop.setProperty("mail.smtp.starttls.enable", "true"); prop.setProperty("mail.smtp.host", SMTP_HOST); prop.setProperty("mail.smtp.user", GMAIL_USERNAME); prop.setProperty("mail.smtp.password", GMAIL_PASSWORD); prop.setProperty("mail.smtp.port", SMTP_PORT); prop.setProperty("mail.smtp.auth", "true"); System.out.println("Props : " + prop); Session session = Session.getInstance(prop, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(GMAIL_USERNAME, GMAIL_PASSWORD); } }); System.out.println("Got Session : " + session); MimeMessage message = new MimeMessage(session); try { System.out.println("before sending"); message.setFrom(new InternetAddress(GMAIL_USERNAME)); message.addRecipients(Message.RecipientType.TO, InternetAddress.parse(GMAIL_USERNAME)); message.setSubject("My First Email Attempt from Java"); message.setText("Hi, This mail came from Java Application."); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(GMAIL_USERNAME)); Transport transport = session.getTransport("smtp"); System.out.println("Got Transport" + transport); transport.connect(SMTP_HOST, GMAIL_USERNAME, GMAIL_PASSWORD); transport.sendMessage(message, message.getAllRecipients()); System.out.println("message Object : " + message); System.out.println("Email Sent Successfully"); } catch (AddressException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 

Вот простой в использовании class для отправки писем с помощью Gmail . Вам нужно, чтобы библиотека JavaMail добавилась в ваш путь сборки или просто использовала Maven .

 import java.util.Properties; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; public class GmailSender { private static String protocol = "smtp"; private String username; private String password; private Session session; private Message message; private Multipart multipart; public GmailSender() { this.multipart = new MimeMultipart(); } public void setSender(String username, String password) { this.username = username; this.password = password; this.session = getSession(); this.message = new MimeMessage(session); } public void addRecipient(String recipient) throws AddressException, MessagingException { message.addRecipient(Message.RecipientType.TO, new InternetAddress(recipient)); } public void setSubject(String subject) throws MessagingException { message.setSubject(subject); } public void setBody(String body) throws MessagingException { BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText(body); multipart.addBodyPart(messageBodyPart); message.setContent(multipart); } public void send() throws MessagingException { Transport transport = session.getTransport(protocol); transport.connect(username, password); transport.sendMessage(message, message.getAllRecipients()); transport.close(); } public void addAttachment(String filePath) throws MessagingException { BodyPart messageBodyPart = getFileBodyPart(filePath); multipart.addBodyPart(messageBodyPart); message.setContent(multipart); } private BodyPart getFileBodyPart(String filePath) throws MessagingException { BodyPart messageBodyPart = new MimeBodyPart(); DataSource dataSource = new FileDataSource(filePath); messageBodyPart.setDataHandler(new DataHandler(dataSource)); messageBodyPart.setFileName(filePath); return messageBodyPart; } private Session getSession() { Properties properties = getMailServerProperties(); Session session = Session.getDefaultInstance(properties); return session; } private Properties getMailServerProperties() { Properties properties = System.getProperties(); properties.put("mail.smtp.starttls.enable", "true"); properties.put("mail.smtp.host", protocol + ".gmail.com"); properties.put("mail.smtp.user", username); properties.put("mail.smtp.password", password); properties.put("mail.smtp.port", "587"); properties.put("mail.smtp.auth", "true"); return properties; } } 

Пример использования:

 GmailSender sender = new GmailSender(); sender.setSender("[email protected]", "mypassword"); sender.addRecipient("[email protected]"); sender.setSubject("The subject"); sender.setBody("The body"); sender.addAttachment("TestFile.txt"); sender.send(); 

Если вы хотите использовать Outlook с Javamail API используйте

 smtp-mail.outlook.com 

как хост для получения более полного рабочего кода. Проверьте этот ответ .

Давайте будем гением компьютера.