JavaMail API - Hướng dẫn nhanh

JavaMail API cung cấp một khuôn khổ độc lập với nền tảng và không phụ thuộc vào giao thức để xây dựng các ứng dụng thư và nhắn tin. API JavaMail cung cấp một tập hợp các lớp trừu tượng xác định các đối tượng bao gồm một hệ thống thư. Đây là một gói tùy chọn (phần mở rộng tiêu chuẩn) để đọc, soạn và gửi tin nhắn điện tử.

JavaMail cung cấp các phần tử được sử dụng để xây dựng giao diện cho hệ thống nhắn tin, bao gồm các thành phần và giao diện hệ thống. Trong khi đặc tả này không xác định bất kỳ triển khai cụ thể nào, JavaMail bao gồm một số lớp thực hiện các tiêu chuẩn nhắn tin Internet RFC822 và MIME. Các lớp này được phân phối như một phần của gói lớp JavaMail.

Sau đây là một số giao thức được hỗ trợ trong JavaMail API:

  • SMTP: Viết tắt của Simple Mail Transfer Protocol. Nó cung cấp một cơ chế để gửi email.

  • POP: Viết tắt của Post Office Protocol. POP là cơ chế mà hầu hết mọi người trên Internet sử dụng để nhận thư của họ. Nó xác định hỗ trợ cho một hộp thư duy nhất cho mỗi người dùng. RFC 1939 định nghĩa giao thức này.

  • IMAP: Viết tắt của Internet Message Access Protocol. Nó là một giao thức tiên tiến để nhận tin nhắn. Nó cung cấp hỗ trợ nhiều hộp thư cho mỗi người dùng, ngoài ra, hộp thư có thể được chia sẻ bởi nhiều người dùng. Nó được định nghĩa trong RFC 2060.

  • MIME: Viết tắt của Multipurpose Internet Mail Extensions. . Nó không phải là một giao thức chuyển thư. Thay vào đó, nó xác định nội dung của những gì được chuyển: định dạng của thư, tệp đính kèm, v.v. Có nhiều tài liệu khác nhau có hiệu lực ở đây: RFC 822, RFC 2045, RFC 2046 và RFC 2047. Là người dùng JavaMail API, bạn thường không cần lo lắng về các định dạng này. Tuy nhiên, các định dạng này vẫn tồn tại và được các chương trình của bạn sử dụng.

  • NNTP and Others: Có nhiều giao thức được cung cấp bởi các nhà cung cấp bên thứ ba. Một số trong số đó là Giao thức truyền tin tức mạng (NNTP), Tiện ích mở rộng thư Internet đa năng an toàn (S / MIME), v.v.

Chi tiết về những điều này sẽ được đề cập trong các chương tiếp theo.

Ngành kiến ​​trúc

Như đã nói ở trên, ứng dụng java sử dụng JavaMail API để soạn, gửi và nhận email. Hình sau minh họa kiến ​​trúc của JavaMail:

Cơ chế trừu tượng của JavaMail API tương tự như các API J2EE khác, chẳng hạn như JDBC, JNDI và JMS. Như đã thấy sơ đồ kiến ​​trúc ở trên, JavaMail API được chia thành hai phần chính:

  • Phần độc lập với ứng dụng: Giao diện lập trình ứng dụng (API) được các thành phần ứng dụng sử dụng để gửi và nhận thư, độc lập với nhà cung cấp cơ bản hoặc giao thức được sử dụng.

  • Phần phụ thuộc vào dịch vụ: Giao diện nhà cung cấp dịch vụ (SPI) nói các ngôn ngữ dành riêng cho giao thức, chẳng hạn như SMTP, POP, IMAP và Giao thức truyền tin tức mạng (NNTP). Nó được sử dụng để kết nối nhà cung cấp dịch vụ e-mail với nền tảng J2EE.

Để gửi e-mail bằng Ứng dụng Java của bạn rất đơn giản nhưng để bắt đầu, bạn nên có JavaMail APIJava Activation Framework (JAF) được cài đặt trên máy của bạn.

Bạn sẽ cần JavaBeans Activation Framework (JAF)tiện ích mở rộng chỉ cung cấp gói javax.activation khi bạn không sử dụng Java SE 6 trở lên.
  • Bạn có thể tải xuống phiên bản mới nhất của JavaMail (Phiên bản 1.5.0) từ trang web chuẩn của Java.

  • Bạn có thể tải xuống phiên bản mới nhất của JAF (Phiên bản 1.1.1) từ trang web chuẩn của Java.

Tải xuống và giải nén các tệp này, trong thư mục cấp cao nhất mới được tạo, bạn sẽ tìm thấy một số tệp jar cho cả hai ứng dụng. Bạn cần phải thêmmail.jaractivation.jar các tệp trong CLASSPATH của bạn.

máy chủ SMTP

Để gửi email, bạn phải có máy chủ SMTP chịu trách nhiệm gửi thư. Bạn có thể sử dụng một trong các kỹ thuật sau để tải máy chủ SMTP:

  • Cài đặt và sử dụng bất kỳ máy chủ SMTP nào như máy chủ Postfix (dành cho Ubuntu), máy chủ Apache James (Java Apache Mail Enterprise Server), v.v. (hoặc là)

  • Sử dụng máy chủ SMTP do nhà cung cấp máy chủ cung cấp, ví dụ: SMTP miễn phí do trang JangoSMTP cung cấp là relay.jangosmtp.net (hoặc)

  • Sử dụng Máy chủ SMTP do các công ty cung cấp, ví dụ như gmail, yahoo, v.v.

Ví dụ trong các chương tiếp theo, chúng tôi đã sử dụng máy chủ JangoSMTP miễn phí để gửi email. Bạn có thể tạo một tài khoản bằng cách truy cập trang web này và định cấu hình địa chỉ email của mình.

API JavaMail bao gồm một số giao diện và lớp được sử dụng để gửi, đọc và xóa các thư e-mail. Mặc dù có nhiều gói trong API JavaMail, sẽ bao gồm hai gói chính được sử dụng trong Java Mail API thường xuyên: javax.mailjavax.mail.internet gói. Các gói này chứa tất cả các lớp lõi JavaMail. Họ đang:

Lớp học Sự miêu tả
javax.mail.Session Lớp khóa của API. Một đối tượng đa luồng đại diện cho nhà máy kết nối.
javax.mail.Message Một lớp trừu tượng mô hình hóa một thông điệp e-mail. Các lớp con cung cấp các triển khai thực tế.
javax.mail.Address Một lớp trừu tượng mô hình hóa các địa chỉ (địa chỉ từ và đến) trong một thông báo. Các lớp con cung cấp các triển khai cụ thể.
javax.mail.Authenticator Một lớp trừu tượng được sử dụng để bảo vệ tài nguyên thư trên máy chủ thư.
javax.mail.Transport Một lớp trừu tượng mô hình hóa cơ chế truyền tải thông điệp để gửi một thông điệp e-mail.
javax.mail.Store Một lớp trừu tượng mô hình hóa một kho lưu trữ thông điệp và giao thức truy cập của nó, để lưu trữ và truy xuất thông báo. Một Cửa hàng được chia thành các Thư mục.
javax.mail.Folder Một lớp trừu tượng đại diện cho một thư mục thư. Nó có thể chứa các thư mục con.
javax.mail.internet.MimeMessage Message là một lớp trừu tượng, do đó phải làm việc với một lớp con; trong hầu hết các trường hợp, bạn sẽ sử dụng MimeMessage. MimeMessage là một thông điệp e-mail hiểu các loại MIME và tiêu đề.
javax.mail.internet.InternetAddress Lớp này đại diện cho một địa chỉ email Internet sử dụng cú pháp của RFC822. Cú pháp địa chỉ điển hình có dạng user@host.domain hoặc Tên cá nhân <user@host.domain> .

Đây là một ví dụ để gửi một email đơn giản. Ở đây chúng tôi đã sử dụng máy chủ JangoSMTP qua đó các email được gửi đến địa chỉ email đích của chúng tôi. Thiết lập được giải thích trong chương Thiết lập Môi trường .

Để gửi một email đơn giản, các bước sau là:

  • Nhận một phiên

  • Tạo một đối tượng MimeMessage mặc định và đặt Từ, Đến, Chủ đề trong thư.

  • Đặt thông báo thực tế là:

    message.setText("your text goes here");
  • Gửi tin nhắn bằng đối tượng Vận chuyển.

Tạo lớp Java

Tạo tệp lớp java SendEmail, nội dung của nó như sau:

package com.tutorialspoint;

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.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendEmail {
   public static void main(String[] args) {
      // Recipient's email ID needs to be mentioned.
      String to = "destinationemail@gmail.com";

      // Sender's email ID needs to be mentioned
      String from = "fromemail@gmail.com";
      final String username = "manishaspatil";//change accordingly
      final String password = "******";//change accordingly

      // Assuming you are sending email through relay.jangosmtp.net
      String host = "relay.jangosmtp.net";

      Properties props = new Properties();
      props.put("mail.smtp.auth", "true");
      props.put("mail.smtp.starttls.enable", "true");
      props.put("mail.smtp.host", host);
      props.put("mail.smtp.port", "25");

      // Get the Session object.
      Session session = Session.getInstance(props,
         new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
               return new PasswordAuthentication(username, password);
	   }
         });

      try {
	   // Create a default MimeMessage object.
	   Message message = new MimeMessage(session);
	
	   // Set From: header field of the header.
	   message.setFrom(new InternetAddress(from));
	
	   // Set To: header field of the header.
	   message.setRecipients(Message.RecipientType.TO,
               InternetAddress.parse(to));
	
	   // Set Subject: header field
	   message.setSubject("Testing Subject");
	
	   // Now set the actual message
	   message.setText("Hello, this is sample for to check send " +
		"email using JavaMailAPI ");

	   // Send message
	   Transport.send(message);

	   System.out.println("Sent message successfully....");

      } catch (MessagingException e) {
         throw new RuntimeException(e);
      }
   }
}

Vì chúng tôi đang sử dụng máy chủ SMTP do nhà cung cấp máy chủ lưu trữ JangoSMTP cung cấp, chúng tôi cần xác thực tên người dùng và mật khẩu. Lớp javax.mail.PasswordAuthentication được sử dụng để xác thực mật khẩu.

Biên dịch và Chạy

Bây giờ lớp của chúng ta đã sẵn sàng, chúng ta hãy biên dịch lớp trên. Tôi đã lưu lớp SendEmail.java vào thư mục:/home/manisha/JavaMailAPIExercise. Chúng tôi cần các lọ javax.mail.jaractivation.jar trong classpath. Thực thi lệnh bên dưới để biên dịch lớp (cả hai lọ đều được đặt trong thư mục / home / manisha /) từ dấu nhắc lệnh:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendEmail.java

Bây giờ lớp đã được biên dịch, hãy thực thi lệnh dưới đây để chạy:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendEmail

