JavaRush /Java Blog /Random-TW /如何從 Java 應用程式發送電子郵件(範例)
PodoBulge
等級 31
Минск

如何從 Java 應用程式發送電子郵件(範例)

在 Random-TW 群組發布
從 Java 應用程式發送電子郵件是一種常見的需求。無論您是在開發核心 Java 應用程式、Web 應用程式還是企業 Java 應用程序,您都可能需要發送電子郵件來提醒支援人員有關錯誤,或者只是在註冊時向用戶發送電子郵件,重設密碼,或要求他們在註冊後確認電子郵件地址。在很多情況下,您都需要能夠從 Java 應用程式發送電子郵件。 如何從 Java 應用程式發送電子郵件(帶有範例)- 1在現成的應用程式中,您已經擁有一個模組或庫,可以使用發送電子郵件的所有功能,例如發送附件、圖像(包括電子郵件中的簽名和富文本)的能力,但是如果您需要從頭開始編寫一些內容,那麼Java Mail API就是一個不錯的選擇。在本文中,我們將學習如何使用郵件 API ( javax.mail ) 從 Java 應用程式發送電子郵件。在編寫程式碼之前,您應該了解電子郵件如何運作的一些基礎知識,例如您需要SMTP(簡單郵件傳輸協定)伺服器。如果您在 Linux 上執行 Java 應用程序,那麼您應該知道SMTP 守護程序使用連接埠25。您可以使用任何郵件伺服器使用 Java 發送訊息,包括公共郵件伺服器,例如 GMail、Yahoo 或任何其他服務供應商,所有您需要的是他們的SMTP 伺服器詳細信息,例如主機名稱、連接埠、連接參數等。您也可以使用SSL安全通訊端層)、TLS傳輸層安全性)來安全地連接和發送電子郵件,但我們讓這個範例變得簡單,並專注於從Java 應用程式發送信件的最小邏輯。在以後的文章中,我們將學習如何使用附件發送電子郵件、如何發送 HTML 格式的電子郵件、如何在電子郵件中附加圖像、如何使用 SSL 身份驗證連接到 GMail 伺服器並發送電子郵件等。現在,讓我們來了解(討論)這個簡單的Java Mail API範例。

用於發送電子郵件的 Java 程式碼範例

若要從 Java 程式傳送信件,您將需要Java Mail APIJava 啟動框架 (JAF);更準確地說,您將需要mail-1.4.5.jarsmtp-1.4.4.jaractivation-1.1.jar。您需要下載這些 JAR 檔案並將它們包含在您的類別路徑中才能運行該程式。或者,您可以使用 Maven 進行依賴項管理並在其中包含所有相依性。獲得所有這些 JAR 檔案後,只需按照以下步驟即可使用 Java 建立和發送電子郵件。
  1. Session透過呼叫建立一個對象Session.getDefaultInstance(properties),其中properties- 包含所有重要屬性,例如 SMTP 伺服器的主機名稱。

  2. 透過將上一步中獲得的MimeMessage物件傳遞給它來創建一個物件。Session我們在此物件中有一組不同的屬性,例如電子郵件收件者、主題、訊息正文、附件等。

  3. 使用它javax.mail.Transport透過呼叫靜態方法來發送電子郵件send(email),其中電子郵件可以是一個物件MimeMessage

建立對象時傳遞的屬性數量會Session根據 SMTP 伺服器的類型而有所不同,例如,如果您使用的 SMTP 伺服器不需要任何驗證,則可以建立Session僅具有一個屬性的對象,例如 smtp。mail.host,不需要指定端口,預設為25端口。另一方面,如果您要連接到需要 TLS 或 SSL 驗證的 SMTP 伺服器(例如 GMail 的 SMTP 主機),則需要提供更多屬性,例如用於 TLS 和郵件的 mail.smtp.port=547. smtp. port = 457 用於SSL。這是一個完整的 Java 程序,無需身份驗證即可連接到標準 SMTP 伺服器,並使用 Java Mail API 發送文字訊息。
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
* Java Program to send text mail using default SMTP server and without authentication.
* You need mail.jar, smtp.jar and activation.jar to run this program.
*
* @author Javin Paul
*/

