一、SMTP協議
SMTP(Simple Mail Transfer Protocol)是因特網電子郵件傳輸的標準協議,使用TCP協議25號端口。JavaMail是Java EE平台上發送、接收電子郵件的API規範,JavaMail還實現了SMTP及IMAP等郵件協議。JavaMail發送電子郵件的過程就是使用SMTP協議與郵件服務器進行通信,傳輸郵件消息傳輸給對方。SMTP協議發送郵件需要實現以下幾個步驟:
1、建立連接(connect):建立與郵件服務器連接,獲取服務器連接的Socket對象。
2、握手(handshake):客戶端和服務器通過交換特定的協議碼來確認對方的身份和協議,以及對方郵件服務器是否開啟SMTP服務,一般客戶端在請求連接後會發送EHLO或HELO命令請求服務器確認身份並獲取服務器支持的協議。
3、登錄(login):進行SMTP用戶認證,使用用戶名和密碼(如果SMTP服務器要求的話)。
4、設置發件人(set sender):使用MAIL FROM命令指定哪個郵件地址將作為發件人(MAIL FROM後面加上要發送郵件的發件人的郵件地址)。
5、設置收件人(set recipient):使用RCPT TO命令指定哪個郵件地址將作為收件人(RCPT TO後面加上要發送郵件的收件人的郵件地址)。
6、設置郵件內容(set content):使用DATA命令開始發送郵件內容,通過Socket輸入流將郵件內容發送至服務器。
7、退出(quit):使用QUIT命令關閉SMTP連接。
二、JavaMail API
JavaMail API包含兩個主要類庫:
1、javax.mail: JavaMail中SMTP和IMAP協議的實現。
2、javax.mail.internet:該類庫用於編碼和解析Internet消息。它包括MIME(Multipurpose Internet Mail Extensions)處理的實現。
三、實現步驟
以下代碼實現了基本郵件發送功能,其中SMTP_SERVER為郵件服務器地址,AUTH_USER和AUTH_PWD為郵件服務器賬號和密碼,TO_MAIL為收件人郵箱地址,FROM_MAIL為發件人郵箱地址,SUBJECT為郵件主題,BODY為郵件內容。
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
public class SendMail{
public static void main(String[] args) throws Exception{
final String SMTP_SERVER = "smtp.qq.com";
final String AUTH_USER = "example@qq.com";
final String AUTH_PWD = "password";
String TO_MAIL = "to@example.com";
String FROM_MAIL = "example@qq.com";
String SUBJECT = "郵件主題";
String BODY = "郵件內容";
//設置郵件會話屬性
Properties props = new Properties();
props.put("mail.smtp.host", SMTP_SERVER);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.ssl.enable", "true");
props.setProperty("mail.smtp.port", "465");
// 獲取會話對象
Session session = Session.getInstance(props, new javax.mail.Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(AUTH_USER, AUTH_PWD);
}
});
//設置郵件消息
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(FROM_MAIL));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(TO_MAIL));
message.setSubject(SUBJECT);
message.setText(BODY);
//發送郵件
Transport.send(message);
System.out.println("郵件已發送至" + TO_MAIL);
}
}
四、其他實現方式
1、發送附件
以下代碼實現了帶附件的郵件發送功能,其中attachments為附件地址。
//設置郵件消息
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(FROM_MAIL));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(TO_MAIL));
message.setSubject(SUBJECT);
// 創建整個郵件的容器描述數據對象
MimeMultipart multipart = new MimeMultipart();
// 添加郵件的文本內容
BodyPart contentPart = new MimeBodyPart();
contentPart.setText(BODY);
multipart.addBodyPart(contentPart);
// 添加附件
for(String filePath : attachments){
BodyPart attachmentPart = new MimeBodyPart();
File file = new File(filePath);
if (file.exists()) {
DataSource source = new FileDataSource(file);
attachmentPart.setDataHandler(new DataHandler(source));
attachmentPart.setFileName(MimeUtility.encodeText(file.getName()));
multipart.addBodyPart(attachmentPart);
}
}
// 將多重消息放到一個複合消息中
message.setContent(multipart);
//發送郵件
Transport.send(message);
2、HTML郵件
以下代碼實現了HTML格式的郵件發送功能,其中HTML為HTML郵件內容。
//設置郵件消息 MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(FROM_MAIL)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(TO_MAIL)); message.setSubject(SUBJECT); // 內容採用html方式並設置編碼方式為utf-8 message.setContent(HTML, "text/html;charset=utf-8"); //發送郵件 Transport.send(message);
3、郵件模板
以下代碼實現了使用Freemarker模板生成郵件內容並發送郵件的功能,其中templatePath為模板文件所在路徑,data為模板數據。
//設置郵件消息
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(FROM_MAIL));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(TO_MAIL));
message.setSubject(SUBJECT);
// 解析模板
Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(new File(templatePath));
Template template = cfg.getTemplate("template.ftl");
StringWriter out = new StringWriter();
template.process(data, out);
String content = out.toString();
// 內容採用html方式並設置編碼方式為utf-8
message.setContent(content, "text/html;charset=utf-8");
//發送郵件
Transport.send(message);
原創文章,作者:TGNKE,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/368647.html
微信掃一掃
支付寶掃一掃