Xác minh đầu ra

Bạn sẽ thấy thông báo sau trên bảng điều khiển lệnh:

Sent message successfully....

Khi tôi đang gửi email đến địa chỉ gmail của mình thông qua JangoSMTP, thư sau sẽ được nhận trong hộp thư đến tài khoản gmail của tôi:

Đây là một ví dụ để gửi một email có tệp đính kèm từ máy của bạn. Tệp trên máy cục bộ làfile.txtđược đặt tại / home / manisha / . Ở đây chúng tôi đã sử dụng máy chủ JangoSMTP qua đó các email được gửi đến địa chỉ email đích của chúng tôi. Thiết lập được giải thích trong chương Thiết lập Môi trường .

Để gửi email có hình ảnh nội tuyến, các bước sau là:

  • Nhận một phiên

  • Tạo một đối tượng MimeMessage mặc định và đặt Từ, Đến, Chủ đề trong thư.

  • Đặt thông báo thực tế như sau:

    messageBodyPart.setText("This is message body");
  • Tạo một đối tượng MimeMultipart. Thêm thông báo trênBodyPart với thông báo thực tế được đặt trong đó, vào đối tượng nhiều phần này.

  • Tiếp theo, thêm phần đính kèm bằng cách tạo một Datahandler như sau:

    messageBodyPart = new MimeBodyPart();
    String filename = "/home/manisha/file.txt";
    DataSource source = new FileDataSource(filename);
    messageBodyPart.setDataHandler(new DataHandler(source));
    messageBodyPart.setFileName(filename);
    multipart.addBodyPart(messageBodyPart);
  • Tiếp theo, thiết lập nhiều phần trong thông báo như sau:

    message.setContent(multipart);
  • Gửi tin nhắn bằng đối tượng Vận chuyển.

Tạo lớp Java

Tạo tệp lớp java SendAttachmentInEmail, nội dung của nó như sau:

package com.tutorialspoint;

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.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class SendAttachmentInEmail {
   public static void main(String[] args) {
      // Recipient's email ID needs to be mentioned.
      String to = "destinationemail@gmail.com";

      // Sender's email ID needs to be mentioned
      String from = "fromemail@gmail.com";

      final String username = "manishaspatil";//change accordingly
      final String password = "******";//change accordingly

      // Assuming you are sending email through relay.jangosmtp.net
      String host = "relay.jangosmtp.net";

      Properties props = new Properties();
      props.put("mail.smtp.auth", "true");
      props.put("mail.smtp.starttls.enable", "true");
      props.put("mail.smtp.host", host);
      props.put("mail.smtp.port", "25");

      // Get the Session object.
      Session session = Session.getInstance(props,
         new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
               return new PasswordAuthentication(username, password);
            }
         });

      try {
         // Create a default MimeMessage object.
         Message message = new MimeMessage(session);

         // Set From: header field of the header.
         message.setFrom(new InternetAddress(from));

         // Set To: header field of the header.
         message.setRecipients(Message.RecipientType.TO,
            InternetAddress.parse(to));

         // Set Subject: header field
         message.setSubject("Testing Subject");

         // Create the message part
         BodyPart messageBodyPart = new MimeBodyPart();

         // Now set the actual message
         messageBodyPart.setText("This is message body");

         // Create a multipar message
         Multipart multipart = new MimeMultipart();

         // Set text message part
         multipart.addBodyPart(messageBodyPart);

         // Part two is attachment
         messageBodyPart = new MimeBodyPart();
         String filename = "/home/manisha/file.txt";
         DataSource source = new FileDataSource(filename);
         messageBodyPart.setDataHandler(new DataHandler(source));
         messageBodyPart.setFileName(filename);
         multipart.addBodyPart(messageBodyPart);

         // Send the complete message parts
         message.setContent(multipart);

         // Send message
         Transport.send(message);

         System.out.println("Sent message successfully....");
  
      } catch (MessagingException e) {
         throw new RuntimeException(e);
      }
   }
}

Vì chúng tôi đang sử dụng máy chủ SMTP do nhà cung cấp máy chủ lưu trữ JangoSMTP cung cấp, chúng tôi cần xác thực tên người dùng và mật khẩu. Lớp javax.mail.PasswordAuthentication được sử dụng để xác thực mật khẩu.

Biên dịch và Chạy

Bây giờ lớp của chúng ta đã sẵn sàng, chúng ta hãy biên dịch lớp trên. Tôi đã lưu lớp SendAttachmentInEmail.java vào thư mục:/home/manisha/JavaMailAPIExercise. Chúng tôi cần các lọ javax.mail.jaractivation.jar trong classpath. Thực thi lệnh bên dưới để biên dịch lớp (cả hai lọ đều được đặt trong thư mục / home / manisha /) từ dấu nhắc lệnh:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendAttachmentInEmail.java

Bây giờ lớp đã được biên dịch, hãy thực thi lệnh dưới đây để chạy:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendAttachmentInEmail

Xác minh đầu ra

Bạn sẽ thấy thông báo sau trên bảng điều khiển lệnh:

Sent message successfully....

Khi tôi đang gửi email đến địa chỉ gmail của mình thông qua JangoSMTP, thư sau sẽ được nhận trong hộp thư đến tài khoản gmail của tôi:

Đây là một ví dụ để gửi một email HTML từ máy của bạn. Ở đây chúng tôi đã sử dụng máy chủ JangoSMTP qua đó các email được gửi đến địa chỉ email đích của chúng tôi. Thiết lập được giải thích trong chương Thiết lập Môi trường .

Ví dụ này rất giống với việc gửi email đơn giản, ngoại trừ việc ở đây chúng ta đang sử dụng phương thức setContent () để đặt nội dung có đối số thứ hai là "text / html" để chỉ định rằng nội dung HTML được bao gồm trong thư. Sử dụng ví dụ này, bạn có thể gửi nội dung HTML lớn như bạn muốn.

Để gửi một email có nội dung HTML, các bước sau là:

  • Nhận một phiên

  • Tạo một đối tượng MimeMessage mặc định và đặt Từ, Đến, Chủ đề trong thư.

  • Đặt thông báo thực tế bằng phương thức setContent () như sau:

    message.setContent("<h1>This is actual message embedded in 
       HTML tags</h1>", "text/html");
  • Gửi tin nhắn bằng đối tượng Vận chuyển.

Tạo lớp Java

Tạo tệp lớp java SendHTMLEmail, nội dung của nó như sau:

package com.tutorialspoint;

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.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendHTMLEmail {
   public static void main(String[] args) {
      // Recipient's email ID needs to be mentioned.
      String to = "destinationemail@gmail.com";

      // Sender's email ID needs to be mentioned
      String from = "fromemail@gmail.com";
      final String username = "manishaspatil";//change accordingly
      final String password = "******";//change accordingly

      // Assuming you are sending email through relay.jangosmtp.net
      String host = "relay.jangosmtp.net";

      Properties props = new Properties();
      props.put("mail.smtp.auth", "true");
      props.put("mail.smtp.starttls.enable", "true");
      props.put("mail.smtp.host", host);
      props.put("mail.smtp.port", "25");

      // Get the Session object.
      Session session = Session.getInstance(props,
         new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
               return new PasswordAuthentication(username, password);
            }
	});

      try {
            // Create a default MimeMessage object.
            Message message = new MimeMessage(session);

   	   // Set From: header field of the header.
	   message.setFrom(new InternetAddress(from));

	   // Set To: header field of the header.
	   message.setRecipients(Message.RecipientType.TO,
              InternetAddress.parse(to));

	   // Set Subject: header field
	   message.setSubject("Testing Subject");

	   // Send the actual HTML message, as big as you like
	   message.setContent(
              "<h1>This is actual message embedded in HTML tags</h1>",
             "text/html");

	   // Send message
	   Transport.send(message);

	   System.out.println("Sent message successfully....");

      } catch (MessagingException e) {
	   e.printStackTrace();
	   throw new RuntimeException(e);
      }
   }
}

Vì chúng tôi đang sử dụng máy chủ SMTP do nhà cung cấp máy chủ lưu trữ JangoSMTP cung cấp, chúng tôi cần xác thực tên người dùng và mật khẩu. Lớp javax.mail.PasswordAuthentication được sử dụng để xác thực mật khẩu.

Biên dịch và Chạy

Bây giờ lớp của chúng ta đã sẵn sàng, chúng ta hãy biên dịch lớp trên. Tôi đã lưu lớp SendHTMLEmail.java vào thư mục:/home/manisha/JavaMailAPIExercise. Chúng tôi cần các lọ javax.mail.jaractivation.jar trong classpath. Thực thi lệnh bên dưới để biên dịch lớp (cả hai lọ đều được đặt trong thư mục / home / manisha /) từ dấu nhắc lệnh:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendHTMLEmail.java

Bây giờ lớp đã được biên dịch, hãy thực thi lệnh dưới đây để chạy:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendHTMLEmail

Xác minh đầu ra

Bạn sẽ thấy thông báo sau trên bảng điều khiển lệnh:

Sent message successfully....

Khi tôi đang gửi email đến địa chỉ gmail của mình thông qua JangoSMTP, thư sau sẽ được nhận trong hộp thư đến tài khoản gmail của tôi:

Đây là một ví dụ để gửi một email HTML từ máy của bạn với hình ảnh nội tuyến. Ở đây chúng tôi đã sử dụng máy chủ JangoSMTP qua đó các email được gửi đến địa chỉ email đích của chúng tôi. Thiết lập được giải thích trong chương Thiết lập Môi trường .

Để gửi email có hình ảnh nội tuyến, các bước sau là:

  • Nhận một phiên

  • Tạo một đối tượng MimeMessage mặc định và đặt Từ, Đến, Chủ đề trong thư.

  • Tạo một đối tượng MimeMultipart.

  • Trong ví dụ của chúng tôi, chúng tôi sẽ có một phần HTML và một Hình ảnh trong email. Vì vậy, trước tiên hãy tạo nội dung HTML và đặt nó trong đối tượng nhiều phần là:

    // first part (the html)
    BodyPart messageBodyPart = new MimeBodyPart();
    String htmlText = "<H1>Hello</H1><img src=\"cid:image\">";
    messageBodyPart.setContent(htmlText, "text/html");
    // add it
    multipart.addBodyPart(messageBodyPart);
  • Tiếp theo, thêm hình ảnh bằng cách tạo Datahandler như sau:

    // second part (the image)
    messageBodyPart = new MimeBodyPart();
    DataSource fds = new FileDataSource(
     "/home/manisha/javamail-mini-logo.png");
    
    messageBodyPart.setDataHandler(new DataHandler(fds));
    messageBodyPart.setHeader("Content-ID", "<image>");
  • Tiếp theo, thiết lập nhiều phần trong thông báo như sau:

    message.setContent(multipart);
  • Gửi tin nhắn bằng đối tượng Vận chuyển.

