JavaMail - 回复电子邮件

  • 简述

    在本章中,我们将看到如何使用 JavaMail API 回复电子邮件。以下程序中遵循的基本步骤是:
    • 在属性中获取带有 POP 和 SMPT 服务器详细信息的 Session 对象。我们需要 POP 详细信息来检索消息和 SMPT 详细信息来发送消息。
    • 创建 POP3 商店对象并连接到商店。
    • 创建 Folder 对象并在您的邮箱中打开相应的文件夹。
    • 检索消息。
    • 如果您想回复,则遍历消息并键入“Y”或“y”。
    • 获取邮件的所有信息(收件人、发件人、主题、内容)。
    • 使用 Message.reply() 方法构建回复消息。此方法使用正确的收件人和主题配置新消息。该方法采用一个布尔参数,指示是仅回复发件人 (false) 还是回复所有人 (true)。
    • 在消息中设置 From、Text 和 Reply-to,并通过 Transport 对象的实例发送它。
    • 分别关闭传输、文件夹和存储对象。
    在这里,我们使用了 JangoSMPT 服务器,通过该服务器将电子邮件发送到我们的目标电子邮件地址。环境设置章节中解释了。
  • 创建 Java 类

    创建一个java类文件 ReplyToEmail,其内容如下:
    
    package com.jc2182;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.Date;
    import java.util.Properties;
    import javax.mail.Folder;
    import javax.mail.Message;
    import javax.mail.Session;
    import javax.mail.Store;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    public class ReplyToEmail {
       public static void main(String args[]) 
       {
          Date date = null;
          Properties properties = new Properties();
          properties.put("mail.store.protocol", "pop3");
          properties.put("mail.pop3s.host", "pop.gmail.com");
          properties.put("mail.pop3s.port", "995");
          properties.put("mail.pop3.starttls.enable", "true");
          properties.put("mail.smtp.auth", "true");
          properties.put("mail.smtp.starttls.enable", "true");
          properties.put("mail.smtp.host", "relay.jangosmtp.net");
          properties.put("mail.smtp.port", "25");
          Session session = Session.getDefaultInstance(properties);
          // session.setDebug(true);
          try 
          {
             // Get a Store object and connect to the current host
             Store store = session.getStore("pop3s");
             store.connect("pop.gmail.com", "xyz@gmail.com",
                "*****");//change the user and password accordingly
             Folder folder = store.getFolder("inbox");
             if (!folder.exists()) {
                System.out.println("inbox not found");
                   System.exit(0);
             }
             folder.open(Folder.READ_ONLY);
             BufferedReader reader = new BufferedReader(new InputStreamReader(
                System.in));
             Message[] messages = folder.getMessages();
             if (messages.length != 0) {
                for (int i = 0, n = messages.length; i < n; i++) {
                   Message message = messages[i];
                   date = message.getSentDate();
                   // Get all the information from the message
                   String from = InternetAddress.toString(message.getFrom());
                   if (from != null) {
                      System.out.println("From: " + from);
                   }
                   String replyTo = InternetAddress.toString(message
                .getReplyTo());
                   if (replyTo != null) {
                      System.out.println("Reply-to: " + replyTo);
                   }
                   String to = InternetAddress.toString(message
                .getRecipients(Message.RecipientType.TO));
                   if (to != null) {
                      System.out.println("To: " + to);
                   }
                   String subject = message.getSubject();
                   if (subject != null) {
                      System.out.println("Subject: " + subject);
                   }
                   Date sent = message.getSentDate();
                   if (sent != null) {
                      System.out.println("Sent: " + sent);
                   }
                   System.out.print("Do you want to reply [y/n] : ");
                   String ans = reader.readLine();
                   if ("Y".equals(ans) || "y".equals(ans)) {
                      Message replyMessage = new MimeMessage(session);
                      replyMessage = (MimeMessage) message.reply(false);
                      replyMessage.setFrom(new InternetAddress(to));
                      replyMessage.setText("Thanks");
                      replyMessage.setReplyTo(message.getReplyTo());
                      // Send the message by authenticating the SMTP server
                      // Create a Transport instance and call the sendMessage
                      Transport t = session.getTransport("smtp");
                      try {
                  //connect to the smpt server using transport instance
               //change the user and password accordingly 
                    t.connect("abc", "****");
                    t.sendMessage(replyMessage,
                            replyMessage.getAllRecipients());
                      } finally {
                         t.close();
                      }
                      System.out.println("message replied successfully ....");
                      // close the store and folder objects
                      folder.close(false);
                      store.close();
                   } else if ("n".equals(ans)) {
                      break;
                   }
                }//end of for loop
             } else {
                System.out.println("There is no msg....");
             }
          } catch (Exception e) {
             e.printStackTrace();
          }
       }
    }
    
    您可以通过取消注释session.setDebug(true);语句来设置调试
  • 编译运行

    现在我们的类已经准备好了,让我们编译上面的类。我已将 ReplyToEmail.java 类保存到目录:/home/manisha/JavaMailAPIExercise. 我们需要类路径中的 jars javax.mail.jaractivation.jar。从命令提示符执行以下命令以编译类(两个 jar 文件都放在 /home/manisha/ 目录中):
    
    javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: ReplyToEmail.java
    
    现在类已经编译完成,执行以下命令运行:
    
    java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: ReplyToEmail
    
  • 验证输出

    您应该在命令控制台上看到以下消息:
    
    From: ABC <abc@gmail.com>
    Reply-to: abc@trioteksolutions.com
    To: XYZ <xyz@gmail.com>
    Subject: Hi today is a nice day
    Sent: Thu Oct 17 15:58:37 IST 2013
    Do you want to reply [y/n] : y
    message replied successfully ....
    
    检查邮件发送到的收件箱。在我们的例子中,收到的消息如下所示:
    JavaMail API 回复邮件