jsp实现邮件发送功能
刘学 | skill | 2020-07-14
现在很少会通过自己的邮件服务器收邮件了,一般使用QQ邮箱、163邮箱等stmp功能代理,方便好多。
但有时候,我们自己的网站有小伙伴对文章回复了,希望回复的同时发一封邮件告知站长,这就需要借助javamail这个api实现了。类似的还有发送邮箱验证码等等。
简单记录下怎么做的,有需要朋友的可以参考参考:
1.引入“javax.mail.jar”包
2.通过javaBean形式实现,则类的大致写法如下:
package com.email; import java.util.Properties; import javax.mail.Message; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class Email { /** * @email发送 */ // 以下变量为用户根据自己的情况设置 private String smtphost = "smtp.qq.com"; // 发送邮件服务器 private String user = "XXXXX@qq.com"; // 邮件服务器登录用户名 private String password = "***********"; // 邮件服务器登录密码 private String from = "XXXXX@qq.com"; // 发送人邮件地址 private String port = "587"; // 设置端口号,不设置的话默认为25, qq邮箱为587 //private String to = "YYYYY@qq.com"; // 接受人邮件地址 //private String subject = "JavaMail 电子邮件发送系统测试-这是标题"; // 邮件标题 //private String body = "JavaMail 电子邮件发送系统-这是内容"; // 邮件内容 public boolean sendEmail(String title, String content, String toWho) { //title是邮件标题,content是邮件内容,woWho是收件人Email boolean result = false; // 初始化Properties类对象 // 以下为发送程序,用户无需改动 try { // 初始化Properties类对象 Properties props = new Properties(); // 设置mail.smtp.host属性 props.put("mail.smtp.host", smtphost); //设置端口号 qq邮箱为587 props.setProperty("mail.smtp.port", port); //qq // 设置使用验证 props.put("mail.smtp.auth", "true"); // 获取非共享的session对象 Session ssn = Session.getInstance(props, null); // 创建一个默认的MimeMessage对象。 MimeMessage message = new MimeMessage(ssn); // 创建InternetAddress对象 InternetAddress fromAddress = new InternetAddress(from); // 设置From: 头部的header字段 message.setFrom(fromAddress); // 创建InternetAddress对象 InternetAddress toAddress = new InternetAddress(toWho); // 设置 To: 头部的header字段 message.addRecipient(Message.RecipientType.TO, toAddress); // 设置 Subject: header字段 message.setSubject(title); // 现在设置的实际消息 message.setText(content); // 定义发送协议 Transport transport = ssn.getTransport("smtp"); // 建立与服务器的链接 transport.connect(smtphost, user, password); // 发送邮件 transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO)); // transport.send(message); // 关闭邮件传输 transport.close(); result = true; } catch (Exception m) // 捕获异常 { System.out.println(m.toString()); m.printStackTrace(); } return result; } public static void main(String[] args) { // TODO Auto-generated method stub Email newE = new Email(); System.out.print(newE.sendEmail("测试邮件标题", "测试邮件内容,\n这里应该换行", "YYYYY@qq.com")); } }
3.直接通过jsp页面发送,大致写法可参考
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.*,javax.mail.*"%> <%@ page import="javax.mail.internet.*,javax.activation.*"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> </head> <body> <% // 以下变量为用户根据自己的情况设置 String smtphost = "smtp.qq.com"; // 发送邮件服务器 String user = "XXXXX@qq.com"; // 邮件服务器登录用户名 String password = "**********"; // 邮件服务器登录密码 String from = "XXXXX@qq.com"; // 发送人邮件地址 String port = "587"; // 设置端口号,不设置的话默认为25, qq邮箱为587 String to = "YYYYY@qq.com"; // 接受人邮件地址 String subject = "JavaMail 电子邮件发送系统测试-这是标题"; // 邮件标题 String body = "JavaMail 电子邮件发送系统-这是内容"; // 邮件内容 // 以下为发送程序,用户无需改动 try { //初始化Properties类对象 Properties props = new Properties(); //设置mail.smtp.host属性 props.put("mail.smtp.host", smtphost); //设置端口号 qq邮箱为587 props.setProperty("mail.smtp.port", port); //qq //设置使用验证 props.put("mail.smtp.auth","true"); // 获取非共享的session对象 Session ssn= Session.getInstance(props,null); //创建一个默认的MimeMessage对象。 MimeMessage message = new MimeMessage(ssn); //创建InternetAddress对象 InternetAddress fromAddress = new InternetAddress(from); //设置From: 头部的header字段 message.setFrom(fromAddress); //创建InternetAddress对象 InternetAddress toAddress = new InternetAddress(to); //设置 To: 头部的header字段 message.addRecipient(Message.RecipientType.TO, toAddress); //设置 Subject: header字段 message.setSubject(subject); // 现在设置的实际消息 message.setText(body); //定义发送协议 Transport transport = ssn.getTransport("smtp"); //建立与服务器的链接 transport.connect(smtphost, user, password); //发送邮件 transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO)); //transport.send(message); //关闭邮件传输 transport.close(); %> <p>你的邮件已发送,请返回。</p> <% } catch(Exception m) //捕获异常 { out.println(m.toString()); m.printStackTrace(); } %> </body> </html>
4.本地可以发送邮件,但上传到服务器后不能发送邮件?
很可能是服务器端关闭了“25”端口引起的,像我使用的是腾讯云,则需要到控制台申请解封,腾讯云的解封方法如下:
1)登录进入控制台主页,
2)右上角名字,下拉
3)点击“安全管控”
4)左侧申请“25端口解封”
腾讯的提示:
为了提升腾讯云 IP 地址发邮件的质量,默认限制云服务器 TCP 25端口连接外部地址,如果您没有在云上部署邮件服务,该限制不会影响您的服务;如果您需要使用邮件服务,我们诚挚地向您推荐腾讯企业邮箱。如果您一定要使用云主机向外连接TCP 25 端口,请确保 TCP 25 端口仅用来连接第三方 SMTP 服务器,从第三方 SMTP 服务器外发邮件。如发现您使用云主机直接SMTP 发送邮件,腾讯云有权永久封禁 TCP 25 端口,并不再提供相关服务。
建议修改成其他端口,如腾讯的“587”,然后在安全组放行该端口
5.相关附件下载:
javamail官网下载:https://github.com/javaee/javamail/releases
官网下载慢的话可以通过蓝奏云下载:
https://busy.lanzous.com/iB9Vwekh7yh
密码:ge1d