现在很少会通过自己的邮件服务器收邮件了,一般使用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端口连接外部地址,如果您没有在云上部署邮件服务,该限制不会影响您的服务;如果您需要使用邮件服务,我们诚挚地向您推荐腾讯企业邮箱。如果您一定要使用云主机向外连接TCP25 端口,请确保 TCP 25 端口仅用来连接第三方 SMTP 服务器,从第三方 SMTP 服务器外发邮件。如发现您使用云主机直接SMTP发送邮件,腾讯云有权永久封禁 TCP 25 端口,并不再提供相关服务。
建议修改成其他端口,如腾讯的“587”,然后在安全组放行该端口
5.相关附件下载
javamail官网下载:https://github.com/javaee/javamail/releases
官网下载慢的话可以通过蓝奏云下载:
https://busy.lanzous.com/iB9Vwekh7yh
密码:ge1d