¿½ÂÂJavaä¸Âå¦Âä½ÂÃ¥ÂÂä¸Â个ç®ÂæÂÂçÂÂé®件åÂÂéÂÂç¨ÂåºÂãÂÂ
å¨Javaå¼ÂÃ¥ÂÂä¸Âï¼Âé®件åÂÂéÂÂÃ¥ÂÂè½æÂ¯å¸¸è§ÂçÂÂéÂÂæ±ÂåºæÂ¯ï¼Âä¾Âå¦Âç¨æÂ·æ³¨åÂÂéªÂè¯ÂãÂÂç³»ç»ÂéÂÂçÂ¥ãÂÂå¯Âç ÂéÂÂç½®çÂÂãÂÂæÂ¾ÂÂå°Â详ç»Âä»Âç»Âå¦Âä½Â使ç¨JavaMail APIå®Âç°ä¸Â个ç®ÂæÂÂçÂÂé®件åÂÂéÂÂç¨ÂåºÂï¼Âæ¶µçÂÂSMTPÃ¥ÂÂè®®åºç¡ÂãÂÂä¾ÂèµÂé Âç½®ãÂÂæ ¸å¿Â代ç Âå®Âç°åÂÂå¼Â常å¤ÂçÂÂçÂÂå 容ãÂÂéÂÂè¿Âå®ÂæÂ´çÂÂ代ç Â示ä¾ÂÃ¥ÂÂÃ¥ÂÂæÂ¥è®²è§£ï¼Â帮å©å¼ÂÃ¥ÂÂè 快éÂÂæÂÂæÂ¡é®件åÂÂéÂÂçÂÂæ ¸å¿ÂæÂÂæÂ¯ãÂÂ
ä¸ÂãÂÂé®件åÂÂéÂÂæÂÂæÂ¯åºç¡Â
é®件åÂÂéÂÂ主è¦Âä¾ÂèµÂSMTPï¼ÂSimple Mail Transfer Protocolï¼ÂÃ¥ÂÂè®®ï¼Âå®ÂæÂ¯äºÂèÂÂç½Âä¸Âç¨äºÂä¼ è¾ÂçµåÂÂé®件çÂÂæ ÂÃ¥ÂÂÃ¥ÂÂè®®ãÂÂJavaéÂÂè¿ÂJavaMail APIï¼Âç°å±ÂäºÂJakarta Mail项ç®ï¼ÂæÂÂä¾Â对SMTPÃ¥ÂÂè®®çÂÂå°Â裠ï¼Âå¼ÂÃ¥ÂÂè æÂ éÂÂç´æÂ¥å¤ÂçÂÂåºÂå±Âç½Âç»ÂéÂÂä¿¡ï¼ÂåªéÂÂè°Âç¨APIå³å¯å®ÂæÂÂé®件åÂÂéÂÂãÂÂ
JavaMailçÂÂæ ¸å¿Âç»Âä»¶å æÂ¬ï¼Â
- Sessionï¼Âé®件ä¼Âè¯Â对象ï¼Âç¨äºÂé Âç½®SMTPæÂÂå¡å¨信æÂ¯
- Transportï¼Âé®件传è¾ÂÃ¥ÂÂè®®å®Âç°ï¼Âè´Âè´£ä¸ÂSMTPæÂÂå¡å¨éÂÂä¿¡
- Messageï¼Âé®件å 容å°Â裠类ï¼ÂæÂ¯æÂÂæÂÂæÂ‹ÂÂéÂÂä»¶çÂÂ
- Addressï¼Âé®件å°åÂÂç±»ï¼ÂåºåÂÂÃ¥ÂÂ件人/æÂ¶ä»¶äºº
äºÂãÂÂç¯å¢ÂÃ¥ÂÂå¤Âä¸Âä¾ÂèµÂé Âç½®
使ç¨JavaMailÃ¥ÂÂéÂÂæ·»å ä¾ÂèµÂãÂÂMaven项ç®å¨pom.xmlä¸Âæ·»å ï¼Â
com.sun.mail
jakarta.mail
2.0.1
Gradle项ç®åÂÂæ·»å ï¼Â
implementation 'com.sun.mail:jakarta.mail:2.0.1'
æÂ¤å¤ÂéÂÂÃ¥ÂÂå¤ÂSMTPæÂÂå¡å¨信æÂ¯ï¼Â常è§ÂæÂÂå¡åÂÂçÂÂé Âç½®å¦Âä¸Âï¼Â
æÂÂå¡å | SMTPæÂÂå¡å¨ | 端å£ | å å¯ÂæÂ¹å¼ |
---|---|---|---|
QQé®箱 | smtp.qq.com | 465/587 | SSL/TLS |
163é®箱 | smtp.163.com | 465/994 | SSL |
Gmail | smtp.gmail.com | 587 | TLS |
ä¸ÂãÂÂæ ¸å¿Â代ç Âå®Âç°
以ä¸ÂæÂ¯ä¸Â个å®ÂæÂ´çÂÂé®件åÂÂéÂÂ示ä¾Âï¼Âå å«纯æÂÂæÂŽÂ®ä»¶åÂÂHTMLé®件两ç§Âå½¢å¼Âï¼Â
1. åºç¡Âé®件åÂÂéÂÂå®Âç°
import jakarta.mail.*;
import jakarta.mail.internet.*;
import java.util.Properties;
public class SimpleEmailSender {
public static void sendTextEmail(String host, int port,
String username, String password,
String from, String to,
String subject, String content) {
// 1. éÂ
Âç½®SMTPå±ÂæÂ§
Properties props = new Properties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", port);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.ssl.enable", "true"); // å¯ç¨SSL
// 2. Ã¥ÂÂ建Session对象
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
// 3. Ã¥ÂÂ建MimeMessage对象
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject(subject);
message.setText(content);
// 4. Ã¥ÂÂéÂÂé®件
Transport.send(message);
System.out.println("é®件åÂÂéÂÂæÂÂÃ¥ÂÂï¼Â");
} catch (MessagingException e) {
System.err.println("é®件åÂÂéÂÂ失败: " + e.getMessage());
}
}
public static void main(String[] args) {
String host = "smtp.qq.com";
int port = 465;
String username = "your_email@qq.com";
String password = "your_authorization_code"; // 注æÂÂ使ç¨æÂÂæÂÂç ÂèÂÂéÂÂå¯Âç Â
String from = "your_email@qq.com";
String to = "recipient@example.com";
String subject = "Javaé®件æµÂè¯Â";
String content = "è¿ÂæÂ¯ä¸Âå°ÂéÂÂè¿ÂJavaç¨ÂåºÂÃ¥ÂÂéÂÂçÂÂæµÂè¯Âé®件ãÂÂ";
sendTextEmail(host, port, username, password, from, to, subject, content);
}
}
2. HTMLæ ¼å¼Âé®件åÂÂéÂÂ
HTMLé®件æÂ¯æÂÂå¯ÂæÂÂæÂ¬æ ¼å¼Âï¼Âå¯éÂÂè¿ÂsetContentæÂ¹æ³Âå®Âç°ï¼Â
public static void sendHtmlEmail(String host, int port,
String username, String password,
String from, String to,
String subject, String htmlContent) {
Properties props = new Properties();
props.putAll(getSmtpProperties(host, port));
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject(subject);
// 设置HTMLÃ¥ÂÂ
容
message.setContent(htmlContent, "text/html;charset=UTF-8");
Transport.send(message);
System.out.println("HTMLé®件åÂÂéÂÂæÂÂÃ¥ÂÂï¼Â");
} catch (MessagingException e) {
System.err.println("HTMLé®件åÂÂéÂÂ失败: " + e.getMessage());
}
}
// è°Âç¨示ä¾Â
String htmlContent = "
HTMLé®件æµÂè¯Â
" +
"è¿ÂæÂ¯ä¸Âå°ÂHTMLæ ¼å¼ÂçÂÂé®件
";
sendHtmlEmail(host, port, username, password, from, to, "HTMLé®件", htmlContent);
3. æ·»å éÂÂä»¶çÂÂé®件åÂÂéÂÂ
éÂÂè¿ÂMimeMultipartå®Âç°å¤Âé¨åÂÂé®件ï¼ÂæÂ£æÂÂ+éÂÂä»¶ï¼Âï¼Â
public static void sendEmailWithAttachment(String host, int port,
String username, String password,
String from, String to,
String subject, String textContent,
String filePath) {
Properties props = new Properties();
props.putAll(getSmtpProperties(host, port));
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject(subject);
// Ã¥ÂÂ建å¤Âé¨åÂÂæ¶ÂæÂ¯
MimeMultipart multipart = new MimeMultipart();
// æ·»å æÂÂæÂŽÂ¨åÂÂ
MimeBodyPart textPart = new MimeBodyPart();
textPart.setText(textContent);
multipart.addBodyPart(textPart);
// æ·»å éÂÂä»¶é¨åÂÂ
MimeBodyPart attachmentPart = new MimeBodyPart();
attachmentPart.attachFile(filePath);
multipart.addBodyPart(attachmentPart);
message.setContent(multipart);
Transport.send(message);
System.out.println("带éÂÂä»¶é®件åÂÂéÂÂæÂÂÃ¥ÂÂï¼Â");
} catch (Exception e) {
System.err.println("带éÂÂä»¶é®件åÂÂéÂÂ失败: " + e.getMessage());
}
}
// è¾Â
å©æÂ¹æ³Âï¼Âè·åÂÂSMTPåºç¡ÂéÂ
Âç½®
private static Properties getSmtpProperties(String host, int port) {
Properties props = new Properties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", port);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.ssl.enable", "true");
return props;
}
Ã¥ÂÂãÂÂ常è§Âé®é¢Âä¸Âè§£å³æÂ¹æ¡Â
1. 认è¯Â失败é®é¢Â
éÂÂ误表ç°ï¼Âjavax.mail.AuthenticationFailedException
è§£å³æÂ¹æ¡Âï¼Â
- 确认使ç¨æÂ£ç¡®çÂÂSMTPæÂÂå¡å¨å°åÂÂÃ¥ÂÂ端å£
- æ£ÂæÂ¥æÂ¯å¦å¯ç¨äºÂSMTPæÂÂå¡ï¼Âå¦ÂQQé®箱éÂÂå¨设置ä¸Âå¼Âå¯ï¼Â
- 使ç¨æÂÂæÂÂç ÂèÂÂéÂÂé®箱å¯Âç Âï¼Âå¤ÂæÂ°æÂÂå¡åÂÂè¦Âæ±Âï¼Â
2. è¿ÂæÂ¥è¶ æÂ¶é®é¢Â
éÂÂ误表ç°ï¼Âjavax.mail.MessagingException: Could not connect to SMTP host
è§£å³æÂ¹æ¡Âï¼Â
- æ£ÂæÂ¥ç½Âç»ÂæÂ¯å¦å¯以访é®SMTPæÂÂå¡å¨
- å°Âè¯ÂæÂ´æÂ¢ç«¯å£ï¼Âå¦Â465/587ï¼Â
- å ³éÂÂé²ç«å¢Â临æÂ¶æµÂè¯Âï¼ÂçÂÂ产ç¯å¢ÂéÂÂé Âç½®è§ÂÃ¥ÂÂï¼Â
3. ä¸ÂæÂÂä¹±ç Âé®é¢Â
è§£å³æÂ¹æ¡Âï¼Â
- 设置åÂÂ符éÂÂï¼Â
message.setContent(content, "text/plain;charset=UTF-8")
- HTMLé®件ä¸ÂæÂÂç¡®æÂÂå®Âmetaæ Âç¾ï¼Â
äºÂãÂÂæÂÂä½³å®Â践建议
1. **é Âç½®åÂÂ离**ï¼Âå°ÂSMTPé Âç½®æÂÂÃ¥ÂÂå°propertiesæÂÂä»¶æÂÂç¯å¢ÂÃ¥ÂÂéÂÂä¸Â
2. **å¼Â常å¤ÂçÂÂ**ï¼ÂåºåÂÂå¯æÂ¢å¤Âå¼Â常ï¼Âå¦Âç½Âç»Âé®é¢Âï¼ÂÃ¥ÂÂä¸Âå¯æÂ¢å¤Âå¼Â常ï¼Âå¦Â认è¯Â失败ï¼Â
3. **å¼ÂæÂ¥åÂÂéÂÂ**ï¼Â使ç¨线ç¨Âæ± æÂÂæ¶ÂæÂ¯éÂÂÃ¥ÂÂå®Âç°å¼ÂæÂ¥åÂÂéÂÂï¼Âé¿å Âé»å¡Â主线ç¨Â
4. **æÂ¥å¿Âè®°å½Â**ï¼Âè®°å½Âé®件åÂÂéÂÂç¶æÂÂãÂÂæÂ¶ä»¶äººãÂÂæÂ¶é´çÂÂä¿¡æÂ¯
5. **å®Âå ¨èÂÂèÂÂ**ï¼Â
- ä¸Âè¦Â硬ç¼Âç Âå¯Âç Âï¼Â使ç¨é Âç½®æÂÂä»¶æÂÂå¯Âé¥管çÂÂæÂÂå¡
- éÂÂå¶é®件åÂÂéÂÂé¢ÂçÂÂï¼Âé²æÂ¢è¢«å½Âä½ÂÃ¥ÂÂå¾é®件æºÂ
å ÂãÂÂå®ÂæÂ´ç¤ºä¾Âç±»
import jakarta.mail.*;
import jakarta.mail.internet.*;
import java.io.File;
import java.util.Properties;
public class EmailService {
private final String host;
private final int port;
private final String username;
private final String password;
public EmailService(String host, int port, String username, String password) {
this.host = host;
this.port = port;
this.username = username;
this.password = password;
}
public boolean sendTextEmail(String from, String to,
String subject, String content) {
try {
MimeMessage message = createMessage(from, to, subject);
message.setText(content);
Transport.send(message, getAuth());
return true;
} catch (Exception e) {
System.err.println("Ã¥ÂÂéÂÂæÂÂæÂŽÂ®ä»¶å¤±è´¥: " + e.getMessage());
return false;
}
}
public boolean sendHtmlEmail(String from, String to,
String subject, String htmlContent) {
try {
MimeMessage message = createMessage(from, to, subject);
message.setContent(htmlContent, "text/html;charset=UTF-8");
Transport.send(message, getAuth());
return true;
} catch (Exception e) {
System.err.println("Ã¥ÂÂéÂÂHTMLé®件失败: " + e.getMessage());
return false;
}
}
public boolean sendEmailWithAttachment(String from, String to,
String subject, String textContent,
String filePath) {
try {
MimeMessage message = createMessage(from, to, subject);
MimeMultipart multipart = new MimeMultipart();
// æ·»å æÂÂæÂŽÂ¨åÂÂ
MimeBodyPart textPart = new MimeBodyPart();
textPart.setText(textContent);
multipart.addBodyPart(textPart);
// æ·»å éÂÂä»¶é¨åÂÂ
MimeBodyPart attachmentPart = new MimeBodyPart();
attachmentPart.attachFile(new File(filePath));
multipart.addBodyPart(attachmentPart);
message.setContent(multipart);
Transport.send(message, getAuth());
return true;
} catch (Exception e) {
System.err.println("Ã¥ÂÂéÂÂ带éÂÂä»¶é®件失败: " + e.getMessage());
return false;
}
}
private MimeMessage createMessage(String from, String to, String subject)
throws MessagingException {
Properties props = new Properties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", port);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.ssl.enable", "true");
Session session = Session.getInstance(props);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject(subject);
return message;
}
private Authenticator getAuth() {
return new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
};
}
}
ä¸ÂãÂÂæÂ»ç»Â
æÂ¾ÂÂ详ç»Âä»Âç»ÂäºÂJavaMail APIçÂÂæ ¸å¿Âç¨æ³Âï¼ÂéÂÂè¿Âä¸Â个å±Â次çÂÂå®Âç°ï¼Âåºç¡ÂæÂÂæÂŽÂ®ä»¶ãÂÂHTMLé®件ãÂÂ带éÂÂä»¶é®件ï¼Âå±Â示äºÂé®件åÂÂéÂÂçÂÂå®ÂæÂ´æµÂç¨ÂãÂÂå ³é®ç¹å æÂ¬ï¼Â
- æÂ£ç¡®é Âç½®SMTPæÂÂå¡å¨å±ÂæÂ§
- 使ç¨SessionÃ¥ÂÂTransport对象管çÂÂé®件ä¼Âè¯Â
- æ ¹æÂ®éÂÂæ±ÂéÂÂæÂ©MimeMessageæÂÂMimeMultipart
- 妥åÂÂå¤ÂçÂÂÃ¥ÂÂç±»å¼Â常æÂ åµ
å®Âé åºÂç¨ä¸Âï¼Â建议å°Âé®件åÂÂéÂÂÃ¥ÂÂè½å°Â裠为ç¬ç«ÂæÂÂå¡ï¼Âç»ÂÃ¥ÂÂSpringæ¡ÂæÂ¶çÂÂ@Async注解å®Âç°å¼ÂæÂ¥åÂÂéÂÂï¼ÂæÂÂ使ç¨QuartzçÂÂè°Â度æ¡ÂæÂ¶å®Âç°å®ÂæÂ¶åÂÂéÂÂãÂÂ对äºÂé«Âå¹¶åÂÂåºæÂ¯ï¼Âå¯èÂÂèÂÂ使ç¨è¿ÂæÂ¥æ± æÂÂæÂ¯ä¼ÂÃ¥ÂÂSMTPè¿ÂæÂ¥ç®¡çÂÂãÂÂ
å ³é®è¯Âï¼ÂJavaMailãÂÂSMTPÃ¥ÂÂè®®ãÂÂé®件åÂÂéÂÂãÂÂJavaç¨ÂåºÂãÂÂJakarta MailãÂÂéÂÂä»¶é®件ãÂÂHTMLé®件ãÂÂ认è¯Âé Âç½®
ç®Âä»Âï¼ÂæÂ¾ÂÂ详ç»Âä»Âç»ÂJavaä¸Âå®Âç°é®件åÂÂéÂÂçÂÂæÂÂæÂ¯æÂ¹æ¡Âï¼Âæ¶µçÂÂSMTPÃ¥ÂÂè®®åºç¡ÂãÂÂJavaMail API使ç¨ãÂÂ纯æÂÂæÂ¬/HTML/带éÂÂä»¶ä¸Âç§Âé®件形å¼ÂçÂÂå®ÂæÂ´ä»£ç Âå®Âç°ï¼Â以åÂÂ常è§Âé®é¢Âè§£å³æÂ¹æ¡ÂÃ¥ÂÂæÂÂä½³å®Â践建议ï¼Â帮å©å¼ÂÃ¥ÂÂè 快éÂÂæÂÂæÂ¡Javaé®件åÂÂéÂÂæ ¸å¿ÂæÂÂè½ãÂÂ