從 Java 應用程式發送電子郵件是一種常見的需求。無論您是在開發核心 Java 應用程式、Web 應用程式還是企業 Java 應用程序,您都可能需要發送電子郵件來提醒支援人員有關錯誤,或者只是在註冊時向用戶發送電子郵件,重設密碼,或要求他們在註冊後確認電子郵件地址。在很多情況下,您都需要能夠從 Java 應用程式發送電子郵件。 在現成的應用程式中,您已經擁有一個模組或庫,可以使用發送電子郵件的所有功能,例如發送附件、圖像(包括電子郵件中的簽名和富文本)的能力,但是如果您需要從頭開始編寫一些內容,那麼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 API和Java 啟動框架 (JAF);更準確地說,您將需要mail-1.4.5.jar、smtp-1.4.4.jar和activation-1.1.jar。您需要下載這些 JAR 檔案並將它們包含在您的類別路徑中才能運行該程式。或者,您可以使用 Maven 進行依賴項管理並在其中包含所有相依性。獲得所有這些 JAR 檔案後,只需按照以下步驟即可使用 Java 建立和發送電子郵件。-
Session
透過呼叫建立一個對象Session.getDefaultInstance(properties)
,其中properties
- 包含所有重要屬性,例如 SMTP 伺服器的主機名稱。 -
透過將上一步中獲得的
MimeMessage
物件傳遞給它來創建一個物件。Session
我們在此物件中有一組不同的屬性,例如電子郵件收件者、主題、訊息正文、附件等。 -
使用它
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
您可以使用TO
、Message.RecipientType.TO
和-將 人員新增至欄位。 CC
Message.RecipientType.CC
BCC
Message.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 程式傳送電子郵件範例
GO TO FULL VERSION