本文通过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" onclick="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 解决。
这样简单的邮件发送功能就实现了,接下来还会继续探讨如何实现邮件的复杂传输包括图片、附件的传输........