郵件服務器:類似於現實生活中的郵局,負責接收用戶投遞的郵件,並將郵件投遞到指定的接收者的郵件中
電子郵箱:用戶申請的一個賬戶,郵件服務器也會爲該賬戶分配一個空間,用戶通過該賬號發送電子郵件,以及接收郵件
郵件傳輸協議{
SMTP協議:用戶連上了郵件的服務器之後想要發送郵件就需要遵循該協議,才能正確的將郵件發送出去,工作端口號25。用於處理smtp請求的稱爲SMTP服務器(http工作端口80,https工作端口443,)
POP3協議:如果用戶想要從郵件服務器中接收一份電子郵件就需要遵循該協議,才能將郵件接收進來,工作端口號110。用於處理pop3請求的稱爲POP3服務器
使用cmd命令行發送郵件:
使用cmd命令行接收郵件:telnet smtp.sina.com 25 ----->連接上smtp服務器,指定端口號25
ehlo halm ----->向服務器打個招呼,
auth login ----->告訴服務器登陸
NTQwODM2MDUxNg== ----->提交登陸該用戶名@之前的字符(必須經過base64編碼)
MTAzMzA2NDkwMA== ----->提交登陸該密碼(必須經過base64編碼)
mail from: <[email protected]> ----->發件人地址
rcpt to:<[email protected]> ----->收件人地址
data ----->告訴服務器開始寫信
from: <[email protected]> ----->發件}
to:<[email protected]> ----->收件}
subject: test ----->主題}
----->必須加個空行 }按照rfc822文檔指定信件的格式
aaaaaaaaaaa ----->內容}
. ----->結束標識 }
quit ----->退出
telnet pop.qq.com 110 ----->連接上破皮服務器,端口號110
user 1033064900 ----->用戶名
pass !1033064900a# ----->密碼
stat ----->顯示郵件的整體內容
retr ----->接收第2封郵件quit ----->退出
代碼說明:
220 服務就緒(在socket連接成功時,會返回此信息)
221 正在處理
250 請求郵件動作正確,完成(HELO,MAIL FROM,RCPT TO,QUIT指令執行成功會返回此信息)
354 開始發送數據,結束以 .(DATA指令執行成功會返回此信息,客戶端應發送信息)
500 語法錯誤,命令不能識別
550 命令不能執行,郵箱無效
552 中斷處理:用戶超出文件空間
}
複雜郵件{
MIME協議:對RFC822文檔的升級和補充,描述了一封複雜郵件的生成方式。MIME協議規定使用分割線對多段數據進行分割,並使用content-type頭字段進來說明該段數據的類型,同時還有每段數據間的關係
MimeMessage:用於創建一封郵件對象,需要設置接收者和發送者
MimeBodyPart:用於封裝郵件的一部分內容,需要設置該數據的類型,對於文件數據可以使用處理器進行封裝
MimeMultipart:用於將每部分數據通過關係聯繫起來,再將其封裝到郵件對象中。文本數據與圖片數據關係:related 與附件的關係:mixed
session:用於定義整個應用程序所需的環境信息,以及收集客戶端與郵件服務器建立網絡連接的會話信息,例如服務器的主機,端口,發送和接收的協議
需要導入mail.jar和activation.jar兩個包進行開發複雜郵件
// 創建信息對象封裝服務器信息 Properties prop = new Properties(); //服務器的主機 prop.setProperty("mail.smtp.host", "localhost"); //服務器的協議 prop.setProperty("mail.transport.protocol", "smtp"); //是否想服務器提交認證 prop.setProperty("mail.smtp.auth", "true"); // 創建一封郵件 //創建一個與服務器進行會話的對象 Session session = Session.getDefaultInstance(new Properties(prop)); //使用session來創建一封郵件 MimeMessage message = new MimeMessage(session); //封裝發送者的地址 message.setFrom(new InternetAddress("[email protected]")); //封裝接收者的類型和地址 message.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]")); //設置主題 message.setSubject("test"); // 創建郵件內容 //創建一個封裝文本數據的對象 MimeBodyPart text = new MimeBodyPart(); //封裝數據以及數據的類型 text.setContent("hello world<img src='cid:1.jpg'></img>", "text/html"); //創建用於封裝圖片數據的對象 MimeBodyPart image = new MimeBodyPart(); //設置一個處理器用於將圖片信息封裝到數據對象中(由於文件數據涉及到流比較麻煩,就直接使用處理器進行處理文件對象) DataHandler imagedh = new DataHandler(new FileDataSource("src/1.jpg")); image.setDataHandler(imagedh); //設置圖片的id便於引用 cid:1.jpg image.setContentID("1.jpg"); //創建用於封裝附件數據的對象 MimeBodyPart attach = new MimeBodyPart(); //設置處理文件的處理器 DataHandler attachdh = new DataHandler(new FileDataSource("src/1.jpg")); attach.setDataHandler(attachdh); //*** 設置附件的名字,同時默認執行了設置content-disposition 爲attachment attach.setFileName(attachdh.getName()); // 描述關係 //文本與圖片的關係並封裝到一個body中 MimeMultipart textImage = new MimeMultipart(); textImage.addBodyPart(text); textImage.addBodyPart(image); //設置與圖片的關係 textImage.setSubType("related"); //在封裝到bodypart中 MimeBodyPart textImageBody = new MimeBodyPart(); textImageBody.setContent(textImage); //與附件的關係 MimeMultipart textImageAttach = new MimeMultipart(); textImageAttach.addBodyPart(textImageBody); textImageAttach.addBodyPart(attach); //設置關係 textImageAttach.setSubType("mixed"); // 將保存了數據以及關係的內容封裝到郵件對象中 message.setContent(textImageAttach); message.saveChanges(); // 發送郵件 //從會話對象中拿到發送郵件的對象 Transport transport = session.getTransport(); //提交用戶名,密碼 transport.connect("localhost", "aaa", "123"); //發送郵件,指定郵件以及收件人地址 transport.sendMessage(message, message.getAllRecipients()); transport.close();
注意:
//如此就是直接設置文本內容,不使用bodypart進行封裝。 //當接收者確定接收該圖片的時候,程序就會從服務端 //獲取圖片數據,這樣服務端就可以獲取到接收者的信息。(不建議使用) message.setContent("aaaa<img src='c://1.jpg'></img>", "text/html");
}
服務器搭建必須{
例:
1.a用戶通過新浪服務器向擁有搜狐賬號的b用戶發送郵件
2.新浪服務器先獲取a用戶指定的接收者的域名(souhu.com)
3.查詢dns服務器,得知域名對應的ip
4.新浪服務器就通過ip,將郵件發送至搜狐的服務器,並且說明是由新浪的服務器發送的郵件(即帶着smtp.sina.com)
5.搜狐的服務器拿到smtp.sina.com就去查詢dns服務器找到對應的ip值
6.當ip值與發送郵件過來的服務器的ip值相等時,就確定這是新浪發送的服務器(就不需要使用用戶名密碼)
7.搜狐服務器再將郵件發送給b用戶
總結:
1.在dns服務器上指定服務器的域名對應的ip值(smtp.halm.com ——》127.0.0.1),用於服務器之間轉發的時候不需要用戶名密碼
2.在dns服務器上指定郵件的域名對應的ip值(@halm.com——》127.0.0.1),用於其它服務器找到自己的服務器的地址
}