Tạo lớp Java

Tạo tệp lớp java SendInlineImagesInEmail, nội dung của nó như sau:

package com.tutorialspoint;

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.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class SendInlineImagesInEmail {
   public static void main(String[] args) {
      // Recipient's email ID needs to be mentioned.
      String to = "destinationemail@gmail.com";

      // Sender's email ID needs to be mentioned
      String from = "fromemail@gmail.com";
      final String username = "manishaspatil";//change accordingly
      final String password = "******";//change accordingly

      // Assuming you are sending email through relay.jangosmtp.net
      String host = "relay.jangosmtp.net";

      Properties props = new Properties();
      props.put("mail.smtp.auth", "true");
      props.put("mail.smtp.starttls.enable", "true");
      props.put("mail.smtp.host", host);
      props.put("mail.smtp.port", "25");

      Session session = Session.getInstance(props,
         new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
               return new PasswordAuthentication(username, password);
            }
         });

      try {

         // Create a default MimeMessage object.
         Message message = new MimeMessage(session);

         // Set From: header field of the header.
         message.setFrom(new InternetAddress(from));

         // Set To: header field of the header.
         message.setRecipients(Message.RecipientType.TO,
            InternetAddress.parse(to));

         // Set Subject: header field
         message.setSubject("Testing Subject");

         // This mail has 2 part, the BODY and the embedded image
         MimeMultipart multipart = new MimeMultipart("related");

         // first part (the html)
         BodyPart messageBodyPart = new MimeBodyPart();
         String htmlText = "<H1>Hello</H1><img src=\"cid:image\">";
         messageBodyPart.setContent(htmlText, "text/html");
         // add it
         multipart.addBodyPart(messageBodyPart);

         // second part (the image)
         messageBodyPart = new MimeBodyPart();
         DataSource fds = new FileDataSource(
            "/home/manisha/javamail-mini-logo.png");

         messageBodyPart.setDataHandler(new DataHandler(fds));
         messageBodyPart.setHeader("Content-ID", "<image>");

         // add image to the multipart
         multipart.addBodyPart(messageBodyPart);

         // put everything together
         message.setContent(multipart);
         // Send message
         Transport.send(message);

         System.out.println("Sent message successfully....");

      } catch (MessagingException e) {
         throw new RuntimeException(e);
      }
   }
}

Vì chúng tôi đang sử dụng máy chủ SMTP do nhà cung cấp máy chủ lưu trữ JangoSMTP cung cấp, chúng tôi cần xác thực tên người dùng và mật khẩu. Lớp javax.mail.PasswordAuthentication được sử dụng để xác thực mật khẩu.

Biên dịch và Chạy

Bây giờ lớp của chúng ta đã sẵn sàng, chúng ta hãy biên dịch lớp trên. Tôi đã lưu lớp SendInlineImagesInEmail.java vào thư mục:/home/manisha/JavaMailAPIExercise. Chúng tôi cần các lọ javax.mail.jaractivation.jar trong classpath. Thực thi lệnh bên dưới để biên dịch lớp (cả hai lọ đều được đặt trong thư mục / home / manisha /) từ dấu nhắc lệnh:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendInlineImagesInEmail.java

Bây giờ lớp đã được biên dịch, hãy thực thi lệnh dưới đây để chạy:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendInlineImagesInEmail

Xác minh đầu ra

Bạn sẽ thấy thông báo sau trên bảng điều khiển lệnh:

Sent message successfully....

Khi tôi đang gửi email đến địa chỉ gmail của mình thông qua JangoSMTP, thư sau sẽ được nhận trong hộp thư đến tài khoản gmail của tôi:

Có hai khía cạnh cần phải hiểu trước khi tiếp tục với chương này. họ đangCheckFetch.

  • Checknhập email trong JavaMail là một quá trình mà chúng tôi mở thư mục tương ứng trong hộp thư và nhận từng thư. Ở đây chúng tôi chỉ kiểm tra tiêu đề của mỗi thư tức là Từ, Đến, chủ đề . Nội dung không được đọc.

  • Fetchnhập email trong JavaMail là một quá trình mà chúng tôi mở thư mục tương ứng trong hộp thư và nhận từng thư. Cùng với tiêu đề, chúng tôi cũng đọc nội dung bằng cách nhận dạng loại nội dung.

Để kiểm tra hoặc tìm nạp email bằng JavaMail API, chúng tôi cần máy chủ POP hoặc IMAP. Để kiểm tra và tìm nạp email, cần có các lớp Thư mục và Lưu trữ. Ở đây chúng tôi đã sử dụng máy chủ POP3 của GMAIL (pop.gmail.com). Trong chương này sẽ học cách kiểm tra email bằng JavaMail API. Tìm nạp sẽ được đề cập trong các chương tiếp theo. Để kiểm tra email:

  • Nhận một phiên

  • Tạo đối tượng pop3 Store và kết nối với máy chủ pop.

  • Tạo đối tượng thư mục. Mở thư mục thích hợp trong hộp thư của bạn.

  • Nhận tin nhắn của bạn.

  • Đóng các đối tượng Store và Folder.

Tạo lớp Java

Tạo tệp lớp java CheckingMails, nội dung của nó như sau:

package com.tutorialspoint;

import java.util.Properties;

import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;

public class CheckingMails {

   public static void check(String host, String storeType, String user,
      String password) 
   {
      try {

      //create properties field
      Properties properties = new Properties();

      properties.put("mail.pop3.host", host);
      properties.put("mail.pop3.port", "995");
      properties.put("mail.pop3.starttls.enable", "true");
      Session emailSession = Session.getDefaultInstance(properties);
  
      //create the POP3 store object and connect with the pop server
      Store store = emailSession.getStore("pop3s");

      store.connect(host, user, password);

      //create the folder object and open it
      Folder emailFolder = store.getFolder("INBOX");
      emailFolder.open(Folder.READ_ONLY);

      // retrieve the messages from the folder in an array and print it
      Message[] messages = emailFolder.getMessages();
      System.out.println("messages.length---" + messages.length);

      for (int i = 0, n = messages.length; i < n; i++) {
         Message message = messages[i];
         System.out.println("---------------------------------");
         System.out.println("Email Number " + (i + 1));
         System.out.println("Subject: " + message.getSubject());
         System.out.println("From: " + message.getFrom()[0]);
         System.out.println("Text: " + message.getContent().toString());

      }

      //close the store and folder objects
      emailFolder.close(false);
      store.close();

      } catch (NoSuchProviderException e) {
         e.printStackTrace();
      } catch (MessagingException e) {
         e.printStackTrace();
      } catch (Exception e) {
         e.printStackTrace();
      }
   }

   public static void main(String[] args) {

      String host = "pop.gmail.com";// change accordingly
      String mailStoreType = "pop3";
      String username = "yourmail@gmail.com";// change accordingly
      String password = "*****";// change accordingly

      check(host, mailStoreType, username, password);

   }

}

Biên dịch và Chạy

Bây giờ lớp của chúng ta đã sẵn sàng, chúng ta hãy biên dịch lớp trên. Tôi đã lưu lớp CheckMails.java vào thư mục:/home/manisha/JavaMailAPIExercise. Chúng tôi cần các lọ javax.mail.jaractivation.jar trong classpath. Thực thi lệnh bên dưới để biên dịch lớp (cả hai lọ đều được đặt trong thư mục / home / manisha /) từ dấu nhắc lệnh:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: CheckingMails.java

Bây giờ lớp đã được biên dịch, hãy thực thi lệnh dưới đây để chạy:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: CheckingMails

Xác minh đầu ra

Bạn sẽ thấy thông báo sau trên bảng điều khiển lệnh:

messages.length---4
---------------------------------
Email Number 1
Subject: Test Mail--Fetch
From: <abcd@gmail.com>
Text: javax.mail.internet.MimeMultipart@327a5b7f
---------------------------------
Email Number 2
Subject: testing ----checking simple email
From: <abcd@gmail.com>
Text: javax.mail.internet.MimeMultipart@7f0d08bc
---------------------------------
Email Number 3
Subject: Email with attachment
From: <abcd@gmail.com>
Text: javax.mail.internet.MimeMultipart@30b8afce
---------------------------------
Email Number 4
Subject: Email with Inline image
From: <abcd@gmail.com>
Text: javax.mail.internet.MimeMultipart@2d1e165f

Ở đây chúng tôi đã in số lượng tin nhắn trong INBOX là 4 trong trường hợp này. Chúng tôi cũng đã in Chủ đề, Địa chỉ từ và Văn bản cho mỗi email.

Trong chương trước, chúng ta đã học cách kiểm tra email. Bây giờ chúng ta hãy xem cách tìm nạp từng email và đọc nội dung của nó. Hãy để chúng tôi viết một lớp JavaFetchingEmail sẽ đọc các loại email sau:

  • Email đơn giản

  • Email có tệp đính kèm

  • Email với hình ảnh nội tuyến

Các bước cơ bản theo sau trong mã như sau:

  • Lấy đối tượng Session.

  • Tạo đối tượng cửa hàng POP3 và kết nối với cửa hàng.

  • Tạo đối tượng Thư mục và mở thư mục thích hợp trong hộp thư của bạn.

  • Lấy tin nhắn.

  • Đóng thư mục và lưu trữ các đối tượng tương ứng.

Tạo lớp Java

Tạo tệp lớp java FetchingEmail, nội dung trong số đó như sau:

package com.tutorialspoint;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Properties;

import javax.mail.Address;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;

public class FetchingEmail {

   public static void fetch(String pop3Host, String storeType, String user,
      String password) {
      try {
         // create properties field
         Properties properties = new Properties();
         properties.put("mail.store.protocol", "pop3");
         properties.put("mail.pop3.host", pop3Host);
         properties.put("mail.pop3.port", "995");
         properties.put("mail.pop3.starttls.enable", "true");
         Session emailSession = Session.getDefaultInstance(properties);
         // emailSession.setDebug(true);

         // create the POP3 store object and connect with the pop server
         Store store = emailSession.getStore("pop3s");

         store.connect(pop3Host, user, password);

         // create the folder object and open it
         Folder emailFolder = store.getFolder("INBOX");
         emailFolder.open(Folder.READ_ONLY);

         BufferedReader reader = new BufferedReader(new InputStreamReader(
	      System.in));

         // retrieve the messages from the folder in an array and print it
         Message[] messages = emailFolder.getMessages();
         System.out.println("messages.length---" + messages.length);

         for (int i = 0; i < messages.length; i++) {
            Message message = messages[i];
            System.out.println("---------------------------------");
            writePart(message);
            String line = reader.readLine();
            if ("YES".equals(line)) {
               message.writeTo(System.out);
            } else if ("QUIT".equals(line)) {
               break;
            }
         }

         // close the store and folder objects
         emailFolder.close(false);
         store.close();

      } catch (NoSuchProviderException e) {
         e.printStackTrace();
      } catch (MessagingException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      } catch (Exception e) {
         e.printStackTrace();
      }
}

