隨着我們學習java的深入,也漸漸發現了它的一些樂趣,比如發送郵件…(還有很多啊)
還是老規矩,定義走起。
一、SMTP協議
SMTP的全稱是“Simple Mail Transfer Protocol”,即簡單郵件傳輸協議。它是一組從原地址到目的地址傳輸郵件的規範,通過此來控制郵件的中轉方式,用女朋友能聽懂的話說就是幫助告訴郵件該去哪!而SMTP服務器就是遵循SMTP協議的發送郵件服務器。對雲服務器大家或多或少都瞭解,可以把郵件服務器也理解成一種雲服務器。
二、POP3協議
POP3是Post Office Protocol 3的簡稱,即郵局協議的第三個版本,規定了怎樣將個人計算機連接到Internet的郵件服務器和下載電子郵件的電子協議。而POP3服務器則是遵循POP3協議的接受郵件服務器。簡單說就是接受郵件的。
三、發送郵件的心路歷程
①、用戶A的電子郵箱爲:[email protected],通過郵件客戶端軟件寫好一封郵件,交到QQ的郵件服務器,這一步使用的協議是SMTP,對應圖示的①;
②、QQ郵箱會根據用戶A發送的郵件進行解析,也就是根據收件地址判斷是否是自己管轄的賬戶,如果收件地址也是QQ郵箱,那麼會直接存放到自己的存儲空間。這裏我們假設收件地址不是QQ郵箱,而是163郵箱,那麼QQ郵箱就會將郵件轉發到163郵箱服務器,轉發使用的協議也是SMTP,對應圖示的②;
③、163郵箱服務器接收到QQ郵箱轉發過來的郵件,也會判斷收件地址是否是自己,發現是自己的賬戶,那麼就會將QQ郵箱轉發過來的郵件存放到自己的內部存儲空間,對應圖示的③;
④、用戶A將郵件發送了之後,就會通知用戶B去指定的郵箱收取郵件。用戶B會通過郵件客戶端軟件先向163郵箱服務器請求,要求收取自己的郵件,對應圖示的④;
⑤、163郵箱服務器收到用戶B的請求後,會從自己的存儲空間中取出B未收取的郵件,對應圖示⑤;
⑥、163郵箱服務器取出用戶B未收取的郵件後,將郵件發給用戶B,對應圖示的⑥;最後三步用戶B收取郵件的過程,使用的協議是POP3;
總結一下
使用SMTP(簡單郵件傳送協議)或ESMTP(擴展SMTP)來發送電子郵件,使用POP3(電子郵局協議3)或IMAP(因特網消息訪問協議)來接收電子郵件。
四、 QQ郵箱和網易郵箱的配置
1、qq
在登錄QQ郵箱後臺在"設置"=》賬號中開啓POP3/SMTP服務
2、網易
請登錄163郵箱,點擊頁面正上方的“設置”,再點擊左側上“POP3/SMTP/IMAP”,其中“開啓SMTP服務”是系統默認勾選開啓的。勾選圖中另兩個選項,點擊確定,即可開啓成功。不勾選圖中兩個選項,點擊確定,可關閉成功。
五、代碼演示(QQ郵箱)
現在隨着代碼來了解發送郵件吧!
public static void main(String [] args) throws GeneralSecurityException {
// 收件人電子郵箱,改成自己需要的
String to = "[email protected]";
// 發件人電子郵箱,改成自己需要的
String from = "[email protected]";
// 指定發送郵件的主機爲 smtp.qq.com
String host = "smtp.qq.com"; //QQ 郵件服務器
// 獲取系統屬性
Properties properties = System.getProperties();
// 設置郵件服務器
properties.setProperty("mail.smtp.host", host);
properties.put("mail.smtp.auth", "true");
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable", "true");
properties.put("mail.smtp.ssl.socketFactory", sf);
// 獲取默認session對象
Session session = Session.getDefaultInstance(properties,new Authenticator(){
@Override
public PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication("[email protected]", "16位驗證碼在郵箱中獲取"); //發件人郵件用戶名、密碼,密碼從對應的郵箱中獲取
}
});
try{
// 創建默認的 MimeMessage 對象
MimeMessage message = new MimeMessage(session);
// Set From: 頭部頭字段
message.setFrom(new InternetAddress(from));
// Set To: 頭部頭字段
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
// Set Subject: 頭部頭字段
message.setSubject("This is the Subject Line!");
// 設置消息體
message.setText("萌新你好 這裏是太原理工大學雲頂書院第四期java一組,李國瑞正在通過java發送郵件與您交流!");
// 發送消息
Transport.send(message);
System.out.println("Sent message successfully....from runoob.com");
}catch (MessagingException mex) {
mex.printStackTrace();
}
}