Java常用工具類之傳送郵件
阿新 • • 發佈:2022-04-29
package com.csice.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.Date; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.Address; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.Message.RecipientType; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeUtility; /** * 使用SMTP協議傳送電子郵件 */ public class sendEmailCode { // 郵件傳送協議 private final static String PROTOCOL = "smtp"; // SMTP郵件伺服器 private final static String HOST = "smtp.163.com"; // SMTP郵件伺服器預設埠 private final static String PORT = "25"; // 是否要求身份認證 private final static String IS_AUTH = "true"; // 是否啟用除錯模式(啟用除錯模式可列印客戶端與伺服器互動過程時一問一答的響應訊息) private final static String IS_ENABLED_DEBUG_MOD = "true"; // 發件人 private static String from = "[email protected]"; // 收件人 private static String to = "[email protected]"; // 初始化連線郵件伺服器的會話資訊 private static Properties props = null; static { props = new Properties(); props.setProperty("mail.transport.protocol", PROTOCOL); props.setProperty("mail.smtp.host", HOST); props.setProperty("mail.smtp.port", PORT); props.setProperty("mail.smtp.auth", IS_AUTH); props.setProperty("mail.debug",IS_ENABLED_DEBUG_MOD); } /** * 傳送簡單的文字郵件 */ public static boolean sendTextEmail(String to,int code) throws Exception { try { // 建立Session例項物件 Session session1 = Session.getDefaultInstance(props); // 建立MimeMessage例項物件 MimeMessage message = new MimeMessage(session1); // 設定發件人 message.setFrom(new InternetAddress(from)); // 設定郵件主題 message.setSubject("內燃機註冊驗證碼"); // 設定收件人 message.setRecipient(RecipientType.TO, new InternetAddress(to)); // 設定傳送時間 message.setSentDate(new Date()); // 設定純文字內容為郵件正文 message.setText("您的驗證碼是:"+code+"!驗證碼有效期是10分鐘,過期後請重新獲取!" + "中國內燃機學會"); // 儲存並生成最終的郵件內容 message.saveChanges(); // 獲得Transport例項物件 Transport transport = session1.getTransport(); // 開啟連線 transport.connect("meijiajiang2016", ""); // 將message物件傳遞給transport物件,將郵件傳送出去 transport.sendMessage(message, message.getAllRecipients()); // 關閉連線 transport.close(); return true; } catch (Exception e) { e.printStackTrace(); return false; } } public static void main(String[] args) throws Exception { sendHtmlEmail("[email protected]", 88888); } /** * 傳送簡單的html郵件 */ public static boolean sendHtmlEmail(String to,int code) throws Exception { // 建立Session例項物件 Session session1 = Session.getInstance(props, new MyAuthenticator()); // 建立MimeMessage例項物件 MimeMessage message = new MimeMessage(session1); // 設定郵件主題 message.setSubject("內燃機註冊"); // 設定傳送人 message.setFrom(new InternetAddress(from)); // 設定傳送時間 message.setSentDate(new Date()); // 設定收件人 message.setRecipients(RecipientType.TO, InternetAddress.parse(to)); // 設定html內容為郵件正文,指定MIME型別為text/html型別,並指定字元編碼為gbk message.setContent("<div style='width: 600px;margin: 0 auto'><h3 style='color:#003E64; text-align:center; '>內燃機註冊驗證碼</h3><p style=''>尊敬的使用者您好:</p><p style='text-indent: 2em'>您在註冊內燃機賬號,此次的驗證碼是:"+code+",有效期10分鐘!如果過期請重新獲取。</p><p style='text-align: right; color:#003E64; font-size: 20px;'>中國內燃機學會</p></div>","text/html;charset=utf-8"); //設定自定義發件人暱稱 String nick=""; try { nick=javax.mail.internet.MimeUtility.encodeText("中國內燃機學會"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } message.setFrom(new InternetAddress(nick+" <"+from+">")); // 儲存並生成最終的郵件內容 message.saveChanges(); // 傳送郵件 try { Transport.send(message); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 傳送帶內嵌圖片的HTML郵件 */ public static void sendHtmlWithInnerImageEmail() throws MessagingException { // 建立Session例項物件 Session session = Session.getDefaultInstance(props, new MyAuthenticator()); // 建立郵件內容 MimeMessage message = new MimeMessage(session); // 郵件主題,並指定編碼格式 message.setSubject("帶內嵌圖片的HTML郵件", "utf-8"); // 發件人 message.setFrom(new InternetAddress(from)); // 收件人 message.setRecipients(RecipientType.TO, InternetAddress.parse(to)); // 抄送 message.setRecipient(RecipientType.CC, new InternetAddress("[email protected]")); // 密送 (不會在郵件收件人名單中顯示出來) message.setRecipient(RecipientType.BCC, new InternetAddress("[email protected]")); // 傳送時間 message.setSentDate(new Date()); // 建立一個MIME子型別為“related”的MimeMultipart物件 MimeMultipart mp = new MimeMultipart("related"); // 建立一個表示正文的MimeBodyPart物件,並將它加入到前面建立的MimeMultipart物件中 MimeBodyPart htmlPart = new MimeBodyPart(); mp.addBodyPart(htmlPart); // 建立一個表示圖片資源的MimeBodyPart物件,將將它加入到前面建立的MimeMultipart物件中 MimeBodyPart imagePart = new MimeBodyPart(); mp.addBodyPart(imagePart); // 將MimeMultipart物件設定為整個郵件的內容 message.setContent(mp); // 設定內嵌圖片郵件體 DataSource ds = new FileDataSource(new File("resource/firefoxlogo.png")); DataHandler dh = new DataHandler(ds); imagePart.setDataHandler(dh); imagePart.setContentID("firefoxlogo.png"); // 設定內容編號,用於其它郵件體引用 // 建立一個MIME子型別為"alternative"的MimeMultipart物件,並作為前面建立的htmlPart物件的郵件內容 MimeMultipart htmlMultipart = new MimeMultipart("alternative"); // 建立一個表示html正文的MimeBodyPart物件 MimeBodyPart htmlBodypart = new MimeBodyPart(); // 其中cid=androidlogo.gif是引用郵件內部的圖片,即imagePart.setContentID("androidlogo.gif");方法所儲存的圖片 htmlBodypart.setContent("<span style='color:red;'>這是帶內嵌圖片的HTML郵件哦!!!<img src="cid:firefoxlogo.png" /></span>","text/html;charset=utf-8"); htmlMultipart.addBodyPart(htmlBodypart); htmlPart.setContent(htmlMultipart); // 儲存並生成最終的郵件內容 message.saveChanges(); // 傳送郵件 Transport.send(message); } /** * 傳送帶內嵌圖片、附件、多收件人(顯示郵箱姓名)、郵件優先順序、閱讀回執的完整的HTML郵件 */ public static void sendMultipleEmail() throws Exception { String charset = "utf-8"; // 指定中文編碼格式 // 建立Session例項物件 Session session = Session.getInstance(props,new MyAuthenticator()); // 建立MimeMessage例項物件 MimeMessage message = new MimeMessage(session); // 設定主題 message.setSubject("使用JavaMail傳送混合組合型別的郵件測試"); // 設定傳送人 message.setFrom(new InternetAddress(from,"新浪測試郵箱",charset)); // 設定收件人 message.setRecipients(RecipientType.TO, new Address[] { // 引數1:郵箱地址,引數2:姓名(在客戶端收件只顯示姓名,而不顯示郵件地址),引數3:姓名中文字串編碼 new InternetAddress("[email protected]", "張三_sohu", charset), new InternetAddress("[email protected]", "李四_163", charset), } ); // 設定抄送 message.setRecipient(RecipientType.CC, new InternetAddress("[email protected]","王五_gmail",charset)); // 設定密送 message.setRecipient(RecipientType.BCC, new InternetAddress("[email protected]", "趙六_QQ", charset)); // 設定傳送時間 message.setSentDate(new Date()); // 設定回覆人(收件人回覆此郵件時,預設收件人) message.setReplyTo(InternetAddress.parse(""" + MimeUtility.encodeText("田七") + "" <[email protected]>")); // 設定優先順序(1:緊急 3:普通 5:低) message.setHeader("X-Priority", "1"); // 要求閱讀回執(收件人閱讀郵件時會提示回覆發件人,表明郵件已收到,並已閱讀) message.setHeader("Disposition-Notification-To", from); // 建立一個MIME子型別為"mixed"的MimeMultipart物件,表示這是一封混合組合型別的郵件 MimeMultipart mailContent = new MimeMultipart("mixed"); message.setContent(mailContent); // 附件 MimeBodyPart attach1 = new MimeBodyPart(); MimeBodyPart attach2 = new MimeBodyPart(); // 內容 MimeBodyPart mailBody = new MimeBodyPart(); // 將附件和內容新增到郵件當中 mailContent.addBodyPart(attach1); mailContent.addBodyPart(attach2); mailContent.addBodyPart(mailBody); // 附件1(利用jaf框架讀取資料來源生成郵件體) DataSource ds1 = new FileDataSource("resource/Earth.bmp"); DataHandler dh1 = new DataHandler(ds1); attach1.setFileName(MimeUtility.encodeText("Earth.bmp")); attach1.setDataHandler(dh1); // 附件2 DataSource ds2 = new FileDataSource("resource/如何學好C語言.txt"); DataHandler dh2 = new DataHandler(ds2); attach2.setDataHandler(dh2); attach2.setFileName(MimeUtility.encodeText("如何學好C語言.txt")); // 郵件正文(內嵌圖片+html文字) MimeMultipart body = new MimeMultipart("related"); //郵件正文也是一個組合體,需要指明組合關係 mailBody.setContent(body); // 郵件正文由html和圖片構成 MimeBodyPart imgPart = new MimeBodyPart(); MimeBodyPart htmlPart = new MimeBodyPart(); body.addBodyPart(imgPart); body.addBodyPart(htmlPart); // 正文圖片 DataSource ds3 = new FileDataSource("resource/firefoxlogo.png"); DataHandler dh3 = new DataHandler(ds3); imgPart.setDataHandler(dh3); imgPart.setContentID("firefoxlogo.png"); // html郵件內容 MimeMultipart htmlMultipart = new MimeMultipart("alternative"); htmlPart.setContent(htmlMultipart); MimeBodyPart htmlContent = new MimeBodyPart(); htmlContent.setContent( "<span style='color:red'>這是我自己用java mail傳送的郵件哦!" + "<img src='cid:firefoxlogo.png' /></span>" , "text/html;charset=gbk"); htmlMultipart.addBodyPart(htmlContent); // 儲存郵件內容修改 message.saveChanges(); /*File eml = buildEmlFile(message); sendMailForEml(eml);*/ // 傳送郵件 Transport.send(message); } /** * 將郵件內容生成eml檔案 * @param message 郵件內容 */ public static File buildEmlFile(Message message) throws MessagingException, FileNotFoundException, IOException { File file = new File("c:\" + MimeUtility.decodeText(message.getSubject())+".eml"); message.writeTo(new FileOutputStream(file)); return file; } /** * 傳送本地已經生成好的email檔案 */ public static void sendMailForEml(File eml) throws Exception { // 獲得郵件會話 Session session = Session.getInstance(props,new MyAuthenticator()); // 獲得郵件內容,即發生前生成的eml檔案 InputStream is = new FileInputStream(eml); MimeMessage message = new MimeMessage(session,is); //傳送郵件 Transport.send(message); } /** * 向郵件伺服器提交認證資訊 */ static class MyAuthenticator extends Authenticator { private String username = "meijiajiang2016"; private String password = ""; public MyAuthenticator() { super(); } public MyAuthenticator(String username, String password) { super(); this.username = username; this.password = password; } @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } } }