package email;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
/**
*
*@author yang
*@類功能說明:測試發送郵件
*@修改日期:2015-7-28 下午04:10:50
*@修改說明:本程式用java來實作Email的發送,所用到的協定為:SMTP,端口号為25;
* 方法:用Socket進行實作,打開用戶端的Socket,并連接配接上伺服器
* 如:Socket sockClient = new Socket("smtp.qq.com",23);這表示發件方連接配接的是QQ郵箱的伺服器,端口号為23
*@建立時間:2015-7-28 下午04:10:50
*/
public class Email{
private MimeMessage mimeMsg; // 整個MIME郵件對象
private Session session; // 專門用來發送郵件的Session會話
private Properties props; // 封裝郵件發送時的一些配置資訊的一個屬性對象
private String username; // 發件人的使用者名
private String password; // 發件人的密碼
private Multipart mp; // 用來實作附件添加的元件
/**
* 發送參數初始化,有的伺服器不需要使用者驗證,是以這裡對使用者名和密碼進行初始化""
* SMTP伺服器的位址,比如要用QQ郵箱,哪麼應為:"smtp.qq.com",126為:"smtp.126.com"
*/
public Email(String smtp){
username = "";
password = "";
setSmtpHost(smtp); // 設定郵件伺服器
createMimeMessage(); // 建立郵件
}
/**
* 設定發送郵件的主機(JavaMail需要Properties來建立一個session對象。
* 它将尋找字元串"mail.smtp.host",屬性值就是發送郵件的主機);
*/
public void setSmtpHost(String hostName){
System.out.println("設定系統屬性:mail.smtp.host = " + hostName);
if (props == null)
props = System.getProperties();
props.put("mail.smtp.host", hostName);
}
/**
* (這個Session類代表JavaMail 中的一個郵件session. 每一個基于
* JavaMail的應用程式至少有一個session但是可以有任意多的session。 在這個例子中,
* Session對象需要知道用來處理郵件的SMTP 伺服器。
*/
public boolean createMimeMessage(){
try{
System.out.println("準備擷取郵件會話對象!");
// 用props對象來建立并初始化session對象
session = Session.getDefaultInstance(props, null);
}
catch (Exception e){
System.err.println("擷取郵件會話對象時發生錯誤!" + e);
return false;
}
System.out.println("準備建立MIME郵件對象!");
try{
// 用session對象來建立并初始化郵件對象
mimeMsg = new MimeMessage(session);
// 生成附件元件的執行個體
mp = new MimeMultipart();
}
catch (Exception e){
System.err.println("建立MIME郵件對象失敗!" + e);
return false;
}
return true;
}
/**
* 設定SMTP的身份認證
*/
public void setNeedAuth(boolean need){
System.out.println("設定smtp身份認證:mail.smtp.auth = " + need);
if (props == null){
props = System.getProperties();
}
if (need)
props.put("mail.smtp.auth", "true");
else
props.put("mail.smtp.auth", "false");
}
/**
* 進行使用者身份驗證時,設定使用者名和密碼
*/
public void setNamePass(String name, String pass){
System.out.println("程式得到使用者名與密碼");
username = name;
password = pass;
}
/**
* 設定郵件主題
*
* @param mailSubject
* @return
*/
public boolean setSubject(String mailSubject){
System.out.println("設定郵件主題!");
try{
mimeMsg.setSubject(mailSubject);
}
catch (Exception e){
System.err.println("設定郵件主題發生錯誤!");
return false;
}
return true;
}
/**
* 設定郵件内容,并設定其為文本格式或HTML檔案格式,編碼方式為UTF-8
*
* @param mailBody
* @return
*/
public boolean setBody(String mailBody){
try{
System.out.println("設定郵件體格式");
BodyPart bp = new MimeBodyPart();
bp.setContent("<meta http-equiv=Content-Type content=text/html; charset=UTF-8>" + mailBody,
"text/html;charset=UTF-8");
// 在元件上添加郵件文本
mp.addBodyPart(bp);
}
catch (Exception e){
System.err.println("設定郵件正文時發生錯誤!" + e);
return false;
}
return true;
}
/**
* 增加發送附件
*
* @param filename
* 郵件附件的位址,隻能是本機位址而不能是網絡位址,否則抛出異常
* @return
*/
public boolean addFileAffix(String filename){
System.out.println("增加郵件附件:" + filename);
try {
BodyPart bp = new MimeBodyPart();
FileDataSource fileds = new FileDataSource(filename);
bp.setDataHandler(new DataHandler(fileds));
// 發送的附件前加上一個使用者名的字首
bp.setFileName(fileds.getName());
// 添加附件
mp.addBodyPart(bp);
}catch (Exception e){
System.err.println("增加郵件附件:" + filename + "發生錯誤!" + e);
return false;
}
return true;
}
/**
* 設定發件人位址
*
* @param from
* 發件人位址
* @return
*/
public boolean setFrom(String from){
System.out.println("設定發信人!");
try {
mimeMsg.setFrom(new InternetAddress(from));
}catch (Exception e){
return false;
}
return true;
}
/**
* 設定收件人位址
*
* @param to
* 收件人的位址
* @return
*/
public boolean setTo(String to){
System.out.println("設定收信人");
if (to == null)
return false;
try{
mimeMsg.setRecipients(javax.mail.Message.RecipientType.TO, InternetAddress.parse(to));
}catch (Exception e){
return false;
}
return true;
}
/**
* 發送附件
*
* @param copyto
* @return
*/
public boolean setCopyTo(String copyto){
System.out.println("發送附件到");
if (copyto == null)
return false;
try{
mimeMsg.setRecipients(javax.mail.Message.RecipientType.CC, InternetAddress.parse(copyto));
}catch (Exception e){
return false;
}
return true;
}
/**
* 發送郵件
*
* @return
*/
public boolean sendout(){
try{
mimeMsg.setContent(mp);
mimeMsg.saveChanges();
System.out.println("正在發送郵件....");
Session mailSession = Session.getInstance(props, null);
Transport transport = mailSession.getTransport("smtp");
// 真正的連接配接郵件伺服器并進行身份驗證
transport.connect((String) props.get("mail.smtp.host"), username, password);
// 發送郵件
transport.sendMessage(mimeMsg, mimeMsg.getRecipients(javax.mail.Message.RecipientType.TO));
System.out.println("發送郵件成功!");
transport.close();
}catch (Exception e){
System.err.println("郵件發送失敗!" + e.getMessage());
e.printStackTrace();
return false;
}
return true;
}
public static void main(String[] args){
/**
*************切切注意********
*
*注意 用此程式發郵件必須郵箱支援smtp服務 在2006年以後申請的163郵箱是不支援的
*我知道sina郵箱 sohu郵箱 qq郵箱支援 但是sina和qq郵箱需要手工設定開啟此功能
*是以在測試時最好使用這三個郵箱
*sina郵箱的smtp設定方法如下
*登入sina郵箱 依次點選 郵箱設定--->帳戶--->POP/SMTP設定 将開啟複選框選中 然後儲存
*
*/
Email themail = new Email("smtp.126.com");//這裡以網易126郵箱為例子
// Email themail = new Email("smtp.exmail.qq.com"); //騰訊企業郵箱
String mailbody = "<a href='http://www.wphtu.ah.cn/' target='_blank'>哈哈</a>發送成功了哦";//郵件正文
themail.setNeedAuth(true);
themail.setSubject("JAVA發郵件的測試"); //郵件主題
themail.setBody(mailbody); //郵件正文
themail.setTo("[email protected]"); //收件人位址
themail.setFrom("[email protected]"); //發件人位址 ,注意發件人的郵箱必須是126或者網易郵箱
themail.addFileAffix("E:/log/md/error.log"); // 附件檔案路徑,例如:C:/222.jpg,*注;"/"的寫法; 如果沒有可以不寫
themail.setNamePass("[email protected]", "*******");//發件人位址和密碼 **改為相應郵箱密碼
themail.sendout();
//注意如果在發送時報錯:未找到類的錯誤,那麼删除myEclipse安裝目錄下的:javaee.jar包
//我的安裝目錄是D:/soft_install/plugins/com.genuitec.eclipse.j2eedt.core_8.6.0.me201007292038/data/libraryset/EE_5
}
}