Java mail
最后修改于 2024 年 1 月 27 日
Java mail 教程展示了如何在 JVM 上发送和接收邮件。我们使用 Java、Groovy 和 Clojure 语言。
SMTP
简单邮件传输协议 (SMTP) 是一种用于电子邮件传输的互联网标准通信协议。邮件服务器和客户端使用 SMTP 发送和接收邮件。
POP3
邮局协议 (POP)是一个应用层互联网标准协议,电子邮件客户端使用它从邮件服务器检索电子邮件。 POP3 是该协议的当前版本。
Jakarta Mail 是一个 Jakarta EE API,用于通过 SMTP、POP3 和 IMAP 发送和接收电子邮件。 Simple Java mail 库是 Jakarta Mail 之上的一个薄层,它提供了一个简单的 API,用于通过 SMTP 协议发送电子邮件。
注意: Gmail 不适合测试邮件。我们应该使用在线服务,例如 Mailtrap 或 Mailgun,或者使用 Webhosting 公司提供的 SMTP 服务器。
在本文中,我们将使用 Maitrap 服务来测试我们的示例。 Mailtrap 提供免费的个人测试计划。
Java 使用 Simple Java mail 发送邮件
在第一个例子中,我们使用 Simple Java Mail 库在 Java 中发送电子邮件。
package com.zetcode;
import org.simplejavamail.api.email.Email;
import org.simplejavamail.email.EmailBuilder;
import org.simplejavamail.mailer.MailerBuilder;
public class SimpleJavaMail {
public static void main(String[] args) {
var username = "username";
var password = "password";
var host = "smtp.mailtrap.io";
var port = 2525;
Email email = EmailBuilder.startingBlank()
.from("John Doe", "john.doe@example.com")
.to("Jane Doe", "jane.doe@example.com")
.to("Peter Doe", "peter.doe@example.com")
.withSubject("Test subject")
.withPlainText("Test body")
.buildEmail();
MailerBuilder
.withSMTPServer(host, port, username, password)
.buildMailer()
.sendMail(email);
System.out.println("Email sent successfully");
}
}
该电子邮件使用 EmailBuilder 构建,并使用 MailerBuilder 发送。
使用 Jakarta Mail 发送文本邮件
在下一个示例中,我们使用 Groovy 和 Jakarta Mail 发送一个简单的文本邮件。
@Grab(group='com.sun.mail', module='jakarta.mail', version='2.0.1')
@Grab(group='com.sun.activation', module='jakarta.activation', version='2.0.1')
import java.util.Properties
import jakarta.mail.Authenticator
import jakarta.mail.Message
import jakarta.mail.MessagingException
import jakarta.mail.PasswordAuthentication
import jakarta.mail.Session
import jakarta.mail.Transport
import jakarta.mail.internet.InternetAddress
import jakarta.mail.internet.MimeMessage
def to = "test@example.com"
def from = "from@example.com"
def username = "username"
def password = "password"
def host = "smtp.mailtrap.io"
def port = 2525
def props = new Properties()
props.put("mail.smtp.auth", "true")
props.put("mail.smtp.starttls.enable", "true") // optional in Mailtrap
props.put("mail.smtp.host", host)
props.put("mail.smtp.port", port)
def auth = new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password)
}
}
def session = Session.getInstance(props, auth)
def message = new MimeMessage(session)
message.setFrom(new InternetAddress(from))
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to))
message.setSubject("Groovy email")
message.setText("Test message")
Transport.send(message)
println("Email sent successfully")
该示例向 Mailtrap 发送一封简单的文本邮件。
@Grab(group='com.sun.mail', module='jakarta.mail', version='2.0.1') @Grab(group='com.sun.activation', module='jakarta.activation', version='2.0.1')
我们需要 jakarta.mail 和 jakarta.activation 库。
def props = new Properties()
props.put("mail.smtp.auth", "true")
props.put("mail.smtp.starttls.enable", "true") // optional in Mailtrap
props.put("mail.smtp.host", host)
props.put("mail.smtp.port", port)
我们设置电子邮件属性。
def auth = new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password)
}
}
我们为密码验证创建一个 Authenticator。
def session = Session.getInstance(props, auth)
Session 类表示一个邮件会话。
def message = new MimeMessage(session)
此 MimeMessage 表示一个 MIME 样式的电子邮件消息。
message.setFrom(new InternetAddress(from))
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to))
message.setSubject("Groovy email")
message.setText("Test message")
我们设置发件人、收件人、主题和正文。
Transport.send(message)
电子邮件最终通过 Transport.send 发送。
发送 HTML 电子邮件
以下示例发送带有 HTML 正文的电子邮件。
@Grab(group='com.sun.mail', module='jakarta.mail', version='2.0.1')
@Grab(group='com.sun.activation', module='jakarta.activation', version='2.0.1')
import java.util.Properties
import jakarta.mail.Authenticator
import jakarta.mail.Message
import jakarta.mail.MessagingException
import jakarta.mail.PasswordAuthentication
import jakarta.mail.Session
import jakarta.mail.Transport
import jakarta.mail.internet.InternetAddress
import jakarta.mail.internet.MimeMessage
def to = "test@example.com"
def from = "from@example.com"
def username = "username"
def password = "password"
def host = "smtp.mailtrap.io"
def port = 2525
def props = new Properties()
props.put("mail.smtp.auth", "true")
props.put("mail.smtp.host", host)
props.put("mail.smtp.port", port)
def auth = new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password)
}
}
def session = Session.getInstance(props, auth)
def message = new MimeMessage(session)
message.setFrom(new InternetAddress(from))
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to))
message.setSubject("Groovy email")
def msg = "<p>an <em>old falcon</em> in the sky</p>"
message.setContent(msg, "text/html; charset=utf-8");
Transport.send(message)
println("Email sent successfully")
代码示例发送 HTML 正文内容。 内容使用 setContent 方法设置。
发送带附件的邮件
现代电子邮件系统使用 MIME 标准;消息及其所有附件都封装在一个多部分消息中,并使用 base64 编码将二进制文件转换为 7 位 ASCII 文本。
sky blud rock water poem
我们将此文本文件作为附件发送。
multipart/mixed MIME 消息由不同数据类型的混合组成。 每个正文部分都由一个边界分隔。 边界是用于分隔消息正文的一个部分与另一部分的文本字符串。
@Grab(group='com.sun.mail', module='jakarta.mail', version='2.0.1')
@Grab(group='com.sun.activation', module='jakarta.activation', version='2.0.1')
import java.util.Properties
import jakarta.mail.Authenticator
import jakarta.mail.Message
import jakarta.mail.MessagingException
import jakarta.mail.PasswordAuthentication
import jakarta.mail.Session
import jakarta.mail.Transport
import jakarta.mail.internet.InternetAddress
import jakarta.mail.internet.MimeMessage
import jakarta.mail.internet.MimeBodyPart
import jakarta.mail.internet.MimeMultipart
import jakarta.activation.DataHandler
import jakarta.activation.FileDataSource
def to = "test@example.com"
def from = "from@example.com"
def username = "9c1d45eaf7af5b"
def password = "ad62926fa75d0f"
def host = "smtp.mailtrap.io"
def port = 2525
def props = new Properties()
props.put("mail.smtp.auth", "true")
props.put("mail.smtp.host", host)
props.put("mail.smtp.port", port)
def auth = new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password)
}
}
def session = Session.getInstance(props, auth)
def message = new MimeMessage(session)
message.setFrom(new InternetAddress(from))
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to))
message.setSubject("Email with attachment")
def msgPart = new MimeBodyPart()
msgPart.setText('words.txt file')
def fds = new FileDataSource('words.txt')
def attachPart = new MimeBodyPart()
attachPart.setDataHandler(new DataHandler(fds))
attachPart.setFileName(fds.getName())
def multipart = new MimeMultipart()
multipart.addBodyPart(msgPart)
multipart.addBodyPart(attachPart)
message.setContent(multipart)
Transport.send(message)
println("Email sent successfully")
该示例发送一封带有简单文本文件作为附件的电子邮件。
def msgPart = new MimeBodyPart()
msgPart.setText('words.txt file')
一个 MimeBodyPart 是电子邮件的正文内容。
def fds = new FileDataSource('words.txt')
def attachPart = new MimeBodyPart()
attachPart.setDataHandler(new DataHandler(fds))
attachPart.setFileName(fds.getName())
另一个 MimeBodyPart 是文本文件。
def multipart = new MimeMultipart() multipart.addBodyPart(msgPart) multipart.addBodyPart(attachPart)
正文部分被添加到 MimeMultipart 中。
message.setContent(multipart)
MimeMultipart 被设置为电子邮件消息的内容。
通过 POP3 检索电子邮件
该示例通过 POP3 检索所有电子邮件。
@Grab(group='com.sun.mail', module='jakarta.mail', version='2.0.1')
@Grab(group='com.sun.activation', module='jakarta.activation', version='2.0.1')
import java.util.Properties
import jakarta.mail.Folder
import jakarta.mail.Session
def username = "username"
def password = "password"
def host = "pop3.mailtrap.io"
def port = 9950
def props = new Properties()
props.put("mail.pop3.host", host)
props.put("mail.pop3.port", port)
def session = Session.getDefaultInstance(props)
session.setDebug(true)
def store = session.getStore("pop3")
store.connect(host, username, password)
def inbox = store.getFolder("Inbox")
inbox.open(Folder.READ_ONLY)
def messages = inbox.getMessages()
for (message in messages) {
println message.getFrom()
println message.getSubject()
println message.getContentStream().getText("UTF-8")
println "-------------------------"
}
inbox.close(true)
store.close()
我们从收件箱中读取所有消息。
def props = new Properties()
props.put("mail.pop3.host", host)
props.put("mail.pop3.port", port)
我们设置属性。
def session = Session.getDefaultInstance(props) session.setDebug(true)
我们创建邮件会话。 我们可以设置调试模式。 这将为我们提供大量有用的信息。
def store = session.getStore("pop3")
我们使用 getStore 获取消息存储; 我们提供 POP3 访问协议。
inbox.open(Folder.READ_ONLY)
存储以只读模式打开。
def messages = inbox.getMessages()
我们使用 getMessages 获取所有消息。
for (message in messages) {
println message.getFrom()
println message.getSubject()
println message.getContentStream().getText("UTF-8")
println "-------------------------"
}
我们检索发件人地址、主题和消息正文。
Clojure 示例
接下来,我们展示 Clojure 代码示例。
:dependencies [[org.clojure/clojure "1.10.3"] [com.sun.activation/jakarta.activation "2.0.1"] [com.sun.mail/jakarta.mail "2.0.1"]]
这些是依赖项。
(ns first.core
(:import java.util.Properties)
(:import (jakarta.mail.internet MimeMessage InternetAddress))
(:import (jakarta.mail Transport
Session
Authenticator
Message$RecipientType
PasswordAuthentication)))
(def user "username")
(def password "password")
(def port 2525)
(def host "smtp.mailtrap.io")
(def props (doto (Properties.)
(.putAll {"mail.smtp.user" user "mail.smtp.host" host
"mail.smtp.port" port "mail.smtp.auth", "true"})))
(def auth (proxy [Authenticator] []
(getPasswordAuthentication []
(PasswordAuthentication. user password))))
(def session (Session/getInstance props auth))
(def msg (MimeMessage. session))
(defn -main
[]
(.setFrom msg (InternetAddress. "john.doe@example.com"))
(.addRecipient msg Message$RecipientType/TO (InternetAddress. "roger.roe@example.com"))
(.setSubject msg "Mail subject")
(.setText msg "Mail body")
(Transport/send msg))
该示例发送一封简单的文本邮件。
(ns html.core
(:import java.util.Properties)
(:import (jakarta.mail.internet MimeMessage InternetAddress))
(:import (jakarta.mail Transport
Session
Authenticator
Message$RecipientType
PasswordAuthentication)))
(def user "username")
(def password "password")
(def port 2525)
(def host "smtp.mailtrap.io")
(def props (doto (Properties.)
(.putAll {"mail.smtp.user" user "mail.smtp.host" host
"mail.smtp.port" port "mail.smtp.auth", "true"})))
(def auth (proxy [Authenticator] []
(getPasswordAuthentication []
(PasswordAuthentication. user password))))
(def session (Session/getInstance props auth))
(def msg (MimeMessage. session))
(defn -main
[]
(.setFrom msg (InternetAddress. "john.doe@example.com"))
(.addRecipient msg Message$RecipientType/TO (InternetAddress. "roger.roe@example.com"))
(.setSubject msg "Mail subject")
(.setText msg "Mail body")
(.setContent msg "<p>an <em>old falcon</em> in the sky</p>" "text/html; charset=utf-8")
(Transport/send msg))
此示例发送带有 HTML 正文的电子邮件。
(ns attach.core
(:import java.util.Properties)
(:import (jakarta.activation FileDataSource DataHandler))
(:import (jakarta.mail.internet MimeMessage MimeBodyPart
MimeMultipart InternetAddress))
(:import (jakarta.mail Transport
Session
Authenticator
Message$RecipientType
PasswordAuthentication)))
(def user "username")
(def password "password")
(def port 2525)
(def host "smtp.mailtrap.io")
(def from "john.doe@example.com")
(def to "roger.roe@example.com")
(def subject "Mail subject")
(def fileName (str (System/getProperty "user.dir") "/words.txt"))
(def props (doto (Properties.)
(.putAll {"mail.smtp.user" user, "mail.smtp.host" host,
"mail.smtp.port" port, "mail.smtp.auth", "true"})))
(def auth (proxy [Authenticator] []
(getPasswordAuthentication []
(PasswordAuthentication. user password))))
(def session (Session/getInstance props auth))
(def msg (MimeMessage. session))
(def msgPart (MimeBodyPart.))
(def fds (FileDataSource. fileName))
(def attachPart (MimeBodyPart.))
(def multipart (MimeMultipart.))
(defn -main
[]
(.setFrom msg (InternetAddress. from))
(.addRecipient msg Message$RecipientType/TO (InternetAddress. to))
(. msg setSubject subject)
(. msgPart setText "words.txt file")
(. attachPart setDataHandler (DataHandler. fds))
(. attachPart setFileName (. fds getName))
(. multipart addBodyPart msgPart)
(. multipart addBodyPart attachPart)
(. msg setContent multipart)
(Transport/send msg))
该示例发送一封带有附件的电子邮件。
(ns pop3.core
(:import (jakarta.mail Session Folder)))
(def user "username")
(def password "password")
(def host "pop3.mailtrap.io")
(def port 9950)
(def props (System/getProperties))
(def session (Session/getDefaultInstance props))
;; (.setDebug session true)
(def store (.getStore session "pop3"))
(.connect store host port user password)
(def inbox (.getFolder store "Inbox"))
(.open inbox Folder/READ_ONLY)
(def messages (.getMessages inbox))
(defn -main []
;; (connect)
(println (count messages))
(doseq [m messages] (let [subject (.getSubject m) body (slurp (.getInputStream m))]
(println subject)
(println body)
(prn "---------------------------")))
(.close inbox true)
(.close store))
最后,我们有一个通过 POP3 检索电子邮件的示例。
来源
在本文中,我们展示了如何在 JVM 上使用 Java、Groovy 和 Clojure 语言发送和接收电子邮件。
作者
列出所有Java教程。