2008-09-05 4 views
179

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

ответ

163

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

Вот полный рабочий пример с использованием 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 блоки, чтобы увидеть, какой метод требует от исключений API JavaMail броска, чтобы вы могли лучше видеть, как правильно обращаться с ними.)


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

+0

lizard - нужно ли нам перенаправить порт для этого ??? props.put ("mail.smtp.port", "587"); этот порт должен быть открыт ?? – Varun 2011-04-05 04:19:30

+1

@varun: Это порт на сервере исходящей почты, `smtp.gmail.com`. Подробнее см. [Настройка других почтовых клиентов] (http://mail.google.com/support/bin/answer.py?answer=13287). – 2011-04-05 11:11:20

+1

Я единственный, кто получает AuthenticationFailedException здесь props.put ("mail.smtp.auth", "true"); если true - строка. Это нормально, если оно является логическим. – nyxz 2011-12-20 12:39:48

0

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

Тогда вы просто отправить через smtp.gmail.com (порт 587)

106

Нечто подобное (звучит, как вам просто нужно изменить 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("<p>Welcome to JavaMail</p>", "text/html"); 
Transport transport = session.getTransport("smtp"); 
transport.connect("smtp.mail.yahoo.co.in", "user name", "asdfgh"); 
transport.sendMessage(message, message.getAllRecipients()); 
transport.close(); 
+0

Можно ли отправить контент в виде html? Если я попытаюсь написать некоторый код html и отправить его, но в конце приема содержимое письма будет только html-кодом. – 2011-02-21 16:35:16

+4

Чтобы отправить html body вместо чистого текста, измените эту строку: `message.setText (« Добро пожаловать в JavaMail »);` с этой строкой: `message.setContent ("

Hello world

"," text/html ");` – mist 2011-06-28 20:36:00

+4

Этого не хватает («mail.smtp.starttls.enable», «true») – Sotomajor 2012-10-03 12:35:25

13

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

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); 
1

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

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

} 
20

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

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

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
    <property name="defaultEncoding" value="UTF-8"/> 
    <property name="host" value="smtp.gmail.com"/> 
    <property name="port" value="465"/> 
    <property name="username" value="${mail.username}"/> 
    <property name="password" value="${mail.password}"/> 
    <property name="javaMailProperties"> 
     <value> 
      mail.debug=true 
      mail.smtp.auth=true 
      mail.smtp.socketFactory.class=java.net.SocketFactory 
      mail.smtp.socketFactory.fallback=false 
     </value> 
    </property> 
</bean> 
3
//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<to.length;i++) { 
       msg.addRecipient(Message.RecipientType.TO, 
           new InternetAddress(to[i])); 
      } 
      for(int i=0;i<cc.length;i++) { 
       msg.addRecipient(Message.RecipientType.CC, 
           new InternetAddress(cc[i])); 
      } 
      for(int i=0;i<bcc.length;i++) { 
       msg.addRecipient(Message.RecipientType.BCC, 
           new InternetAddress(bcc[i])); 
      } 
      msg.saveChanges(); 
      Transport transport = session.getTransport("smtp"); 
      transport.connect(host, userName, passWord); 
      transport.sendMessage(msg, msg.getAllRecipients()); 
      transport.close(); 
      return true; 
     } 
     catch (Exception mex) 
     { 
      mex.printStackTrace(); 
      return false; 
     } 
    } 

} 
5

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

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

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

JavaMail FAQ рекомендует использовать

Session.getInstance(properties); 

вместо

Session.getDefaultInstance(properties); 

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

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

0

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

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

Минимальное требуемое:

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

} 
0

Вот простой в использовании класс для отправки электронной почты с Gmail. Вы должны иметь библиотеку JavaMailadded to your build path или просто использовать 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(); 
0

Если вы хотите использовать внешний вид с Javamail API затем использовать

smtp-mail.outlook.com 

как хозяина для более полной и рабочий код Check out this answer.

Смежные вопросы