   public static void main(String[] args) {

      String host = "pop.gmail.com";// change accordingly
      String mailStoreType = "pop3";
      String username = 
         "abc@gmail.com";// change accordingly
      String password = "*****";// change accordingly

      //Call method fetch
      fetch(host, mailStoreType, username, password);

   }

   /*
   * This method checks for content-type 
   * based on which, it processes and
   * fetches the content of the message
   */
   public static void writePart(Part p) throws Exception {
      if (p instanceof Message)
         //Call methos writeEnvelope
         writeEnvelope((Message) p);

      System.out.println("----------------------------");
      System.out.println("CONTENT-TYPE: " + p.getContentType());

      //check if the content is plain text
      if (p.isMimeType("text/plain")) {
         System.out.println("This is plain text");
         System.out.println("---------------------------");
         System.out.println((String) p.getContent());
      } 
      //check if the content has attachment
      else if (p.isMimeType("multipart/*")) {
         System.out.println("This is a Multipart");
         System.out.println("---------------------------");
         Multipart mp = (Multipart) p.getContent();
         int count = mp.getCount();
         for (int i = 0; i < count; i++)
            writePart(mp.getBodyPart(i));
      } 
      //check if the content is a nested message
      else if (p.isMimeType("message/rfc822")) {
         System.out.println("This is a Nested Message");
         System.out.println("---------------------------");
         writePart((Part) p.getContent());
      } 
      //check if the content is an inline image
      else if (p.isMimeType("image/jpeg")) {
         System.out.println("--------> image/jpeg");
         Object o = p.getContent();

         InputStream x = (InputStream) o;
         // Construct the required byte array
         System.out.println("x.length = " + x.available());
         int i = 0;
         byte[] bArray = new byte[x.available()];

         while ((i = (int) ((InputStream) x).available()) > 0) {
            int result = (int) (((InputStream) x).read(bArray));
            if (result == -1)
            break;
         }
         FileOutputStream f2 = new FileOutputStream("/tmp/image.jpg");
         f2.write(bArray);
      } 
      else if (p.getContentType().contains("image/")) {
         System.out.println("content type" + p.getContentType());
         File f = new File("image" + new Date().getTime() + ".jpg");
         DataOutputStream output = new DataOutputStream(
            new BufferedOutputStream(new FileOutputStream(f)));
            com.sun.mail.util.BASE64DecoderStream test = 
                 (com.sun.mail.util.BASE64DecoderStream) p
                  .getContent();
         byte[] buffer = new byte[1024];
         int bytesRead;
         while ((bytesRead = test.read(buffer)) != -1) {
            output.write(buffer, 0, bytesRead);
         }
      } 
      else {
         Object o = p.getContent();
         if (o instanceof String) {
            System.out.println("This is a string");
            System.out.println("---------------------------");
            System.out.println((String) o);
         } 
         else if (o instanceof InputStream) {
            System.out.println("This is just an input stream");
            System.out.println("---------------------------");
            InputStream is = (InputStream) o;
            is = (InputStream) o;
            int c;
            while ((c = is.read()) != -1)
               System.out.write(c);
         } 
         else {
            System.out.println("This is an unknown type");
            System.out.println("---------------------------");
            System.out.println(o.toString());
         }
   }

}
   /*
   * This method would print FROM,TO and SUBJECT of the message
   */
   public static void writeEnvelope(Message m) throws Exception {
      System.out.println("This is the message envelope");
      System.out.println("---------------------------");
      Address[] a;

      // FROM
      if ((a = m.getFrom()) != null) {
         for (int j = 0; j < a.length; j++)
         System.out.println("FROM: " + a[j].toString());
      }

      // TO
      if ((a = m.getRecipients(Message.RecipientType.TO)) != null) {
         for (int j = 0; j < a.length; j++)
         System.out.println("TO: " + a[j].toString());
      }

      // SUBJECT
      if (m.getSubject() != null)
         System.out.println("SUBJECT: " + m.getSubject());

   }

}
Bạn có thể bật gỡ lỗi bằng cách bỏ ghi chú câu lệnh emailSession.setDebug (true);

Biên dịch và Chạy

Bây giờ lớp của chúng ta đã sẵn sàng, chúng ta hãy biên dịch lớp trên. Tôi đã lưu lớp FetchingEmail.java vào thư mục:/home/manisha/JavaMailAPIExercise. Chúng tôi cần các lọ javax.mail.jaractivation.jar trong classpath. Thực thi lệnh bên dưới để biên dịch lớp (cả hai lọ đều được đặt trong thư mục / home / manisha /) từ dấu nhắc lệnh:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: FetchingEmail.java

Bây giờ lớp đã được biên dịch, hãy thực thi lệnh dưới đây để chạy:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: FetchingEmail

Xác minh đầu ra

Bạn sẽ thấy thông báo sau trên bảng điều khiển lệnh:

messages.length---3
---------------------------------
This is the message envelope
---------------------------
FROM: XYZ <xyz@gmail.com>
TO: ABC <abc@gmail.com>
SUBJECT: Simple Message
----------------------------
CONTENT-TYPE: multipart/alternative; boundary=047d7b343d6ad3e4ea04e8ec6579
This is a Multipart
---------------------------

----------------------------
CONTENT-TYPE: text/plain; charset=ISO-8859-1
This is plain text
---------------------------
Hi am a simple message string....

-- 
Regards
xyz

This is the message envelope
---------------------------
FROM: XYZ <xyz@gmail.com>
TO: ABC <abc@gmail.com>
SUBJECT: Attachement
----------------------------
CONTENT-TYPE: multipart/mixed; boundary=047d7b343d6a99180904e8ec6751
This is a Multipart
---------------------------

----------------------------
CONTENT-TYPE: text/plain; charset=ISO-8859-1
This is plain text
---------------------------
Hi I've an attachment.Please check

-- 
Regards
XYZ

----------------------------
CONTENT-TYPE: application/octet-stream; name=sample_attachement
This is just an input stream
---------------------------
Submit your Tutorials, White Papers and Articles into our Tutorials Directory. This is a tutorials database where we are keeping all the tutorials shared by the internet community for the benefit of others.


This is the message envelope
---------------------------
FROM: XYZ <xyz@gmail.com>
TO: ABC <abc@gmail.com>
SUBJECT: Inline Image
----------------------------
CONTENT-TYPE: multipart/related; boundary=f46d04182582be803504e8ece94b
This is a Multipart
---------------------------

----------------------------
CONTENT-TYPE: text/plain; charset=ISO-8859-1
This is plain text
---------------------------
Hi I've an inline image


[image: Inline image 3]

-- 
Regards
XYZ

----------------------------
CONTENT-TYPE: image/png; name="javamail-mini-logo.png"
content typeimage/png; name="javamail-mini-logo.png"

Ở đây bạn có thể thấy có ba email trong hộp thư của chúng tôi. Đầu tiên là một thư đơn giản với thông báo "Xin chào là một chuỗi tin nhắn đơn giản ....". Thư thứ hai có tệp đính kèm. Nội dung của tệp đính kèm cũng được in như đã thấy ở trên. Thư thứ ba có hình ảnh nội tuyến.

Chúng tôi sẽ sửa đổi CheckMails.java của mình từ chương Kiểm tra Email . Nội dung của nó như sau:

package com.tutorialspoint;

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;

public class CheckingMails {

   public static void check(String host, String storeType, String user,
      String password) 
   {
      try {

      // create properties field
      Properties properties = new Properties();

      properties.put("mail.pop3s.host", host);
      properties.put("mail.pop3s.port", "995");
      properties.put("mail.pop3s.starttls.enable", "true");

      // Setup authentication, get session
      Session emailSession = Session.getInstance(properties,
         new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
               return new PasswordAuthentication(
                  "manishapatil3may@gmail.com", "manisha123");
            }
         });
      // emailSession.setDebug(true);

      // create the POP3 store object and connect with the pop server
      Store store = emailSession.getStore("pop3s");

      store.connect();

      // create the folder object and open it
      Folder emailFolder = store.getFolder("INBOX");
      emailFolder.open(Folder.READ_ONLY);

      // retrieve the messages from the folder in an array and print it
      Message[] messages = emailFolder.getMessages();
      System.out.println("messages.length---" + messages.length);

      for (int i = 0, n = messages.length; i < n; i++) {
         Message message = messages[i];
         System.out.println("---------------------------------");
         System.out.println("Email Number " + (i + 1));
         System.out.println("Subject: " + message.getSubject());
         System.out.println("From: " + message.getFrom()[0]);
         System.out.println("Text: " + message.getContent().toString());
      }

      // close the store and folder objects
      emailFolder.close(false);
      store.close();

      } catch (NoSuchProviderException e) {
         e.printStackTrace();
      } catch (MessagingException e) {
         e.printStackTrace();
      } catch (Exception e) {
         e.printStackTrace();
      }
   }

   public static void main(String[] args) {

      String host = "pop.gmail.com";// change accordingly
      String mailStoreType = "pop3";
      String username = "abc@gmail.com";// change accordingly
      String password = "*****";// change accordingly

      check(host, mailStoreType, username, password);

   }

}
Bạn có thể bật gỡ lỗi bằng cách bỏ ghi chú câu lệnh emailSession.setDebug (true);

Biên dịch và Chạy

Bây giờ lớp của chúng ta đã sẵn sàng, chúng ta hãy biên dịch lớp trên. Tôi đã lưu lớp CheckMails.java vào thư mục:/home/manisha/JavaMailAPIExercise. Chúng tôi cần các lọ javax.mail.jaractivation.jar trong classpath. Thực thi lệnh bên dưới để biên dịch lớp (cả hai lọ đều được đặt trong thư mục / home / manisha /) từ dấu nhắc lệnh:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: CheckingMails.java

Bây giờ lớp đã được biên dịch, hãy thực thi lệnh dưới đây để chạy:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: CheckingMails

Xác minh đầu ra

Bạn có thể thấy một thông báo tương tự như bên dưới trên bảng điều khiển lệnh:

messages.length---3
---------------------------------
Email Number 1
Subject: Today is a nice day
From: XYZ <xyz@gmail.com>
Text: javax.mail.internet.MimeMultipart@45f676cb
---------------------------------
Email Number 2
Subject: hiiii....
From: XYZ <xyz@gmail.com>
Text: javax.mail.internet.MimeMultipart@37f12d4f
---------------------------------
Email Number 3
Subject: helloo
From: XYZ <xyz@gmail.com>
Text: javax.mail.internet.MimeMultipart@3ad5ba3a

