一、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-hk/n/368647.html