Java 发送邮件完整指南:从基础到进阶实战
在 Java 应用程序中发送邮件其实很简单,但首先你需要在机器上安装 JavaMail API 和 Java Activation Framework (JAF)。
环境准备
从 Java 官网下载最新版 JavaMail(版本 1.2)。
从 Java 官网下载最新版 JAF(版本 1.1.1)。
下载并解压这些文件,在新创建的顶层目录中你会找到两个应用的多个 jar 文件。你需要将 mail.jar 和 activation.jar 添加到 CLASSPATH 中。
发送简单邮件
下面是一个从本地发送简单邮件的示例。假设你的 localhost 已连接互联网并能发送邮件。
代码示例
// 文件名 SendEmail.java
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendEmail {
public static void main(String[] args) {
// 收件人邮箱
String to = "abcd@gmail.com";
// 发件人邮箱
String from = "web@gmail.com";
// 假设从 localhost 发送
String host = "localhost";
// 获取系统属性
Properties properties = System.getProperties();
// 设置邮件服务器
properties.setProperty("mail.smtp.host", host);
// 获取默认 Session 对象
Session session = Session.getDefaultInstance(properties);
try {
// 创建默认 MimeMessage 对象
MimeMessage message = new MimeMessage(session);
// 设置 From 头部字段
message.setFrom(new InternetAddress(from));
// 设置 To 头部字段
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
// 设置 Subject 头部字段
message.setSubject("这是邮件主题!");
// 设置实际消息内容
message.setText("这是实际消息内容");
// 发送消息
Transport.send(message);
System.out.println("邮件发送成功....");
} catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
编译并运行此程序发送简单邮件:
输出结果
$ java SendEmail 邮件发送成功....
如果要发送邮件给多个收件人,可使用以下方法指定多个邮箱 ID:
void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException
参数说明:
type —— 设置为 TO、CC 或 BCC。CC 代表抄送,BCC 代表密送。示例:Message.RecipientType.TO
addresses —— 邮箱 ID 数组。指定邮箱时需使用 InternetAddress() 方法。
发送 HTML 格式邮件
下面示例演示发送 HTML 邮件,同样假设 localhost 已联网。此例与前一个类似,区别在于使用 setContent() 方法设置内容,第二个参数指定为 "text/html" 以表明包含 HTML 内容。使用此方法可发送任意大小的 HTML 内容。
代码示例
// 文件名 SendHTMLEmail.java
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendHTMLEmail {
public static void main(String[] args) {
String to = "abcd@gmail.com";
String from = "web@gmail.com";
String host = "localhost";
Properties properties = System.getProperties();
properties.setProperty("mail.smtp.host", host);
Session session = Session.getDefaultInstance(properties);
try {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject("这是邮件主题!");
// 发送实际 HTML 消息,内容可任意大
message.setContent("<h1>这是实际消息</h1>", "text/html");
Transport.send(message);
System.out.println("邮件发送成功....");
} catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
编译并运行发送 HTML 邮件:
输出结果
$ java SendHTMLEmail 邮件发送成功....
发送带附件的邮件
下面示例演示发送带附件的邮件,假设 localhost 已联网。
代码示例
// 文件名 SendFileEmail.java
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendFileEmail {
public static void main(String[] args) {
String to = "abcd@gmail.com";
String from = "web@gmail.com";
String host = "localhost";
Properties properties = System.getProperties();
properties.setProperty("mail.smtp.host", host);
Session session = Session.getDefaultInstance(properties);
try {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject("这是邮件主题!");
// 创建消息部分
BodyPart messageBodyPart = new MimeBodyPart();
// 填充消息正文
messageBodyPart.setText("这是消息正文");
// 创建多部分消息
Multipart multipart = new MimeMultipart();
// 添加文本部分
multipart.addBodyPart(messageBodyPart);
// 第二部分:附件
messageBodyPart = new MimeBodyPart();
String filename = "file.txt";
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);
// 发送完整消息部分
message.setContent(multipart);
Transport.send(message);
System.out.println("邮件发送成功....");
} catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
编译并运行发送带附件邮件:
输出结果
$ java SendFileEmail 邮件发送成功....
用户认证配置
若邮件服务器要求提供用户 ID 和密码进行认证,可按如下方式设置属性:
props.setProperty("mail.user", "myuser");
props.setProperty("mail.password", "mypwd");
其余邮件发送机制保持不变。
java
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- 深入理解 Java Vector:用法、特性及与 ArrayList 的对比
- Java 发送邮件完整指南:从基础到进阶实战
- Java 9 接口私有方法:增强封装与代码复用