發送郵件,首先就得搞清楚那堆不同的協議究竟是什麼。下面一段引用於網易
POP3
POP3是Post Office Protocol 3的簡稱,即郵局協議的第3個版本,它規定怎樣將個人電腦串連到Internet的郵件伺服器和下載電子郵件的電子協議。
它是網際網路電子郵件的第一個離線協議標準,POP3允許使用者從伺服器上把郵件儲存到本地主機(即自己的電腦)上,同時刪除儲存在郵件伺服器上的郵件,而POP3伺服器則是遵循POP3協議的內送郵件伺服器,用來接收電子郵件的。
SMTP
SMTP 的全稱是“Simple Mail Transfer Protocol”,即簡易郵件傳輸通訊協定。它是一組用於從源地址到目的地址傳輸郵件的規範,通過它來控制郵件的中轉方式。SMTP 協議屬於 TCP/IP 協議簇,它協助每台電腦在發送或中轉信件時找到下一個目的地。SMTP 伺服器就是遵循 SMTP 協議的發送郵件伺服器。
SMTP 認證,簡單地說就是要求必須在提供了賬戶名和密碼之後才可以登入 SMTP 伺服器,這就使得那些垃圾郵件的散播者無可乘之機。增加 SMTP 認證的目的是為了使使用者避免受到垃圾郵件的侵擾。
IMAP
IMAP全稱是Internet Mail Access Protocol,即互動式郵件存取協議,它是跟POP3類似郵件訪問標準協議之一。不同的是,開啟了IMAP後,您在電子郵件用戶端收取的郵件仍然保留在伺服器上,同時在用戶端上的操作都會反饋到伺服器上,如:刪除郵件,標記已讀等,伺服器上的郵件也會做相應的動作。所以無論從瀏覽器登入郵箱或者用戶端軟體登入郵箱,看到的郵件以及狀態都是一致的。
本文主要基於smtp協議來做的qq郵件的發送。由上面的介紹已經得知,要想smtp發郵件,就得有三個東西:
1. 發件方郵箱地址。
2. 發件方smtp郵箱的密碼,這個密碼不是郵箱的密碼,你登入到qq郵箱,找到smtp功能,開啟之後,會給你產生一個,這個以後再說。
3. 收件方的地址
其中1和3比較容易擷取,2的擷取,首先你需要登入qq郵箱,然後點擊設定-常規-賬戶,開啟smtp服務,然後點擊那個產生授權碼,就可以得到2所說的密碼了。
好了,得到這些就可以寫代碼了。
首先,在My Code裡,先寫兩個pojo類,分別是郵件類和郵箱類,郵件類設定郵件的內容標題和你要發給的目的郵箱地址。而郵箱類則設定郵箱的一些屬性,如使用的協議類型,使用者名稱,密碼什麼的。這東西可以使用spring boot 從設定檔裡讀,為了簡單一點兒,這裡就不寫了。直接寫死它。以下是pojo類代碼。
package com.xxjz.sendemail;import java.io.Serializable;public class Mail implements Serializable {private static final long serialVersionUID = -543077416549260588L;private String sendTo;private String subject;private String text;public String getSendTo() {return sendTo;}public void setSendTo(String sendTo) {this.sendTo = sendTo;}public String getSubject() {return subject;}public void setSubject(String subject) {this.subject = subject;}public String getText() {return text;}public void setText(String text) {this.text = text;}public Mail() {super();}}
package com.xxjz.sendemail;import java.io.Serializable;public class MailBox implements Serializable {private static final long serialVersionUID = -543077416549260588L;private String mailSmtpAuth; // SMTP伺服器驗證private String mailSmtpHost; //SMTP伺服器private String mailSmtpPort; //連接埠號碼,QQ郵箱給出了兩個連接埠private String mailUser; //帳號private String mailPassword; //密碼public String getMailSmtpAuth() {return mailSmtpAuth;}public void setMailSmtpAuth(String mailSmtpAuth) {this.mailSmtpAuth = mailSmtpAuth;}public String getMailSmtpHost() {return mailSmtpHost;}public void setMailSmtpHost(String mailSmtpHost) {this.mailSmtpHost = mailSmtpHost;}public String getMailSmtpPort() {return mailSmtpPort;}public void setMailSmtpPort(String mailSmtpPort) {this.mailSmtpPort = mailSmtpPort;}public String getMailUser() {return mailUser;}public void setMailUser(String mailUser) {this.mailUser = mailUser;}public String getMailPassword() {return mailPassword;}public void setMailPassword(String mailPassword) {this.mailPassword = mailPassword;}public static long getSerialversionuid() {return serialVersionUID;}}
在發送郵件之前,需要添加javax.mail這個依賴包。由於我使用maven項目,所以就直接上代碼,在pom檔案中加入:
<!-- https://mvnrepository.com/artifact/javax.mail/mail --><dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version></dependency>
接下來就是發送郵件的核心代碼:
package com.xxjz.sendemail;import java.util.Properties;import javax.mail.Authenticator;import javax.mail.MessagingException;import javax.mail.PasswordAuthentication;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.AddressException;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeMessage.RecipientType;public class SendMail {private static volatile SendMail singleton = null;private MailBox mailBox = new MailBox();private Mail mail = new Mail();private SendMail() {}public static SendMail getSingleton() {if (singleton == null) {synchronized (SendMail.class) {if (singleton == null) {singleton = new SendMail();}}}return singleton;}public void setProperties(MailBox b) {this.mailBox = b;}public void setMail(Mail b) {this.mail = b;}public void sendQQSmtpEmail() throws Exception {// 建立Properties 類用於記錄郵箱的一些屬性final Properties props = new Properties();// 表示SMTP發送郵件,必須進行身分識別驗證props.put("mail.smtp.auth", mailBox.getMailSmtpAuth());// 此處是SMTP伺服器props.put("mail.smtp.host", mailBox.getMailSmtpHost());// 連接埠號碼,QQ郵箱給出了兩個連接埠props.put("mail.smtp.port", mailBox.getMailSmtpPort());// 此處是你的帳號props.put("mail.user", mailBox.getMailUser());// 此處的密碼就是前面說的STMP密碼props.put("mail.password", mailBox.getMailPassword());// 構建授權資訊,用於進行SMTP進行身分識別驗證Authenticator authenticator = new Authenticator() {protected PasswordAuthentication getPasswordAuthentication() {// 使用者名稱、密碼String userName = props.getProperty("mail.user");String password = props.getProperty("mail.password");return new PasswordAuthentication(userName, password);}};// 使用環境屬性和授權資訊,建立郵件會話Session mailSession = Session.getInstance(props, authenticator);// 建立郵件訊息MimeMessage message = new MimeMessage(mailSession);// 設定寄件者InternetAddress form = new InternetAddress(props.getProperty("mail.user"));message.setFrom(form);// 設定收件者的郵箱InternetAddress to = new InternetAddress(mail.getSendTo());message.setRecipient(RecipientType.TO, to);// 設定郵件標題message.setSubject(mail.getSubject());// 設定郵件的內容體message.setContent(mail.getText(), "text/html;charset=UTF-8");// 最後發送郵件Transport.send(message);}}
好了,現在寫個測試類別驗證一下把。
package com.xxjz.sendemail; public class TEST {public static void main(String[] args) throws Exception {SendMail sendMail = SendMail.getSingleton();MailBox mailBox = new MailBox();Mail mail = new Mail();mailBox.setMailSmtpAuth("true");mailBox.setMailSmtpHost("smtp.qq.com");mailBox.setMailSmtpPort("587");mailBox.setMailUser("xxxxxxxxx@qq.com");mailBox.setMailPassword("geewtndcrvawqebe");mail.setSendTo("xxxxxxxxxx@qq.com");mail.setText("測試 * hello world\n");mail.setSubject("測試test");sendMail.setProperties(mailBox);sendMail.setMail(mail);sendMail.sendQQSmtpEmail();}} 先設定郵箱的屬性和郵件的內容,然後,發送。。
效果圖,如圖所示:
我使用spring boot寫的,感興趣的小夥伴可以去GitHub上down下來看看,以下是地址:
https://github.com/zdxxinlang/SendEmailSpringBoot.git