JavaRush /Java 博客 /Random-ZH /如何从 Java 应用程序发送电子邮件(示例)
PodoBulge
第 31 级
Минск

如何从 Java 应用程序发送电子邮件(示例)

已在 Random-ZH 群组中发布
从 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