前言
java实现邮件发送功能。
一、说明
java实现邮件发送功能,附件只支持单个文件发送,未来用到再进行完善。
二、使用步骤
1.引入库
代码如下(示例):
package cn.com.sinopec.edibc.scgl.common.util;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import javax.mail.util.ByteArrayDataSource;
import com.sun.mail.util.MailSSLSocketFactory;
/**
* 邮件发送类
* @author TONGXP
* @since 2020-09-28
* @version 1.0
*/
public class MailSenderInfo {
private String smtpHost;// smtp服务器
private String encryptionType;//加密协议类型
private String mailServerPort;//SMTP邮件服务器默认端口
private String fromAddress;// 邮件发送者的地址
private String toAddress;// 邮件接收者的地址
private String userName;//登陆邮件发送服务器的用户名
private String password;//登陆邮件发送服务器的密码
private boolean validate = false;// 是否需要身份验证
private String subject;//邮件主题
private String content;//邮件的文本内容
private byte[] file;//邮件附件
private String fileName;//邮件附件的文件名
/**
* 初始化邮件发送类
* @param smtpHost smtp服务器
* @param encryptionType 加密协议类型SSL/TLS
* @param mailServerPort SMTP邮件服务器默认端口
* @param fromAddress 邮件发送者的地址
* @param toAddress 邮件接收者的地址
* @param subject 邮件主题
* @param content 邮件的文本内容
* @param file 邮件附件
* @param attachFileNames 邮件附件的文件名
*/
public MailSenderInfo(String smtpHost,String encryptionType, String mailServerPort,
String fromAddress, String toAddress, String subject,String content,
byte[] file,String attachFileNames) {
this.smtpHost = smtpHost;
this.encryptionType = encryptionType;
this.mailServerPort = mailServerPort;
this.fromAddress = fromAddress;
this.toAddress = toAddress;
this.subject = subject;
this.content = content;
this.file = file;
this.fileName = attachFileNames;
}
/**
* 登陆邮件发送服务器的用户名和密码
* @param userName
* @param password
*/
public void setUserNameAndPassword(String userName, String password){
this.userName = userName;
this.password = password;
this.validate = true;
}
/**
* 获得邮件会话属性
*/
public Properties getProperties() {
Properties p = new Properties();
p.put("mail.smtp.host", this.smtpHost);
if ("SSL".equals(this.encryptionType)) {
MailSSLSocketFactory sf = null;
try {
sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
} catch (GeneralSecurityException e1) {
e1.printStackTrace();
}
p.put("mail.smtp.ssl.enable", "true");
p.put("mail.smtp.ssl.socketFactory", sf);
}else if ("TLS".equals(this.encryptionType)) {
p.put("mail.smtp.starttls.enable", "true");
}else if ("STARTTLS".equals(this.encryptionType)) {
p.put("mail.smtp.starttls.enable", "true");
}
p.put("mail.smtp.port", this.mailServerPort);
p.put("mail.smtp.auth", validate ? "true" : "false");
return p;
}
/**
* 邮件发送接口
* @return
*/
public boolean sendHtmlMail() {
// 判断是否需要身份认证
MyAuthenticator authenticator = null;
Properties pro = this.getProperties();
//如果需要身份认证,则创建一个密码验证器
if (this.validate) {
authenticator = new MyAuthenticator(this.userName, this.password);
}
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session.getDefaultInstance(pro,authenticator);
System.setProperty("mail.mime.splitlongparameters","false");
try {
// 根据session创建一个邮件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 创建邮件发送者地址
Address from = new InternetAddress(this.fromAddress);
// 设置邮件消息的发送者
mailMessage.setFrom(from);
// 创建邮件的接收者地址,并设置到邮件消息中
Address to = new InternetAddress(this.toAddress);
// Message.RecipientType.TO属性表示接收者的类型为TO
mailMessage.setRecipient(Message.RecipientType.TO,to);
// 设置邮件消息的主题
mailMessage.setSubject(this.subject);
// 设置邮件消息发送的时间
mailMessage.setSentDate(new Date());
// MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
Multipart mainPart = new MimeMultipart();
// 创建一个包含HTML内容的MimeBodyPart
BodyPart html = new MimeBodyPart();
// 设置HTML内容
html.setContent(this.content, "text/html; charset=utf-8");
mainPart.addBodyPart(html);
if (file!=null) {
//添加邮件
MimeBodyPart part = new MimeBodyPart();
InputStream is = new ByteArrayInputStream(file);
DataSource dataSource = new ByteArrayDataSource(is, MimeTypeUtil.getMimeTypeByfileName(fileName));
DataHandler dataHandler=new DataHandler(dataSource);
part.setDataHandler(dataHandler);
part.setFileName(MimeUtility.encodeText(fileName));
mainPart.addBodyPart(part);
}
// 将MiniMultipart对象设置为邮件内容
mailMessage.setContent(mainPart);
// 发送邮件
Transport.send(mailMessage);
return true;
} catch (MessagingException ex) {
ex.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
}
/**
* MimeType
* @author TONGXP
* @since 2020-09-28
* @version 1.0
*
*/
public class MimeTypeUtil {
/**
* 根据文件名称获取MimeType
* @param fileName
* @return MimeType
*/
public static String getMimeTypeByfileName(String fileName){
if (fileName.endsWith(".doc")) {
return "application/msword";
}else if (fileName.endsWith(".xls")) {
return "application/vnd.ms-excel";
}else if (fileName.endsWith(".xlsx")) {
return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
}else if (fileName.endsWith(".jpg")) {
return "image/jpeg";
}
return "";
}
}
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
public class MyAuthenticator extends Authenticator{
String userName=null;
String password=null;
public MyAuthenticator(){
}
public MyAuthenticator(String username, String password) {
this.userName = username;
this.password = password;
}
@Override
protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(userName, password);
}
}
2.读入数据
代码如下(示例):
MailSenderInfo mailSenderInfo = new MailSenderInfo(
smtpHost,
encryptionType,
mailServerPort,
fromAddress,
toAddress,
content,
content,
buff,
fileName);
mailSenderInfo.setUserNameAndPassword(fromAddress, password);
boolean state = mailSenderInfo.sendHtmlMail();
按照注释要求传入初始换数据,再调用设置发送服务器的用户名和密码方法以及邮件发送方法就可以了。
未测试无身份验证发送可否成功