本文通過JavaMail 實作簡單的文本郵件傳輸,常用的電子郵件傳輸協定包括SMTP,POP3,IMAP等。其中建立和發送郵件隻需要用到SMTP(Simple Mail Transfer Protocol)協定,即簡單郵件傳輸協定。JavaMail 是Java官方提供的的對電子郵件進行操作的類庫,但是沒有包括到标準的JDK中,是以需要自己去官網上下載下傳,下載下傳位址:https://java.net/projects/javamail/pages/Home 下載下傳javax,.mail.jar包并添加到項目的 build path中。
接下來開始簡單講一下建立郵件發送的步驟,主要可分為兩大部分 :1.建立一封簡單文本郵件;2.發送郵件到郵箱;話不多說下面直接上代碼,親測可用!
一、建立一封簡單文本郵件
public MimeMessage createMimeMessage(Session session,String sendMail,String[] receiveMail,String subject,String msgContent) throws Exception{ //建立一份簡單文本郵件
MimeMessage message = new MimeMessage(session);
//message.setFrom(new InternetAddress(sendMail, "某寶網", "UTF-8"));
message.setFrom(new InternetAddress(sendMail, MimeUtility.encodeText( "某寶網" ,"UTF-8","b")));
Address[] addr = new Address[receiveMail.length];
for(int i =0;i<receiveMail.length;i++){
addr[i] = new InternetAddress(receiveMail[i],"尊敬的使用者","UTF-8");
}
message.addRecipients(MimeMessage.RecipientType.TO, addr);
message.setSubject(subject,"UTF-8");
message.setContent(msgContent, "text/html;charset=UTF-8");
message.setSentDate(new Date());
message.saveChanges();
return message;
}
二、發送郵件(這邊測試了QQ郵箱和163郵箱,大同小異)
①163郵箱:如果要使用163郵箱發送郵件,首先必須先登入到自己的163郵箱,進入設定---》開啟SMTP/POP3服務,進行短信驗證後可以進行授權碼的設定。授權碼:第三方用戶端登入時需要用到,在這邊用javamail發送郵件,密碼填寫的是授權碼,而不是登入密碼。
②QQ郵箱:使用QQ郵箱也需要開啟SMTP/POP3服務,并短信驗證擷取授權碼,這邊QQ郵箱的授權碼是自動發放而不是自己填寫的,可以多次擷取。
兩者的不同在于:javamail實作郵箱發送的過程中,QQ郵箱為提高安全性需要使用SSL 安全認證,而163郵箱可以不使用。非SSL連接配接的SMTP端口一般為25,可以不進行設定(預設)。如果使用了SSL連接配接,則應該改為對應郵箱的SMTP伺服器的端口,如QQ郵箱為端口:465 。這邊端口必須設定,否則會出錯。
發送郵件代碼實作主要分為幾步:1.參數配置(用于連接配接郵件伺服器) 2.建立會話對象session,用于和伺服器互動 3.擷取上文中建立的郵件 4.根據session擷取郵件傳輸對象 5.發送郵件 6.關閉傳輸對象。直接上代碼:
@RequestMapping(value="/sendMsg.do",produces="text/xml;charset=UTF-8")
@ResponseBody
public String sendMessage(HttpServletRequest request){
String[] eamilUrl = request.getParameter("email").split(";");
String sendSubject = request.getParameter("subject");
String sendContent = request.getParameter("message");
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp"); // 使用的協定(JavaMail規範要求)
props.setProperty("mail.smtp.host", myEmailSMTPHost); // 發件人的郵箱的 SMTP 伺服器位址
props.setProperty("mail.smtp.auth", "true"); // 需要請求認證
/*
//QQ郵箱需要設定SMTP端口465,和SSL安全連結
final String smtpPort = "465";
props.setProperty("mail.smtp.port", smtpPort);
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.socketFactory.port", smtpPort);*/
Session session = Session.getDefaultInstance(props);// 根據配置建立會話對象, 用于和郵件伺服器互動
session.setDebug(true);
try {
MimeMessage message = createMimeMessage(session, myEmailAccount, eamilUrl,sendSubject,sendContent);
Transport transport = session.getTransport(); //擷取郵件傳輸對象
transport.connect(myEmailAccount, myEmailPassword);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
return "success";
} catch (Exception e) {
e.printStackTrace();
return "fail";
}
}
前端代碼:簡單的ajax請求
<div>
主題:<input type="text" name="subject" id="subject"/>
發送給:<input type="text" name="emailAddr" id="emailAddr"/>
郵件内容:<textarea name="msgContent" id="msgContent"></textarea>
<button id="sendMsg" οnclick="sendMessage()">發送郵件</button>
</div>
<script type="text/javascript">
function sendMessage(){
$.ajax({
type:"post",
url:"testUser/sendMsg.do",
data:{"email":$("#emailAddr").val(),"subject":$("#subject").val(),"message":$("#msgContent").val()},
dataType:"text",
success:function(data){
if(data=="success"){
alert("發送成功!");
}else{
alert("發送失敗,請重新發送!");
}
}
});
}
</script>
如果控制台報錯,請根據錯誤資訊,參考查閱:http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html 解決。
這樣簡單的郵件發送功能就實作了,接下來還會繼續探讨如何實作郵件的複雜傳輸包括圖檔、附件的傳輸........