public class EmailSender{
     public static void main(String args[]){

           String to = "receive@abc.om";         // sender email
           String from = "sender@abc.com";       // receiver email
           String host = "127.0.0.1";            // mail server host

           Properties properties = System.getProperties();
           properties.setProperty("mail.smtp.host", host);

           Session session = Session.getDefaultInstance(properties); // default session

           try {
                MimeMessage message = new MimeMessage(session); // email message

                message.setFrom(new InternetAddress(from)); // setting header fields

                message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

                message.setSubject("Test Mail from Java Program"); // subject line

                // actual mail body
                message.setText("You can send mail from Java program by using mail API, but you need" +
                                "couple of more JAR files e.g. smtp.jar and activation.jar");

                // Send message
                Transport.send(message); System.out.println("Email Sent successfully....");
               } catch (MessagingException mex){ mex.printStackTrace(); }

     }

}
輸出: 您可以編譯並執行該程式以從 Java 程式發送簡單的電子郵件:
$ javac EmailSender.java
$ java EmailSender
發送電子郵件成功... 正如您所看到的,從 Java 程式發送電子郵件非常容易。建立物件後MimeMessage,您需要新增收件人,可以在TO, CC,中指定BCC。處理完收件人後,我們需要指定信件的主題,最後透過呼叫 方法指定信件本身的內容message.setText();如果您想要進行多封郵件,那麼可以使用下列方法指定收件者:
void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException
您可以使用TOMessage.RecipientType.TO和-將 人員新增至欄位。 CCMessage.RecipientType.CCBCCMessage.RecipientType.BCC

錯誤和異常

當許多Java 程式設計師第一次開始編寫發送電子郵件的程式時,他們會遇到一個錯誤,因為他們大多數人認為mail.jar 和activation.jar 足以從Java 應用程式發送電子郵件,但事實並非如此,尤其是當您透過 Linux 中的本機 SMTP 伺服器傳送電子郵件時。如果您在 CLASSPATH 中僅使用 mail.jar 和activation.jar 來執行此程序,則很可能會收到此錯誤。

例外1:

com.sun.mail.util.MailConnectException: Couldn't connect to host, port: localhost, 25; timeout -1;
        nested exception is:
            java.net.ConnectException: Connection refused: connect
            at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1984)
            at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:656)
            at javax.mail.Service.connect(Service.java:345)
            at javax.mail.Service.connect(Service.java:226)
            at javax.mail.Service.connect(Service.java:175)
            at javax.mail.Transport.send0(Transport.java:253)
            at javax.mail.Transport.send(Transport.java:124)
            at Testing.main(Testing.java:62)
        Caused by: java.net.ConnectException: Connection refused: connect
            at java.net.DualStackPlainSocketImpl.connect0(Native Method)
            at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
            at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
            at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
            at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
            at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
            at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
            at java.net.Socket.connect(Socket.java:579) at java.net.Socket.connect(Socket.java:528)
            at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:301)
            at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:229)
            at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1950)
       ... 7 more
儘管解決此錯誤的方法非常簡單,但它可能會讓您感到困惑。java.net.ConnectException: Connection refused: connect當伺服器不工作或您連接的連接埠指定不正確時,它通常會崩潰。解:除了mail-1.4.5.jar外,還需要smtp-1.4.4.jar和activation-1.1.jar。

例外2:

這是另一個名為 的錯誤NoClassDefFoundError,通常是指類別路徑中缺少 JAR 文件
Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/MessagingException
           at java.lang.Class.getDeclaredMethods0(Native Method)
           at java.lang.Class.privateGetDeclaredMethods(Class.java:2521)
           at java.lang.Class.getMethod0(Class.java:2764)
           at java.lang.Class.getMethod(Class.java:1653)
           at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
           at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: javax.mail.MessagingException
           at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
           at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
           at java.security.AccessController.doPrivileged(Native Method)
           at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
           at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
           at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
           at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
解決方案:我設法解決了我的問題,這是由於類路徑不正確造成的。儘管我擁有所有三個必需的 JAR、同一目錄中的程序的 Java 類文件,並從那裡運行該程序,但 Java 無法弄清楚它。我嘗試了以下命令,程式運作良好:
java -cp mail-1.4.5.jar:smtp-1.4.4.jar:activation-1.1.jar:. JavaMailSender
傳送電子郵件成功...請注意,目前目錄在類別路徑參數末端標示一個點。由於我在 Linux 上運行該程序,因此我使用冒號 (:) 而不是分號 (;)(如在 Windows 中)。這就是如何使用郵件 API 從 Java 應用程式發送電子郵件的全部內容。您可能會發現這非常簡單,因為您不需要超過三個 JAR 檔案。如果使用 Gradle 或 Maven 來管理依賴項會容易得多。在下面的教學中,我們將看到更複雜的 Java Mail API 範例,用於發送帶有附件、圖片的電子郵件,以及用於發送報告和表格的格式精美的電子郵件。文章翻譯:如何透過 Java 程式傳送電子郵件範例
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION