天天看點

javamail實作簡單郵件發送

本文通過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  解決。

這樣簡單的郵件發送功能就實作了,接下來還會繼續探讨如何實作郵件的複雜傳輸包括圖檔、附件的傳輸........