需引入 JavaMail API(javax.mail)與 Activation Framework(javax.activation),並準備 SMTP 服務器帳號(示例使用 163 郵箱)。
SendMailTestpublic class SendMailTest {
public static void main(String[] args) {
String title = "titleTest";
String from = "sir_znp@163.com";
String[] sendTo = {"znp@163.net", "sir_znp@163.com"};
String content = "mail test!!!!!!<br><a href=#>aaa</a>"; // 支持 HTML
String[] fileNames = {"F:\\music\\text1.txt,text1.txt", "F:\\music\\text2.txt,text2.txt"}; // 路徑,顯示名
try {
sendmail(title, from, sendTo, content, fileNames, "text/html;charset=gb2312");
} catch (Exception ex) { ex.printStackTrace(); }
}
public static void sendmail(String subject, String from, String[] to,
String text, String[] filenames, String mimeType) throws Exception {
Properties props = System.getProperties();
String smtp = "smtp.163.com";
String user = "sir_znp";
String pass = "123";
props.put("mail.smtp.host", smtp);
props.put("mail.smtp.auth", "true");
Session mailSession = Session.getInstance(props, new EmailAuthenticator(user, pass));
Transport transport = mailSession.getTransport("smtp");
MimeMessage mimeMsg = new MimeMessage(mailSession);
if (from != null) mimeMsg.setFrom(new InternetAddress(from));
InternetAddress[] sendTo = Arrays.stream(to).map(InternetAddress::new).toArray(InternetAddress[]::new);
mimeMsg.setRecipients(Message.RecipientType.TO, sendTo);
mimeMsg.setSubject(subject, "gb2312");
// 郵件正文
MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setContent(text, mimeType);
// 組裝多部分:正文 + 附件
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(bodyPart);
for (String fn : filenames) {
String[] parts = fn.split(",");
String filePath = parts[0];
String displayName = parts.length > 1 ? parts[1] : new File(filePath).getName();
MimeBodyPart attachPart = new MimeBodyPart();
FileDataSource fds = new FileDataSource(filePath);
attachPart.setDataHandler(new DataHandler(fds));
attachPart.setFileName(MimeUtility.encodeText(displayName)); // 解決中文附件名亂碼
multipart.addBodyPart(attachPart);
}
mimeMsg.setContent(multipart);
mimeMsg.setSentDate(new Date());
mimeMsg.saveChanges();
transport.send(mimeMsg);
transport.close();
}
}
EmailAuthenticatorpublic class EmailAuthenticator extends Authenticator {
private final String username, password;
public EmailAuthenticator(String username, String password) {
this.username = username; this.password = password;
}
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
}
InternetAddress[] 數組傳給 setRecipients。setContent(text, "text/html;charset=gb2312")。MimeMultipart 組合 MimeBodyPart,FileDataSource 讀取文件,MimeUtility.encodeText 編碼文件名防亂碼。| 現象 | 可能原因 | 對策 |
|---|---|---|
| 發送失敗:Authentication failed | 用戶名/密碼錯誤、未開啟 SMTP 服務、需授權碼 | 郵箱設置中開啟 SMTP 並獲取授權碼替代密碼 |
| 附件名亂碼 | 未編碼文件名 | 使用 MimeUtility.encodeText(displayName) |
| 連接超時 | 防火牆/網絡/端口(25/465/587) | 檢查網絡通達性,嘗試 SSL/TLS 端口 |