Trong chương này, chúng ta sẽ xem cách trả lời email bằng JavaMail API. Các bước cơ bản được thực hiện trong chương trình dưới đây là:

  • Lấy đối tượng Session với chi tiết máy chủ POP và SMTP trong thuộc tính. Chúng tôi sẽ cần chi tiết POP để truy xuất tin nhắn và chi tiết SMTP để gửi tin nhắn.

  • Tạo đối tượng cửa hàng POP3 và kết nối với cửa hàng.

  • Tạo đối tượng Thư mục và mở thư mục thích hợp trong hộp thư của bạn.

  • Lấy tin nhắn.

  • Lặp lại các tin nhắn và nhập "Y" hoặc "y" nếu bạn muốn trả lời.

  • Nhận tất cả thông tin (Đến, Từ, Chủ đề, Nội dung) của thư.

  • Tạo tin nhắn trả lời, sử dụng phương thức Message.reply (). Phương pháp này cấu hình một Thư mới với người nhận và chủ đề thích hợp. Phương thức nhận tham số boolean cho biết chỉ trả lời người gửi (sai) hay trả lời tất cả (đúng).

  • Đặt Từ, Văn bản và Trả lời trong tin nhắn và gửi nó thông qua phiên bản của đối tượng Vận chuyển.

  • Đóng các đối tượng Truyền tải, thư mục và lưu trữ tương ứng.

Ở đây chúng tôi đã sử dụng máy chủ JangoSMTP qua đó các email được gửi đến địa chỉ email đích của chúng tôi. Thiết lập được giải thích trong chương Thiết lập Môi trường .

Tạo lớp Java

Tạo tệp lớp java ReplyToEmail, nội dung của nó như sau:

package com.tutorialspoint;

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

   }

}
Bạn có thể bật gỡ lỗi bằng cách bỏ ghi chú câu lệnh session.setDebug (true);

Biên dịch và Chạy

Bây giờ lớp của chúng ta đã sẵn sàng, chúng ta hãy biên dịch lớp trên. Tôi đã lưu lớp ReplyToEmail.java vào thư mục:/home/manisha/JavaMailAPIExercise. Chúng tôi cần các lọ javax.mail.jaractivation.jar trong classpath. Thực thi lệnh bên dưới để biên dịch lớp (cả hai lọ đều được đặt trong thư mục / home / manisha /) từ dấu nhắc lệnh:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: ReplyToEmail.java

Bây giờ lớp đã được biên dịch, hãy thực thi lệnh sau để chạy:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: ReplyToEmail

Xác minh đầu ra

Bạn sẽ thấy thông báo sau trên bảng điều khiển lệnh:

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 ....

Kiểm tra hộp thư đến mà thư đã được gửi đến. Trong trường hợp của chúng tôi, thông báo nhận được trông như sau:

Trong chương này, chúng ta sẽ xem cách chuyển tiếp một email bằng JavaMail API. Các bước cơ bản được thực hiện trong chương trình dưới đây là:

  • Lấy đối tượng Session với chi tiết máy chủ POP và SMTP trong thuộc tính. Chúng tôi sẽ cần chi tiết POP để truy xuất tin nhắn và chi tiết SMTP để gửi tin nhắn.

  • Tạo đối tượng cửa hàng POP3 và kết nối với cửa hàng.

  • Tạo đối tượng Thư mục và mở thư mục thích hợp trong hộp thư của bạn.

  • Lấy tin nhắn.

  • Lặp lại các tin nhắn và nhập "Y" hoặc "y" nếu bạn muốn chuyển tiếp.

  • Nhận tất cả thông tin (Đến, Từ, Chủ đề, Nội dung) của thư.

  • Xây dựng thông điệp chuyển tiếp bằng cách làm việc với các phần tạo nên thông điệp. Phần đầu tiên sẽ là nội dung của tin nhắn và phần thứ hai sẽ là tin nhắn để chuyển tiếp. Kết hợp cả hai thành một phần. Sau đó, bạn thêm phần nhiều vào một tin nhắn được gửi đúng địa chỉ và gửi nó.

  • Đóng các đối tượng Truyền tải, thư mục và lưu trữ tương ứng.

Ở đây chúng tôi đã sử dụng máy chủ JangoSMTP qua đó các email được gửi đến địa chỉ email đích của chúng tôi. Thiết lập được giải thích trong chương Thiết lập Môi trường .

Tạo lớp Java

Tạo tệp lớp java ForwardEmail, nội dung của nó như sau:

package com.tutorialspoint;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Properties;

import javax.mail.BodyPart;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class ForwardEmail {

   public static void main(String[] args) {
      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.host", "relay.jangosmtp.net");
      properties.put("mail.smtp.port", "25");
      Session session = Session.getDefaultInstance(properties);
      try {
         // session.setDebug(true);
         // 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

         // Create a Folder object and open the folder
         Folder folder = store.getFolder("inbox");
         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];
            // 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 forward = new MimeMessage(session);
               // Fill in header
               forward.setRecipients(Message.RecipientType.TO,
               InternetAddress.parse(from));
               forward.setSubject("Fwd: " + message.getSubject());
               forward.setFrom(new InternetAddress(to));

               // Create the message part
               MimeBodyPart messageBodyPart = new MimeBodyPart();
               // Create a multipart message
               Multipart multipart = new MimeMultipart();
               // set content
               messageBodyPart.setContent(message, "message/rfc822");
               // Add part to multi part
               multipart.addBodyPart(messageBodyPart);
               // Associate multi-part with message
               forward.setContent(multipart);
               forward.saveChanges();

               // 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 SMTP server using transport instance
		  //change the user and password accordingly
                  t.connect("abc", "*****");
                  t.sendMessage(forward, forward.getAllRecipients());
               } finally {
                  t.close();
               }

               System.out.println("message forwarded successfully....");

            // close the store and folder objects
            folder.close(false);
            store.close();
            }// end if

         }// end for
   }// end if
   } catch (Exception e) {
      e.printStackTrace();
   }
}

}
Bạn có thể bật gỡ lỗi bằng cách bỏ ghi chú câu lệnh session.setDebug (true);

Biên dịch và Chạy

Bây giờ lớp của chúng ta đã sẵn sàng, chúng ta hãy biên dịch lớp trên. Tôi đã lưu lớp ForwardEmail.java vào thư mục:/home/manisha/JavaMailAPIExercise. Chúng tôi cần các lọ javax.mail.jaractivation.jar trong classpath. Thực thi lệnh bên dưới để biên dịch lớp (cả hai lọ đều được đặt trong thư mục / home / manisha /) từ dấu nhắc lệnh:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: ForwardEmail.java

Bây giờ lớp đã được biên dịch, hãy thực thi lệnh sau để chạy:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: ForwardEmail

Xác minh đầu ra

Bạn sẽ thấy thông báo sau trên bảng điều khiển lệnh:

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 forwarded successfully....

Kiểm tra hộp thư đến mà thư đã được gửi đến. Trong trường hợp của chúng tôi, thư được chuyển tiếp sẽ trông như sau:

Trong chương này, chúng ta sẽ xem cách xóa email bằng JavaMail API. Xóa tin nhắn liên quan đến việc làm việc với các Cờ được liên kết với tin nhắn. Có các cờ khác nhau cho các trạng thái khác nhau, một số do hệ thống xác định và một số do người dùng xác định. Các cờ xác định trước được định nghĩa trong Flags.Flag lớp bên trong và được liệt kê bên dưới:

  • Flags.Flag.ANSWERED

  • Flags.Flag.DELETED

  • Flags.Flag.DRAFT

  • Flags.Flag.FLAGGED

  • Flags.Flag.RECENT

  • Flags.Flag.SEEN

  • Flags.Flag.USER

Giao thức POP chỉ hỗ trợ xóa tin nhắn.

Các bước cơ bản sau trong chương trình xóa là:

  • Lấy đối tượng Session với chi tiết máy chủ POP và SMTP trong thuộc tính. Chúng tôi sẽ cần chi tiết POP để truy xuất tin nhắn và chi tiết SMTP để gửi tin nhắn.

  • Tạo đối tượng cửa hàng POP3 và kết nối với cửa hàng.

  • Tạo đối tượng Thư mục và mở thư mục thích hợp trong hộp thư của bạn ở chế độ READ_WRITE.

  • Lấy tin nhắn từ thư mục hộp thư đến.

  • Lặp lại các thông báo và nhập "Y" hoặc "y" nếu bạn muốn xóa thông báo bằng cách gọi phương thức setFlag (Flags.Flag.DELETED, true) trên đối tượng Message.

  • Các thư được đánh dấu DELETED sẽ không thực sự bị xóa, cho đến khi chúng ta gọi phương thức expunge () trên đối tượng Folder hoặc đóng thư mục với expunge được đặt thành true.

  • Đóng đối tượng cửa hàng.

Tạo lớp Java

Tạo tệp lớp java ForwardEmail, nội dung của nó như sau:

package com.tutorialspoint;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;

import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;

public class DeleteEmail {

   public static void delete(String pop3Host, String storeType, String user,
      String password) 
   {
      try 
      {
         // get the session object
         Properties properties = new Properties();
         properties.put("mail.store.protocol", "pop3");
         properties.put("mail.pop3s.host", pop3Host);
         properties.put("mail.pop3s.port", "995");
         properties.put("mail.pop3.starttls.enable", "true");
         Session emailSession = Session.getDefaultInstance(properties);
         // emailSession.setDebug(true);

         // create the POP3 store object and connect with the pop server
         Store store = emailSession.getStore("pop3s");

         store.connect(pop3Host, user, password);

         // create the folder object and open it
         Folder emailFolder = store.getFolder("INBOX");
         emailFolder.open(Folder.READ_WRITE);

         BufferedReader reader = new BufferedReader(new InputStreamReader(
            System.in));
         // retrieve the messages from the folder in an array and print it
         Message[] messages = emailFolder.getMessages();
         System.out.println("messages.length---" + messages.length);
         for (int i = 0; i < messages.length; i++) {
            Message message = messages[i];
            System.out.println("---------------------------------");
            System.out.println("Email Number " + (i + 1));
            System.out.println("Subject: " + message.getSubject());
            System.out.println("From: " + message.getFrom()[0]);

            String subject = message.getSubject();
            System.out.print("Do you want to delete this message [y/n] ? ");
            String ans = reader.readLine();
            if ("Y".equals(ans) || "y".equals(ans)) {
	       // set the DELETE flag to true
	       message.setFlag(Flags.Flag.DELETED, true);
	       System.out.println("Marked DELETE for message: " + subject);
            } else if ("n".equals(ans)) {
	       break;
            }
         }
         // expunges the folder to remove messages which are marked deleted
         emailFolder.close(true);
         store.close();

      } catch (NoSuchProviderException e) {
         e.printStackTrace();
      } catch (MessagingException e) {
         e.printStackTrace();
      } catch (IOException io) {
         io.printStackTrace();
      }
   }

   public static void main(String[] args) {

      String host = "pop.gmail.com";// change accordingly
      String mailStoreType = "pop3";
      String username = "abc@gmail.com";// change accordingly
      String password = "*****";// change accordingly

      delete(host, mailStoreType, username, password);

   }

}
Bạn có thể bật gỡ lỗi bằng cách bỏ ghi chú câu lệnh emailSession.setDebug (true);

