天天看点

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  解决。

这样简单的邮件发送功能就实现了,接下来还会继续探讨如何实现邮件的复杂传输包括图片、附件的传输........