************本人水平有限,在學習時請用批判的態度學習,有問題給我留言************
前幾天聽的方立勳方老師javamail的課程,今天把代碼詳細註解寫一下,加深一下印象,方老師不愧是對郵件發送有深入研究,講了很多相關的知識,今天也一併記錄下來。
方老師講解javamail之前詳細講解了郵件發送的原理,這裏我記錄一下用telnet發送郵件的方法。
第一步和郵件服務器打招呼:
Ehlo 主機名(你的計算機名可以隨意填寫)
Auth login 登陸命令(回車後提示你輸入用戶名密碼)
輸入用戶名(注意需要時base64編碼過的用戶名,可以用new sun.misc.BASE64Encoder()).encode( s.getBytes())轉碼
密碼同用戶名
Mail from:<你的郵件地址>
Rcpt to:<你發送的郵件地址>
Data(回車後輸入正文)
.(結束正文輸入)
Quit(結束郵件發送)
郵件中可以加入發送人的地址,可以和mail from中的不一樣,也就是說你可以不用知道別人郵箱的密碼就用別人的郵箱發送郵件了!!!
郵件服務器搭建
安裝郵件服務器 在dns上註冊A記錄 mx記錄
A記錄是你的服務器給對方服務器發送郵件時對方服務器會查詢的記錄,如果記錄上有你的郵件服務器的地址,對方將不會要求你輸入用戶名密碼
Mx記錄是對方服務器給你的服務器發送郵件是需要查詢的記錄,如果對方能在dns上查詢到你的記錄則給你發送郵件,如果查詢不到則不發送。
Javamail郵件發送程序詳解
package cn.itcast;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
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;
/**
* 郵件發送
* 詳盡註釋每一步做法和含義,方便大家學習
*
* @version 1.0
* @note caohua
* @company 傳智博客
*/
public class ComplexMail {
public static void main(String[] args) throws Exception {
Properties prop = new Properties();//得到一個properties的實例 得到session的時候要用到
prop.put("mail.transport.protocol", "smtp");//協議
prop.put("mail.smtp.auth", "true");//是否用戶登錄 否的話就是郵件服務器之間的發送..........................?
//注意:這個session 不是 httpsession 更不是hibernate的session 這個事javamail api中的session 基本郵件會話
Session session = Session.getDefaultInstance(prop);//用Session類的一個靜態方法得到session的實例
session.setDebug(true);//在控制檯打印出和郵件服務器的交互過程
Transport transport = session.getTransport();//得到一個Transport的實例 這個類是一個抽象類,我們可以使用這個類的靜態方法send()來發送消息
transport.connect("smtp.sina.com","caohua_1012", "9831012");
Message message = createMessage(session);//得到有內容的Message實例 內容的填充時調用createMessage方法
//InternetAddress是一個繼承了Address接口的類
InternetAddress[] ia = new InternetAddress[]{new InternetAddress("[email protected]")};//得到一個地址數組
transport.sendMessage(message,ia);//發送郵件的方法需要兩個參數 一個是內容類(Message)的實例 一個是地址數組(會發送給多個人所以是數組)
transport.close();//關閉通信
}
/**
* 填充Message類的內容
* @param session
* @return Message
* @throws Exception
*/
private static Message createMessage(Session session) throws Exception {
MimeMessage message = new MimeMessage(session);//得到一個message對象
message.setFrom(new InternetAddress("[email protected]"));//設置發件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]"));//設置收件人
message.setSubject("javamail測試郵件");//郵件主題
/** 代表正文的bodypart
* <img src=cid:logo.gif>的調用方法是 cid:logo.gif在圖片的bodypart定義類型時定義 在郵件正文的bodypart中需要這樣調用 如果不調用則按照附件來處理
**/
MimeBodyPart text = new MimeBodyPart();//得到一個正文bodypart的實例
text.setContent("<html> 我是一個碼農!!!<img src=cid:logo.gif>碼農祖師爺的神像</html>", "text/html;charset=gb2312");//set內容 及返回的內容的contenttype
/** 代表正文所引用的圖片的bodypart **/
MimeBodyPart image = new MimeBodyPart();//得到一個圖片的bodypart實例
DataHandler dh1 = new DataHandler(new FileDataSource("E://aa.jpg"));//一種數據類型的處理類 初始化需要傳入一個數據源
image.setDataHandler(dh1);//放入多媒體數據
image.setContentID("logo.gif");//定義正文內容引用id
/** 代表附件的bodypart **/
MimeBodyPart attach = new MimeBodyPart();//得到一個附件的bodypart類
DataHandler dh2 = new DataHandler(new FileDataSource("E://10635324.jpg"));//一種數據類型的處理類 初始化需要傳入一個數據源
attach.setDataHandler(dh2);//放入多媒體數據
attach.setFileName(MimeUtility.encodeText(dh2.getName())); //要對中文文件名進行編碼!!!
MimeMultipart text_image = new MimeMultipart();//數據容器 正文中有文本 + 圖片需要先放到這個類中 然後再把這個類放入到 一個新的bodypart類中
text_image.addBodyPart(text);//將文本放入數據容器中
text_image.addBodyPart(image);//將圖片放入數據容器中
text_image.setSubType("related");//設置數據容器類型 mixed(沒關係) related(調用關係) alternative
MimeBodyPart text_image_body = new MimeBodyPart();//得到一個新的bodypart
text_image_body.setContent(text_image);//把數據容器放入新的bodypart中
/** 封裝了所有郵件數據的容器 **/
MimeMultipart multipart = new MimeMultipart();//將附件 正文+圖片的數據容器 合併放入這個數據容器
multipart.addBodyPart(text_image_body);//放入正文+圖片的數據容器
multipart.addBodyPart(attach);//放入附件
multipart.setSubType("mixed");//設置混合類型
message.setContent(multipart);//將數據容器放入message類
message.saveChanges();//保存修改
return message;
}
}