Biên dịch và Chạy

Bây giờ lớp của chúng ta đã sẵn sàng, chúng ta hãy biên dịch lớp trên. Tôi đã lưu lớp DeleteEmail.java vào thư mục:/home/manisha/JavaMailAPIExercise. Chúng tôi cần các lọ javax.mail.jaractivation.jar trong classpath. Thực thi lệnh bên dưới để biên dịch lớp (cả hai lọ đều được đặt trong thư mục / home / manisha /) từ dấu nhắc lệnh:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: DeleteEmail.java

Bây giờ lớp đã được biên dịch, hãy thực thi lệnh sau để chạy:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: DeleteEmail

Xác minh đầu ra

Bạn sẽ thấy thông báo sau trên bảng điều khiển lệnh:

messages.length---1
---------------------------------
Email Number 1
Subject: Testing
From: ABC <abc@gmail.com>
Do you want to delete this message [y/n] ? y
Marked DELETE for message: Testing

Trong tất cả các chương trước, chúng tôi đã sử dụng máy chủ JangoSMTP để gửi email. Trong chương này, chúng ta sẽ tìm hiểu về máy chủ SMTP do Gmail cung cấp. Gmail (trong số các dịch vụ khác) cung cấp miễn phí sử dụng máy chủ SMTP công cộng của họ.

Thông tin chi tiết về máy chủ SMTP của Gmail có thể được tìm thấy tại đây . Như bạn có thể thấy trong chi tiết, chúng tôi có thể sử dụng kết nối TLS hoặc SSL để gửi email qua máy chủ SMTP của Gmail.

Quy trình gửi email bằng máy chủ SMTP của Gmail tương tự như được giải thích trong chương Gửi email , ngoại trừ việc chúng tôi sẽ thay đổi máy chủ lưu trữ. Điều kiện tiên quyết là địa chỉ email của người gửi phải là một tài khoản gmail đang hoạt động. Hãy để chúng tôi thử một ví dụ.

Tạo lớp Java

Tạo một tệp Java SendEmailUsingGMailSMTP, nội dung trong số đó như sau:

package com.tutorialspoint;

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.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendEmailUsingGMailSMTP {
   public static void main(String[] args) {
      // Recipient's email ID needs to be mentioned.
      String to = "xyz@gmail.com";//change accordingly

      // Sender's email ID needs to be mentioned
      String from = "abc@gmail.com";//change accordingly
      final String username = "abc";//change accordingly
      final String password = "*****";//change accordingly

      // Assuming you are sending email through relay.jangosmtp.net
      String host = "smtp.gmail.com";

      Properties props = new Properties();
      props.put("mail.smtp.auth", "true");
      props.put("mail.smtp.starttls.enable", "true");
      props.put("mail.smtp.host", host);
      props.put("mail.smtp.port", "587");

      // Get the Session object.
      Session session = Session.getInstance(props,
      new javax.mail.Authenticator() {
         protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(username, password);
         }
      });

      try {
         // Create a default MimeMessage object.
         Message message = new MimeMessage(session);

         // Set From: header field of the header.
         message.setFrom(new InternetAddress(from));

         // Set To: header field of the header.
         message.setRecipients(Message.RecipientType.TO,
         InternetAddress.parse(to));

         // Set Subject: header field
         message.setSubject("Testing Subject");

         // Now set the actual message
         message.setText("Hello, this is sample for to check send "
            + "email using JavaMailAPI ");

         // Send message
         Transport.send(message);

         System.out.println("Sent message successfully....");

      } catch (MessagingException e) {
            throw new RuntimeException(e);
      }
   }
}

Ở đây máy chủ được đặt là smtp.gmail.com và cổng được đặt là 587 . Ở đây chúng tôi đã kích hoạt kết nối TLS.

Biên dịch và Chạy

Bây giờ lớp của chúng ta đã sẵn sàng, chúng ta hãy biên dịch lớp trên. Tôi đã lưu lớp SendEmailUsingGMailSMTP.java vào thư mục:/home/manisha/JavaMailAPIExercise. Chúng tôi cần các lọ javax.mail.jaractivation.jar trong classpath. Thực thi lệnh bên dưới để biên dịch lớp (cả hai lọ đều được đặt trong thư mục / home / manisha /) từ dấu nhắc lệnh:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendEmailUsingGMailSMTP.java

Bây giờ lớp đã được biên dịch, hãy thực thi lệnh dưới đây để chạy:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendEmailUsingGMailSMTP

Xác minh đầu ra

Bạn sẽ thấy thông báo sau trên bảng điều khiển lệnh:

Sent message successfully....

Cho đến nay, chúng tôi đã làm việc trong các chương trước của chúng tôi chủ yếu với thư mục INBOX. Đây là thư mục mặc định chứa hầu hết các thư. Một số hệ thống có thể gọi nó là INBOX và một số hệ thống khác có thể gọi nó bằng một số tên khác. Tuy nhiên, bạn luôn có thể truy cập nó từ JavaMail API bằng cách sử dụng tên INBOX.

API JavaMail đại diện cho các thư mục dưới dạng các phiên bản của lớp Thư mục trừu tượng:

public abstract class Folder extends Object

Lớp này khai báo các phương thức để yêu cầu các thư mục được đặt tên từ máy chủ, xóa thư khỏi thư mục, tìm kiếm thư cụ thể trong thư mục, liệt kê thư trong một thư mục, v.v.

Mở một thư mục

Chúng tôi không thể tạo một thư mục trực tiếp vì hàm tạo duy nhất trong lớp Thư mục được bảo vệ . Chúng tôi có thể lấy một Thư mục từ:

  • một phiên

  • một cửa hàng

  • hoặc một Thư mục khác

Tất cả các lớp trên đều có một phương thức getFolder () tương tự với chữ ký tương tự:

public abstract Folder getFolder(String name) throws MessagingException

Một số phương pháp giúp lấy đối tượng Thư mục là:

phương pháp Sự miêu tả
boolean tồn tại () Kiểm tra xem thư mục có thực sự tồn tại hay không. Sử dụng phương pháp này trước khi lấy đối tượng Thư mục.
void mở trừu tượng (int mode) Khi bạn nhận được một Thư mục , nó sẽ đóng lại. Sử dụng phương pháp này để mở nó. chế độ có thể là Folder.READ_ONLY hoặc Folder.READ_WRITE.
trừu tượng boolean isOpen () Phương thức này trả về true nếu thư mục đang mở, false nếu nó bị đóng
trừu tượng void close (boolean expunge) Đóng thư mục. Nếu đối số xóađúng , mọi thư đã xóa trong thư mục sẽ bị xóa khỏi tệp thực trên máy chủ. Nếu không, chúng chỉ được đánh dấu là đã xóa , nhưng các tin nhắn vẫn có thể bị xóa.

Thông tin thư mục cơ bản

Sau đây là một số phương thức trong lớp Thư mục trả về thông tin cơ bản về một thư mục:

phương pháp Sự miêu tả
trừu tượng String getName () Trả về tên của thư mục, chẳng hạn như "TutorialsPoint Mail"
trừu tượng String getFullName () Trả về tên phân cấp hoàn chỉnh từ gốc, chẳng hạn như “books / Manisha / TutorialsPoint Mail”.
URLName getURLName () Trả về URLName đại diện cho thư mục này.
Thư mục trừu tượng getParent () Trả về tên của thư mục chứa thư mục này tức là thư mục mẹ. Ví dụ: "Manisha" từ ví dụ "TutorialsPoint Mail" trước đó.
trừu tượng int getType () Trả về một int cho biết liệu thư mục có thể chứa thư và / hoặc các thư mục khác hay không.
int getMode () Nó trả về một trong hai hằng số được đặt tên là Folder.READ_ONLY hoặc Folder.READ_WRITE hoặc -1 khi chế độ không xác định.
Cửa hàng getStore () Trả về đối tượng Store mà từ đó thư mục này được truy xuất.
trừu tượng char getSeparator () Trả về ký tự dấu phân tách phân tách tên đường dẫn của Thư mục này với tên của các thư mục con ngay lập tức.

Quản lý Thư mục

Sau đây là một số phương pháp giúp quản lý Thư mục:

phương pháp Sự miêu tả
trừu tượng boolean tạo (kiểu int) Thao tác này sẽ tạo một thư mục mới trong Cửa hàng của thư mục này. Trong trường hợp loại sẽ là: Folder.HOLDS_MESSAGES hoặc Folder.HOLDS_FOLDERS. Trả về true nếu thư mục được tạo thành công, ngược lại trả về false .
boolean xóa trừu tượng (boolean recurse) Thao tác này chỉ xóa thư mục nếu thư mục bị đóng. Nếu không, nó sẽ ném ra một IllegalStateException . Nếu đệ quytrue , thì các thư mục con sẽ bị xóa.
trừu tượng boolean renameTo (Thư mục f) Điều này thay đổi tên của thư mục này. Một thư mục phải được đóng lại để được đổi tên. Nếu không, IllegalStateException sẽ được ném ra.

Quản lý tin nhắn trong thư mục

Sau đây là một số phương pháp giúp quản lý thư trong Thư mục:

phương pháp Sự miêu tả
trừu tượng void appendMessages (Message [] tin nhắn) Như tên của nó, các thư trong mảng được đặt ở cuối thư mục này.
void copyMessages (Tin nhắn [] tin nhắn, Đích thư mục) Thao tác này sao chép các thư từ thư mục này vào một thư mục cụ thể được cung cấp dưới dạng đối số.
Thông điệp trừu tượng [] expunge () Để xóa thư khỏi một thư mục, hãy đặt cờ Flags.Flag.DELETED của thư đó thành true. Để loại bỏ vật lý các tin nhắn đã xóa khỏi một thư mục, bạn phải gọi phương thức này.

Liệt kê nội dung của một thư mục

Có bốn phương pháp để liệt kê các thư mục chứa một thư mục:

phương pháp Sự miêu tả
Danh sách thư mục [] () Điều này trả về một mảng liệt kê các thư mục mà thư mục này chứa.
Folder [] listSubscribe () Điều này trả về một mảng liệt kê tất cả các thư mục đã đăng ký mà thư mục này chứa.
danh sách Thư mục trừu tượng [] (Mẫu chuỗi) Điều này tương tự như phương thức list () ngoại trừ nó cho phép bạn chỉ định một mẫu. Mẫu là một chuỗi cho biết tên của các thư mục phù hợp.
Folder [] listSubscribe (Mẫu chuỗi) Điều này tương tự với phương thức listSubscribe () ngoại trừ việc nó cho phép bạn chỉ định một mẫu. Mẫu là một chuỗi cho biết tên của các thư mục phù hợp.

Kiểm tra thư

