使用IDEA實現郵件傳送
阿新 • • 發佈:2022-03-06
2、郵件傳送
原理:
編寫程式的四個核心類及程式流程:
需要的jar包:
簡單QQ郵件(無附件)傳送程式碼實現
//傳送一封簡單的郵件 public class MailDemo01 { public static void main(String[] args) throws Exception { Properties prop = new Properties(); prop.setProperty("mail.host","smtp.qq.com"); //設定QQ郵件伺服器 prop.setProperty("mail.transport.protocol","smtp"); //郵件傳送協議 prop.setProperty("mail.smtp.auth","true"); //需要驗證使用者名稱密碼 //關於QQ郵箱,還要設定SSL加密,加上以下程式碼即可 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); prop.put("mail.smtp.ssl.enable","true"); prop.put("mail.smtp.ssl.socketFactory",sf); //使用JavaMail傳送郵件的5個步驟 //1、建立定義整個應用程式所需的環境資訊的Session物件 Session session = Session.getDefaultInstance(prop, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { //發件人郵件使用者名稱、授權碼 return new PasswordAuthentication("[email protected]","****************"); } }); //開啟Session的debug模式,這樣就可以檢視到程式傳送Email的執行狀態 session.setDebug(true); //2、通過session得到transport物件 Transport ts = session.getTransport(); //3、使用郵箱的使用者名稱和授權碼連上郵件伺服器 ts.connect("smtp.qq.com","[email protected]","****************"); //4、建立郵件:寫郵件 //注意需要傳遞Session MimeMessage message = new MimeMessage(session); //指明郵件的發件人 24736743 message.setFrom(new InternetAddress("[email protected]")); //指明郵件的收件人,現在發件人和收件人是一樣的,那就是自己給自己發 message.setRecipient(Message.RecipientType.TO,new InternetAddress("[email protected]")); //郵件的標題 message.setSubject("只包含文字的簡單郵件"); //郵件的文字內容 message.setContent("<h1 style='color:red'>你好啊!</h1>","text/html;charset=UTF-8"); //5、傳送郵件 ts.sendMessage(message,message.getAllRecipients()); //6、關閉連線 ts.close(); } }
複雜QQ郵件(由附件)傳送的實現
MIME(多用途網際網路郵件擴充套件型別)
MineBodyPart類
MineMultipart類
程式碼實現:
public class MailDemo02 { public static void main(String[] args) throws Exception { Properties prop = new Properties(); prop.setProperty("mail.host","smtp.qq.com"); //設定QQ郵件伺服器 prop.setProperty("mail.transport.protocol","smtp"); //郵件傳送協議 prop.setProperty("mail.smtp.auth","true"); //需要驗證使用者名稱密碼 //關於QQ郵箱,還要設定SSL加密,加上以下程式碼即可 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); prop.put("mail.smtp.ssl.enable","true"); prop.put("mail.smtp.ssl.socketFactory",sf); //使用JavaMail傳送郵件的5個步驟 //1、建立定義整個應用程式所需的環境資訊的Session物件 Session session = Session.getDefaultInstance(prop, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { //發件人郵件使用者名稱、授權碼 return new PasswordAuthentication("[email protected]","****************"); } }); //開啟Session的debug模式,這樣就可以檢視到程式傳送Email的執行狀態 session.setDebug(true); //2、通過session得到transport物件 Transport ts = session.getTransport(); //3、使用郵箱的使用者名稱和授權碼連上郵件伺服器 ts.connect("smtp.qq.com","[email protected]","****************"); //4、建立郵件:寫郵件 //注意需要傳遞Session MimeMessage message = new MimeMessage(session); //指明郵件的發件人 24736743 message.setFrom(new InternetAddress("[email protected]")); //指明郵件的收件人,現在發件人和收件人是一樣的,那就是自己給自己發 message.setRecipient(Message.RecipientType.TO,new InternetAddress("[email protected]")); //郵件的標題 message.setSubject("複雜的郵件"); //=================================================================================== //準備圖片資料 MimeBodyPart image = new MimeBodyPart(); //圖片需要經過資料處理... DataHandler:資料處理 DataHandler dh = new DataHandler(new FileDataSource("C:\\Users\\wangyudong\\Desktop\\1.png")); image.setDataHandler(dh);//在我們的body中放入這個處理的圖片資料 image.setContentID("bz.jpg");//給圖片設定一個ID,我們在後面可以使用 //準備正文資料 MimeBodyPart text = new MimeBodyPart(); text.setContent("這是一封郵件正文帶圖片<img src='cid:bz.jpg'>的郵件","text/html;charset=UTF-8"); //描述資料關係 MimeMultipart mm = new MimeMultipart(); mm.addBodyPart(text); mm.addBodyPart(image); mm.setSubType("related"); //設定到訊息中,儲存修改 message.setContent(mm);//把最後編輯好的郵件放到訊息當中 message.saveChanges();//儲存修改! //================================================================= //5、傳送郵件 ts.sendMessage(message,message.getAllRecipients()); //6、關閉連線 ts.close(); } } ==================================================================================== public class MailDemo03 { public static void main(String[] args) throws Exception { Properties prop = new Properties(); prop.setProperty("mail.host","smtp.qq.com"); //設定QQ郵件伺服器 prop.setProperty("mail.transport.protocol","smtp"); //郵件傳送協議 prop.setProperty("mail.smtp.auth","true"); //需要驗證使用者名稱密碼 //關於QQ郵箱,還要設定SSL加密,加上以下程式碼即可 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); prop.put("mail.smtp.ssl.enable","true"); prop.put("mail.smtp.ssl.socketFactory",sf); //使用JavaMail傳送郵件的5個步驟 //1、建立定義整個應用程式所需的環境資訊的Session物件 Session session = Session.getDefaultInstance(prop, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { //發件人郵件使用者名稱、授權碼 return new PasswordAuthentication("[email protected]","****************"); } }); //開啟Session的debug模式,這樣就可以檢視到程式傳送Email的執行狀態 session.setDebug(true); //2、通過session得到transport物件 Transport ts = session.getTransport(); //3、使用郵箱的使用者名稱和授權碼連上郵件伺服器 ts.connect("smtp.qq.com","[email protected]","****************"); //4、連線上之後我們需要傳送郵件; MimeMessage mimeMessage = imageMail(session); //5、傳送郵件 ts.sendMessage(mimeMessage,mimeMessage.getAllRecipients()); //6、關閉連線 ts.close(); } public static MimeMessage imageMail(Session session) throws MessagingException{ //訊息的固定資訊 MimeMessage mimeMessage = new MimeMessage(session); //指明郵件的發件人 24736743 mimeMessage.setFrom(new InternetAddress("[email protected]")); //指明郵件的收件人,現在發件人和收件人是一樣的,那就是自己給自己發 mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("[email protected]")); //郵件的標題 mimeMessage.setSubject("我也不知道是個什麼東西就發給你了"); /* 編寫郵件的內容 1.圖片 2.附件 3.文字 */ //圖片 MimeBodyPart body1 = new MimeBodyPart(); body1.setDataHandler(new DataHandler(new FileDataSource("C:\\Users\\wangyudong\\Desktop\\1.png"))); body1.setContentID("yhbxb.png");//圖片設定ID //文字 MimeBodyPart body2 = new MimeBodyPart(); body2.setContent("請注意,我不是廣告","text/html;charset=utf-8"); //附件 MimeBodyPart body3 = new MimeBodyPart(); body3.setDataHandler(new DataHandler(new FileDataSource("C:\\Users\\wangyudong\\Desktop\\1.png"))); body3.setFileName("1.png");//附件設定名字 MimeBodyPart body4 = new MimeBodyPart(); body4.setDataHandler(new DataHandler(new FileDataSource("C:\\Users\\wangyudong\\Desktop\\1.sql"))); body4.setFileName("");//附件設定名字 //拼裝郵件正文內容 MimeMultipart multipart1 = new MimeMultipart(); multipart1.addBodyPart(body1); multipart1.addBodyPart(body2); multipart1.setSubType("related");//1.文字和圖片內嵌成功 //new MimeBodyPart().setContent(multipart1); //將拼裝好的正文內容設定為主體 MimeBodyPart contentText = new MimeBodyPart(); contentText.setContent(multipart1); //拼接附件 MimeMultipart allFile = new MimeMultipart(); allFile.addBodyPart(body3);//附件 allFile.addBodyPart(body4);//附件 allFile.addBodyPart(contentText);//正文 allFile.setSubType("mixed");//正文和附件都存在郵件中,所有型別設定為mixed //放到Message訊息中 mimeMessage.setContent(allFile); mimeMessage.saveChanges(); return mimeMessage; } }
3、網站註冊傳送郵件的程式碼實現
準備檔案:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!--Servlet 依賴--> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <!--JSP依賴--> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> </dependency> <!--standard標籤庫--> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <!--JSTL表示式的依賴--> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>1.2</version> </dependency> <!--連線資料庫--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.79</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency> </dependencies> ====================================================================================== <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <form action="${pageContext.request.contextPath}/RegisterServlet.do" method="post"> 使用者名稱:<input type="text" name="username"><br/> 密碼:<input type="password" name="password"><br/> 郵箱:<input type="text" name="email"><br/> <input type="submit" value="註冊"> </form> </body> </html> ===================================================================================== <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1>xxx網站溫馨提示</h1> ${message} </body> </html> ====================================================================================== <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>RegisterServlet</servlet-name> <servlet-class>com.kuang.servlet.RegisterServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>RegisterServlet</servlet-name> <url-pattern>/RegisterServlet.do</url-pattern> </servlet-mapping> </web-app>
程式碼實現:
public class User implements Serializable {
private String username;
private String password;
private String email;
public User() {
}
public User(String username, String password, String email) {
this.username = username;
this.password = password;
this.email = email;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
'}';
}
}
===================================================================================
//網站3秒原則:使用者體驗
//多執行緒實現使用者體驗! 非同步處理
public class SendMail extends Thread{
//用於給使用者傳送郵件的通知
private String from = "[email protected]";
//郵箱的使用者名稱
private String username = "[email protected]";
//郵箱的密碼
private String password = "****************";
//傳送郵件的伺服器地址
private String host = "smtp.qq.com";
private User user;
public SendMail(User user){
this.user = user;
}
//重寫run方法的實現,在run方法中傳送郵件給指定的使用者
@Override
public void run() {
try {
Properties prop = new Properties();
prop.setProperty("mail.host",host); //設定QQ郵件伺服器
prop.setProperty("mail.transport.protocol","smtp"); //郵件傳送協議
prop.setProperty("mail.smtp.auth","true"); //需要驗證使用者名稱密碼
//關於QQ郵箱,還要設定SSL加密,加上以下程式碼即可
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable","true");
prop.put("mail.smtp.ssl.socketFactory",sf);
//使用JavaMail傳送郵件的5個步驟
//1、建立定義整個應用程式所需的環境資訊的Session物件
Session session = Session.getDefaultInstance(prop, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
//發件人郵件使用者名稱、授權碼
return new PasswordAuthentication("[email protected]","****************");
}
});
//開啟Session的debug模式,這樣就可以檢視到程式傳送Email的執行狀態
session.setDebug(true);
//2、通過session得到transport物件
Transport ts = session.getTransport();
//3、使用郵箱的使用者名稱和授權碼連上郵件伺服器
ts.connect("smtp.qq.com","[email protected]","****************");
//4、建立郵件:寫郵件
//注意需要傳遞Session
MimeMessage message = new MimeMessage(session);
//指明郵件的發件人 24736743
message.setFrom(new InternetAddress("[email protected]"));
//指明郵件的收件人,現在發件人和收件人是一樣的,那就是自己給自己發
message.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getEmail()));
//郵件的標題
message.setSubject("只包含文字的簡單郵件");
String info = "恭喜您註冊成功,您的使用者名稱:"+user.getUsername()+",您的密碼:"+user.getPassword()+",請妥善保管,如有問題請聯絡網站客服!!";
//郵件的文字內容
message.setContent(info,"text/html;charset=UTF-8");
message.saveChanges();
//5、傳送郵件
ts.sendMessage(message,message.getAllRecipients());
//6、關閉連線
ts.close();
}catch (Exception e){
throw new RuntimeException(e);
}
}
}
==================================================================================
public class RegisterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接受使用者請求,封裝成物件
String username = req.getParameter("username");
String password = req.getParameter("password");
String email = req.getParameter("email");
User user = new User(username, password, email);
//使用者註冊成功之後,會給使用者傳送一封郵件
//我們使用執行緒來專門傳送郵件,防止出現耗時,和網路註冊人數過多的情況
SendMail send = new SendMail(user);
//啟動執行緒,執行緒啟動之後就會執行run方法來發送郵件
//send.run();為不使用多執行緒,頁面反應較慢
send.start();//使用多執行緒進行操作
//註冊使用者
req.setAttribute("message","註冊成功,我們已經發送了一封帶了註冊資訊的電子郵件,請查收!如網路不穩定,可能過會才能收到!!");
req.getRequestDispatcher("info.jsp").forward(req,resp);
}
}
作者:wangyudong
出處:https://www.cnblogs.com/wydilearn
本文版權歸作者和部落格園共有,歡迎轉載,但必須給出原文連結,並保留此段宣告,否則保留追究法律責任的權利。