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


评 论