phương pháp Sự miêu tả
trừu tượng int getMessageCount () Phương thức này có thể được gọi trên một thư mục mở hoặc đóng. Tuy nhiên, trong trường hợp một thư mục đóng, phương thức này có thể (hoặc không) trả về -1 để chỉ ra rằng không dễ dàng có được số lượng thư chính xác.
trừu tượng boolean hasNewMessages () Điều này trả về true nếu thư mới đã được thêm vào thư mục kể từ lần cuối cùng được mở.
int getNewMessageCount () Nó trả về số lượng tin nhắn mới bằng cách kiểm tra các tin nhắn trong thư mục có cờ GẦN ĐÂY được đặt.
int getUnreadMessageCount () Điều này có thể được gọi trên một thư mục mở hoặc đóng. Tuy nhiên, trong trường hợp một thư mục đóng, nó có thể trả về -1 để chỉ ra rằng câu trả lời thực sẽ quá đắt để có được.

Nhận tin nhắn từ thư mục

Lớp Thư mục cung cấp bốn phương pháp để lấy thư từ các thư mục đang mở:

phương pháp Sự miêu tả
Thông điệp trừu tượng getMessage (int messageNumber) Thao tác này trả về thư thứ n trong thư mục. Thư đầu tiên trong thư mục là số 1.
Message [] getMessages () Điều này trả về một mảng các đối tượng Message đại diện cho tất cả các thông báo trong thư mục này.
Message [] getMessages (int start, int end) Điều này trả về một mảng các đối tượng Message từ thư mục, bắt đầu bằng phần bắt đầu và kết thúc bằng phần cuối, bao gồm.
Message [] getMessages (int [] messageNumbers) Điều này trả về một mảng chỉ chứa những thông báo được xác định cụ thể bằng số trong mảng messageNumbers .
void fetch (Message [] thư, FetchProfile fp) Tìm nạp trước các mục được chỉ định trong FetchProfile cho các Tin nhắn đã cho. Đối số FetchProfile chỉ định tiêu đề nào trong thư cần tìm nạp trước.

Tìm kiếm thư mục

Nếu máy chủ hỗ trợ tìm kiếm (như nhiều máy chủ IMAP và hầu hết các máy chủ POP thì không), thật dễ dàng để tìm kiếm thư mục cho các thư đáp ứng các tiêu chí nhất định. Các tiêu chí được mã hóa trong các đối tượng SearchTerm. Sau đây là hai phương pháp tìm kiếm:

phương pháp Sự miêu tả
Tin nhắn [] tìm kiếm (cụm từ SearchTerm) Tìm kiếm Thư mục này cho các thư phù hợp với tiêu chí tìm kiếm được chỉ định. Trả về một mảng chứa các thông báo phù hợp. Trả về một mảng trống nếu không tìm thấy kết quả phù hợp nào.
Tìm kiếm trong Message [] (cụm từ SearchTerm, tin nhắn trong Message []) Tìm kiếm mảng thông báo đã cho cho những thông báo phù hợp với tiêu chí tìm kiếm được chỉ định. Trả về một mảng chứa các thông báo phù hợp. Trả về một mảng trống nếu không tìm thấy kết quả phù hợp nào. Các đối tượng Message được chỉ định phải thuộc về thư mục này.

Cờ

Sửa đổi cờ rất hữu ích khi bạn cần thay đổi cờ cho toàn bộ bộ thư trong Thư mục. Sau đây là các phương thức được cung cấp trong lớp Thư mục:

phương pháp Sự miêu tả
void setFlags (Message [] tin nhắn, cờ Flags, giá trị boolean) Đặt các cờ được chỉ định trên các thông báo được chỉ định trong mảng.
void setFlags (int start, int end, Flags flag, boolean value) Đặt các cờ được chỉ định trên các thư được đánh số từ đầu đến cuối, bao gồm cả phần bắt đầu và phần cuối.
void setFlags (int [] messageNumbers, Flags flag, boolean value) Đặt các cờ được chỉ định trên các thư có số thông báo nằm trong mảng.
Cờ trừu tượng getPermanentFlags () Trả về các cờ mà thư mục này hỗ trợ cho tất cả các thư.

Hạn ngạch trong JavaMail là một số lượng hoặc số lượng thư có giới hạn hoặc cố định trong một cửa hàng email. Mỗi yêu cầu dịch vụ Thư được tính vào hạn ngạch Lệnh gọi API JavaMail. Một dịch vụ email có thể áp dụng tiêu chí hạn ngạch sau:

  • Kích thước tối đa của thư gửi đi, bao gồm cả tệp đính kèm.

  • Kích thước tối đa của thư đến, bao gồm cả phần đính kèm.

  • Kích thước thư tối đa khi quản trị viên là người nhận

Để quản lý hạn ngạch JavaMail có các lớp sau:

Lớp học Sự miêu tả
hạn ngạch công khai Lớp này đại diện cho một tập hợp các hạn ngạch cho một gốc hạn ngạch nhất định. Mỗi gốc hạn ngạch có một tập hợp tài nguyên, được đại diện bởi lớp Quota.Resource. Mỗi tài nguyên có một tên (ví dụ: "LƯU TRỮ"), mức sử dụng hiện tại và giới hạn sử dụng. Điều này chỉ có một phương thức setResourceLimit (Tên chuỗi, giới hạn dài) .
public static class Quota.Resource Đại diện cho một tài nguyên riêng lẻ trong gốc hạn ngạch.
giao diện công cộng QuotaAwareStore Giao diện được triển khai bởi Cửa hàng hỗ trợ hạn ngạch. Phương thức getQuotasetQuota hỗ trợ mô hình hạn ngạch được xác định bởi phần mở rộng IMAP QUOTA. GmailSSLStore, GmailStore, IMAPSSLStore, IMAPStore là các lớp triển khai đã biết của giao diện này.

Hãy để chúng tôi xem và ví dụ trong các phần sau để kiểm tra tên lưu trữ thư, giới hạn và việc sử dụng nó.

Tạo lớp Java

Tạo tệp lớp java QuotaExample, nội dung của nó như sau:

package com.tutorialspoint;

import java.util.Properties;

import javax.mail.Quota;
import javax.mail.Session;
import javax.mail.Store;

import com.sun.mail.imap.IMAPStore;

public class QuotaExample 
{
   public static void main(String[] args) 
   {
      try 
      {
         Properties properties = new Properties();
         properties.put("mail.store.protocol", "imaps");
         properties.put("mail.imaps.port", "993");
         properties.put("mail.imaps.starttls.enable", "true");
         Session emailSession = Session.getDefaultInstance(properties);
         // emailSession.setDebug(true);

         // create the IMAP3 store object and connect with the pop server
         Store store = emailSession.getStore("imaps");

         //change the user and password accordingly
         store.connect("imap.gmail.com", "abc@gmail.com", "*****");
         IMAPStore imapStore = (IMAPStore) store;
         System.out.println("imapStore ---" + imapStore);

         //get quota
         Quota[] quotas = imapStore.getQuota("INBOX");
         //Iterate through the Quotas
         for (Quota quota : quotas) {
            System.out.println(String.format("quotaRoot:'%s'",
               quota.quotaRoot));
            //Iterate through the Quota Resource
            for (Quota.Resource resource : quota.resources) {
               System.out.println(String.format(
                  "name:'%s', limit:'%s', usage:'%s'", resource.name,
                  resource.limit, resource.usage));
            }
         }
      } catch (Exception e) 
      {
         e.printStackTrace();
      }
   }
}

Đây là kết nối với dịch vụ gmail qua máy chủ IMAP (imap.gmail.com), vì IMAPStore triển khai QuotaAwareStore. Khi bạn nhận được đối tượng Store, hãy tìm nạp mảng Quota và lặp qua nó và in thông tin liên quan.

Biên dịch và Chạy

Bây giờ lớp của chúng ta đã sẵn sàng, chúng ta hãy biên dịch lớp trên. Tôi đã lưu lớp QuotaExample.java vào thư mục:/home/manisha/JavaMailAPIExercise. Chúng tôi cần các lọ javax.mail.jaractivation.jar trong classpath. Thực thi lệnh bên dưới để biên dịch lớp (cả hai lọ đều được đặt trong thư mục / home / manisha /) từ dấu nhắc lệnh:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: QuotaExample.java

Bây giờ lớp đã được biên dịch, hãy thực thi lệnh dưới đây để chạy:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: QuotaExample

Xác minh đầu ra

Bạn sẽ thấy một thông báo tương tự trên bảng điều khiển lệnh:

imapStore ---imaps://abc%40gmail.com@imap.gmail.com
quotaRoot:''
name:'STORAGE', limit:'15728640', usage:'513'

Một tin nhắn có thể bị trả lại vì một số lý do. Vấn đề này được thảo luận chuyên sâu tại rfc1211 . Chỉ một máy chủ mới có thể xác định sự tồn tại của một hộp thư hoặc tên người dùng cụ thể. Khi máy chủ phát hiện ra lỗi, nó sẽ trả về một thông báo chỉ ra lý do không thành công cho người gửi thư gốc.

Có nhiều tiêu chuẩn Internet bao gồm Thông báo trạng thái phân phối nhưng một số lượng lớn máy chủ không hỗ trợ các tiêu chuẩn mới này, thay vào đó sử dụng các kỹ thuật đặc biệt để trả về các thông báo lỗi như vậy. Do đó, rất khó để tương quan giữa thư bị trả lại với thư gốc đã gây ra sự cố.

JavaMail bao gồm hỗ trợ phân tích cú pháp Thông báo trạng thái gửi. Có một số kỹ thuật và kinh nghiệm để giải quyết vấn đề này. Một trong những kỹ thuật là Đường dẫn trả về phong bì biến. Bạn có thể đặt đường dẫn trả về trong phong bì như thể hiện trong ví dụ bên dưới. Đây là địa chỉ mà thư trả lại được gửi đến. Bạn có thể muốn đặt địa chỉ này thành một địa chỉ chung, khác với tiêu đề Từ:, để bạn có thể xử lý các thư trả lại từ xa. Điều này được thực hiện bằng cách đặt thuộc tính mail.smtp.from trong JavaMail.

Tạo lớp Java

Tạo tệp lớp java SendEmail, nội dung của nó như sau:

import java.util.Properties;

