传统使用的比较简单的是 smtp 25端口收发邮件;
阿里云服务器不能作为客户端通过smtp 25端口发送邮件,需要使用ssl协议发送邮件。
首先需要判断smtp 25端口是否可用。
在服务器端telnet smtp.163.com 25 如果可以成功就用smtp 25端口开发。链接不通需要打开25端口
下面是关于JavaMail邮件开发工具类
public class MailInfo {//电子邮件 工具类
/**
* 邮件主题
*/
public String subject;
/**
* 邮件内容
*/
public String content;
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
下面是邮箱登录验证的工具类
/**
* 邮箱登录验证
*
*/
public class MailAuthenticator extends Authenticator {
/**
* 用户名(登录邮箱)
*/
private String username;
/**
* 密码
*/
private String password;
/**
* 初始化邮箱和密码
* @param username 邮箱
* @param password 密码
*/
public MailAuthenticator(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
}
下面是邮箱发送器工具类
/**
* 邮件发送器,可单发,群发
* 群发邮件时可能会被认为是垃圾邮件,尽量避免使用
* 需要群发邮件时,可以采用多次单发的方式进行
*
*/
public class MailSender {
/**
* 邮箱session
*/
private transient Session session;
/**
* 邮件服务器登录验证
*/
private transient MailAuthenticator authenticator;
/**
* 发送邮件的props
*/
private final transient Properties props = System.getProperties();
/**
* 获取邮件发送工具实例
* 所有的发件操作均通过该实例进行
* @param username 发件人邮箱地址
* @param password 发件人邮箱密码
*
*/
public static MailSender getSender(String username, String password) {
MailSender serviceSms = new MailSender(username, password);
return serviceSms;
}
/**
* 初始化邮件发送器
* @param smtpHostName SMTP邮件服务器地址
* @param username 发送邮件的用户名(邮箱地址)
* @param password 发送邮件的密码
*
*/
public MailSender(final String smtpHostName, final String username, final String password) {
init(username, password, smtpHostName);
}
/**
* 初始化邮件发送器
* @param username 发送邮件的用户名(邮箱地址),并以此解析SMTP服务器地址
* @param password 发送邮件的密码
*
*/
public MailSender(String username, final String password) {
//通过邮箱地址解析出smtp服务器,对大多数邮箱都管用
String smtpHostName = "smtp." + username.split("@")[1];
System.out.println("SMTP: " + smtpHostName);
System.out.println("Username: " + username);
System.out.println("Password: " + password);
init(username, password, smtpHostName);
}
/**
* 初始化
* @param username 发送邮件的用户名(邮箱地址)
* @param password 密码
* @param smtpHostName SMTP主机地址
*/
private void init(String username, String password, String smtpHostName) {
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
// Get a Properties object
Properties props = new Properties();
props.setProperty("mail.smtp.host",smtpHostName); //服务器地址
props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.port", "465");
props.setProperty("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.auth", "true");
authenticator = new MailAuthenticator(username, password); //验证
session = Session.getInstance(props, authenticator); //创建session
}
/**
* 发送邮件
* @param recipient 收件人邮箱地址
* @param subject 邮件主题
* @param content 邮件内容
*
*/
public void send(String recipient, String subject, Object content) throws Exception {
final MimeMessage message = new MimeMessage(session); //创建mime类型邮件
message.setFrom(new InternetAddress(authenticator.getUsername())); //设置发信人
message.setRecipient(RecipientType.TO, new InternetAddress(recipient)); //设置收件人
message.setSubject(subject); //设置主题
message.setContent(content.toString(), "text/html;charset=utf-8"); //设置邮件内容
Transport.send(message); //发送
}
/**
* 群发邮件
* 群发邮件时可能会被认为是垃圾邮件,尽量避免使用
* @param recipients 收件人地址队列
* @param subject 主题
* @param content 内容
*
*/
public void send(List<String> recipients, String subject, Object content) throws Exception {
//初始化props
/*smtp 25端口开发代码props.put("mail.smtp.auth", "true");
props.put("mail.smtp.host", smtpHostName);
authenticator = new MailAuthenticator(username, password); //验证
session = Session.getInstance(props, authenticator); *///创建session //ssl协议开发(阿里云)
final MimeMessage message = new MimeMessage(session); //创建mime类型邮件
message.setFrom(new InternetAddress(authenticator.getUsername())); //设置发信人
final int count = recipients.size(); //设置收件人们
InternetAddress[] addresses = new InternetAddress[count];
for (int i = 0; i < count; i++) {
addresses[i] = new InternetAddress(recipients.get(i));
}
message.setRecipients(RecipientType.TO, addresses);
message.setSubject(subject); //设置主题
message.setContent(content.toString(), "text/html;charset=utf-8"); //设置邮件内容
Transport.send(message); //发送
}
/**
* 发送邮件
* @param recipient 收件人邮箱地址
* @param mail 邮件对象
*
*/
public void send(String recipient, MailInfo mail) throws Exception {
send(recipient, mail.getSubject(), mail.getContent());
}
/**
* 群发邮件
* 群发邮件时可能会被认为是垃圾邮件,尽量避免使用
* @param recipients 收件人地址队列
* @param mail 邮件对象
*
*/
public void send(List<String> recipients, MailInfo mail) throws Exception {
send(recipients, mail.getSubject(), mail.getContent());
}
}
读取配置文件工具类
/**
* 读取配置文件(Properties)
*
*/
public class Resource {
/**
* 读取指定Properties配置文件中的属性值
* 注意:配置文件需放置到src根目录
* @param fileName 文件名称
* @param key 键值
*
*/
public static String getValue(String fileName, String key){
if(!fileName.contains(".properties")){
fileName += ".properties";
}
fileName = "/" + fileName;
String value = "";
Properties p = new Properties();
InputStream in = Resource.class.getResourceAsStream(fileName);
try {
p.load(in);
value = p.getProperty(key);
in.close();
} catch (Exception e) {
e.printStackTrace();
}
return value;
}
/**
* 读取resource.properties配置文件中的属性值
* 该配置文件位于src根目录
* @param key 键值
*
*/
public static String getValue(String key){
String fileName = "/resource.properties";
String value = "";
Properties p = new Properties();
InputStream in = Resource.class.getResourceAsStream(fileName);
try {
p.load(in);
value = p.getProperty(key);
in.close();
} catch (Exception e) {
e.printStackTrace();
}
return value;
}
}
测试类
/**
* 测试入口
* @author 郭旭
*
*/
public class Test {
public static void main(String[] args) throws Exception {
// 从配置文件中读取用户名、密码
String username = Resource.getValue("username");
String password = Resource.getValue("password");
MailSender sender = MailSender.getSender(username, password); //获取邮件发送实例
// 声明收件人、邮件标题、邮件内容
String recipient = "XXX@qq.com";
String subject = "测试邮件";
StringBuffer content = new StringBuffer();
content.append("系统邮件,请勿回复!").append("<br/>");
content.append("<a href = 'www.baidu.com'>百度一下</a>。").append("<br/>");
content.append("<table border=1>");
content.append("<th>标题一</th><th>标题二</th><th>标题三</th>");
content.append("<tr><td>1</td><td>2</td><td>3</td></tr>");
content.append("<tr><td>4</td><td>5</td><td>6</td></tr>");
content.append("<tr><td>7</td><td>8</td><td>9</td></tr>");
content.append("</table>");
sender.send(recipient, subject, content);
}
}
代码结束