import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendEmail {
   public static void main(String[] args) throws Exception {
      String smtpServer = "smtp.gmail.com";
      int port = 587;
      final String userid = "youraddress";//change accordingly
      final String password = "*****";//change accordingly
      String contentType = "text/html";
      String subject = "test: bounce an email to a different address " +
				"from the sender";
      String from = "youraddress@gmail.com";
      String to = "bouncer@fauxmail.com";//some invalid address
      String bounceAddr = "toaddress@gmail.com";//change accordingly
      String body = "Test: get message to bounce to a separate email address";

      Properties props = new Properties();

      props.put("mail.smtp.auth", "true");
      props.put("mail.smtp.starttls.enable", "true");
      props.put("mail.smtp.host", smtpServer);
      props.put("mail.smtp.port", "587");
      props.put("mail.transport.protocol", "smtp");
      props.put("mail.smtp.from", bounceAddr);

      Session mailSession = Session.getInstance(props,
         new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
               return new PasswordAuthentication(userid, password);
            }
         });

      MimeMessage message = new MimeMessage(mailSession);
      message.addFrom(InternetAddress.parse(from));
      message.setRecipients(Message.RecipientType.TO, to);
      message.setSubject(subject);
      message.setContent(body, contentType);

      Transport transport = mailSession.getTransport();
      try {
         System.out.println("Sending ....");
         transport.connect(smtpServer, port, userid, password);
         transport.sendMessage(message,
            message.getRecipients(Message.RecipientType.TO));
         System.out.println("Sending done ...");
      } catch (Exception e) {
         System.err.println("Error Sending: ");
         e.printStackTrace();

      }
      transport.close();
   }// end function main()
}

Ở đây chúng ta có thể thấy rằng thuộc tính mail.smtp.from được đặt khác với địa chỉ from .

Biên dịch và Chạy

Bây giờ lớp của chúng ta đã sẵn sàng, chúng ta hãy biên dịch lớp trên. Tôi đã lưu lớp SendEmail.java vào thư mục:/home/manisha/JavaMailAPIExercise. Chúng tôi cần các lọ javax.mail.jaractivation.jar trong classpath. Thực thi lệnh bên dưới để biên dịch lớp (cả hai lọ đều được đặt trong thư mục / home / manisha /) từ dấu nhắc lệnh:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendEmail.java

Bây giờ lớp đã được biên dịch, hãy thực thi lệnh dưới đây để chạy:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendEmail

Xác minh đầu ra

Bạn sẽ thấy thông báo sau trên bảng điều khiển lệnh:

Sending ....
Sending done ...

SMTP là từ viết tắt của Simple Mail Transfer Protocol. Nó là một tiêu chuẩn Internet để truyền thư điện tử (e-mail) qua các mạng Giao thức Internet (IP). SMTP sử dụng cổng TCP 25. Các kết nối SMTP được bảo mật bằng SSL được gọi là SMTPS viết tắt, mặc dù SMTPS không phải là một giao thức theo đúng nghĩa của nó.

JavaMail API có gói com.sun.mail.smtphoạt động như nhà cung cấp giao thức SMTP để truy cập máy chủ SMTP. Bảng sau liệt kê các lớp có trong gói này:

Lớp học Sự miêu tả
SMTPMessage Lớp này là một chuyên môn của lớp MimeMessage cho phép bạn chỉ định các tùy chọn và tham số SMTP khác nhau sẽ được sử dụng khi thông báo này được gửi qua SMTP.
SMTPSSLTransport Lớp này thực hiện lớp trừu tượng Vận chuyển bằng cách sử dụng SMTP qua SSL để gửi và truyền tải thông điệp.
SMTPTransport Lớp này thực hiện lớp trừu tượng Vận chuyển bằng cách sử dụng SMTP để gửi và truyền tải thông điệp.

Bảng sau liệt kê các ngoại lệ được đưa ra:

ngoại lệ Sự miêu tả
SMTPAddressFailedException Ngoại lệ này được đưa ra khi không thể gửi thư.
SMTPAddressSucceededException Ngoại lệ này được nối với một SendFailedException khi thuộc tính mail.smtp.reportsuccess là true.
SMTPSenderFailedException Ngoại lệ này được đưa ra khi không thể gửi thư.
SMTPSendFailedException Ngoại lệ này được đưa ra khi thư không thể được gửi. Ngoại lệ bao gồm địa chỉ của người gửi mà máy chủ thư từ chối.

Các com.sun.mail.smtpnhà cung cấp sử dụng Xác thực SMTP tùy chọn. Để sử dụng xác thực SMTP, bạn sẽ cần đặt thuộc tính mail.smtp.auth hoặc cung cấp Truyền tải SMTP với tên người dùng và mật khẩu khi kết nối với máy chủ SMTP. Bạn có thể thực hiện việc này bằng một trong các cách sau:

  • Cung cấp đối tượng Authenticator khi tạo Phiên thư của bạn và cung cấp thông tin tên người dùng và mật khẩu trong quá trình gọi lại Authenticator. Thuộc tính mail.smtp.user có thể được đặt để cung cấp tên người dùng mặc định cho lệnh gọi lại, nhưng mật khẩu sẽ vẫn cần được cung cấp rõ ràng. Cách tiếp cận này cho phép bạn sử dụng phương thức gửi Truyền tải tĩnh để gửi tin nhắn. Ví dụ:

  • Transport.send(message);
  • Gọi phương thức kết nối truyền tải một cách rõ ràng với các đối số tên người dùng và mật khẩu. Ví dụ:

    Transport tr = session.getTransport("smtp");
    tr.connect(smtphost, username, password);
    msg.saveChanges();
    tr.sendMessage(msg, msg.getAllRecipients());
    tr.close();

Nhà cung cấp giao thức SMTP hỗ trợ các thuộc tính sau, có thể được đặt trong đối tượng JavaMail Session. Các thuộc tính luôn được đặt dưới dạng chuỗi. Ví dụ:

props.put("mail.smtp.port", "587");

IMAP là từ viết tắt của Internet Message Access Protocol. Nó là một giao thức Internet Tầng Ứng dụng cho phép một máy khách e-mail truy cập e-mail trên một máy chủ thư từ xa. Máy chủ IMAP thường lắng nghe trên cổng nổi tiếng 143. IMAP qua SSL (IMAPS) được gán cho số cổng 993.

IMAP hỗ trợ cả chế độ hoạt động trực tuyến và ngoại tuyến. Các ứng dụng email khách sử dụng IMAP thường để lại thư trên máy chủ cho đến khi người dùng xóa chúng một cách rõ ràng.

Gói com.sun.mail.imaplà nhà cung cấp giao thức IMAP cho JavaMail API, cung cấp quyền truy cập vào kho tin nhắn IMAP. Bảng dưới đây liệt kê giao diện và các lớp của trình cung cấp này:

Lớp / Giao diện Sự miêu tả
IMAPFolder.ProtocolCommand Đây là một giao diện đơn giản cho các lệnh giao thức IMAP do người dùng xác định.
ACL Đây là một lớp học. Mục nhập danh sách kiểm soát truy cập cho một định danh xác thực cụ thể (người dùng hoặc nhóm).
IMAPFolder Lớp này thực hiện một thư mục IMAP.
IMAPFolder.FetchProfileItem Đây là một lớp để tìm nạp các tiêu đề.
IMAPMessage Lớp này thực hiện một đối tượng ReadableMime.
IMAPMessage.FetchProfileCondition Lớp này thực hiện kiểm tra sẽ được thực hiện trên mỗi thư trong thư mục.
IMAPSSLStore Lớp này cung cấp quyền truy cập vào kho tin nhắn IMAP qua SSL.
IMAPStore Lớp này cung cấp quyền truy cập vào kho tin nhắn IMAP.
Quyền lợi Lớp này đại diện cho tập hợp các quyền cho một định danh xác thực (ví dụ: người dùng hoặc một nhóm).
Quyền lợi Lớp bên trong này đại diện cho một quyền cá nhân.
SortTerm Một tiêu chí sắp xếp cụ thể, như được xác định bởi RFC 5256.

Một số điểm cần lưu ý ở trên nhà cung cấp này:

  • Nhà cung cấp này hỗ trợ cả giao thức IMAP4 và IMAP4rev1.

  • IMAPStore được kết nối duy trì một nhóm các đối tượng giao thức IMAP để sử dụng trong giao tiếp với máy chủ IMAP. Khi các thư mục được mở và các đối tượng giao thức IMAP mới là cần thiết, IMAPStore sẽ cung cấp chúng từ nhóm kết nối hoặc tạo chúng nếu không có sẵn. Khi một thư mục bị đóng, đối tượng giao thức IMAP của nó được trả về nhóm kết nối nếu nhóm.

  • Đối tượng IMAPStore được kết nối có thể hoặc không thể duy trì một đối tượng giao thức IMAP riêng biệt cung cấp cho cửa hàng một kết nối chuyên dụng đến máy chủ IMAP.

Post Office Protocol (POP) là một giao thức chuẩn Internet tầng ứng dụng được sử dụng bởi các máy khách e-mail cục bộ để lấy e-mail từ một máy chủ từ xa qua kết nối TCP / IP. POP hỗ trợ các yêu cầu tải xuống và xóa đơn giản để truy cập hộp thư từ xa. Máy chủ POP3 lắng nghe trên cổng 110 nổi tiếng.

Gói com.sun.mail.pop3là nhà cung cấp giao thức POP3 cho API JavaMail cung cấp quyền truy cập vào kho lưu trữ thông báo POP3. Bảng dưới đây liệt kê các lớp trong gói này:

Tên Sự miêu tả
POP3Folder Thư mục POP3 (chỉ có thể là "INBOX").
POP3Message Thông báo POP3.
POP3SSLStore Kho tin nhắn POP3 sử dụng SSL.
POP3Store Một kho tin nhắn POP3.

Một số điểm cần lưu ý ở trên nhà cung cấp này:

  • Nhà cung cấp POP3 chỉ hỗ trợ một thư mục duy nhất có tên INBOX. Do những hạn chế của giao thức POP3, nhiều khả năng của JavaMail API như thông báo sự kiện, quản lý thư mục, quản lý cờ, v.v. không được phép.

  • Nhà cung cấp POP3 được truy cập thông qua các API JavaMail bằng cách sử dụng tên giao thức pop3 hoặc URL có dạng pop3: // user: password @ host: port / INBOX " .

  • POP3 không hỗ trợ cờ cố định. Ví dụ: cờ Flags.Flag.RECENT sẽ không bao giờ được đặt cho các tin nhắn POP3. Ứng dụng sẽ xác định thư nào trong hộp thư POP3 là mới .

  • POP3 không hỗ trợ phương thức Folder.expunge (). Để xóa và xóa thư, hãy đặt cờ Flags.Flag.DELETED trên thư và đóng thư mục bằng phương pháp Folder.close (true).

  • POP3 không cung cấp ngày đã nhận , vì vậy phương thức getReceiveDate sẽ trả về null.

  • Khi các tiêu đề của thư POP3 được truy cập, nhà cung cấp POP3 sử dụng lệnh TOP để tìm nạp tất cả các tiêu đề, sau đó được lưu vào bộ nhớ đệm.

  • Khi nội dung của thông báo POP3 được truy cập, nhà cung cấp POP3 sử dụng lệnh RETR để tìm nạp toàn bộ thông báo.

  • Các POP3Message.invalidate phương pháp có thể được sử dụng để vô hiệu dữ liệu được lưu trữ mà không đóng thư mục.