使用java mail 发送邮件

时间:2021-04-10 06:04:15

1.关联jar包:   activation.jar   mail.jar

2.调用 

@Test
public void test1() {
List<String> imageUrlList = Arrays.asList(new String[] { "src/美女1.jpg", "src/2.jpg", "src/2.jpg" });
List<String> attachmentUrlList = Arrays.asList(new String[] { "src/光辉岁月.MP3", "src/美女1.jpg", "src/2.jpg" }); MailInfo mailInfo = new MailInfo("us0911@126.com", "subject", "content");
mailInfo.setImageUrlList(imageUrlList);
MailUtils.getInstance().sendMail(mailInfo);
}

3.封装代码

3.1配置文件: src/mailConfig.properties

#邮件发送服务器地址: 比如126邮件地址为 smtp.126.com
mail.smtp.host = localhost
#发件人账户
emailAddress = a@bvb.de
#发件人密码
password = a

3.2 实体类

package de.bvb.utils;

import java.util.List;

public class MailInfo {
private String to;
private String subject;
private String content;
private List<String> imageUrlList;
private List<String> attachmentUrlList; public MailInfo() {
super();
} public MailInfo(String to, String subject, String content) {
super();
this.to = to;
this.subject = subject;
this.content = content;
} public String getTo() {
return to;
} public void setTo(String to) {
this.to = to;
} 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 List<String> getImageUrlList() {
return imageUrlList;
} public void setImageUrlList(List<String> imageUrlList) {
this.imageUrlList = imageUrlList;
} public List<String> getAttachmentUrlList() {
return attachmentUrlList;
} public void setAttachmentUrlList(List<String> attachmentUrlList) {
this.attachmentUrlList = attachmentUrlList;
} }

实体类

package de.bvb.utils;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.util.List;
import java.util.Properties; import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
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; public class MailUtils {
///////////////////////////////////////////////////////////////
//单例模式//////////////////////////////////////////////////////
private static MailUtils instance; private MailUtils() {
} public static MailUtils getInstance() {
if (instance == null) {
instance = new MailUtils();
}
return instance;
} //单例模式//////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////// private static Session session;
private static String emailAddress;
private static String username;
private static String password; // 配置文件路径: src/mailConfig.properties
static {
try {
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.smtp.auth", "true");
props.load(MailUtils.class.getClassLoader().getResourceAsStream("mailConfig.properties"));
emailAddress = props.getProperty("emailAddress");
username = emailAddress.split("\\@")[0];
password = props.getProperty("password");
session = Session.getInstance(props);
//session.setDebug(true);//启动调试,控制台打印交互信息
} catch (IOException e) {
e.printStackTrace();
}
} public boolean sendMail(MailInfo info) {
if (info == null) {
throw new RuntimeException("信息不全");
}
try {
Message message = createMail(info);
Transport transport = session.getTransport();
transport.connect(username, password);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
System.out.println("发送成功");
return true;
} catch (Exception e) {
throw new RuntimeException(e);
}
} private Message createMail(MailInfo info) throws MessagingException, UnsupportedEncodingException {
if (info == null) {
return null;
}
//创建邮件
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(emailAddress));
message.setRecipient(Message.RecipientType.TO, new InternetAddress(info.getTo()));
message.setSubject(info.getSubject()); MimeMultipart root = new MimeMultipart();
MimeMultipart contentImageMM = new MimeMultipart();
StringBuilder main = new StringBuilder(info.getContent()); //创建图片
List<String> imageUrlList = info.getImageUrlList();
if (imageUrlList != null && imageUrlList.size() > 0) {
for (String imageUrl : imageUrlList) {
String cid = generatorMD5(imageUrl); //id需要唯一,md5处理一把
MimeBodyPart image1 = new MimeBodyPart();
image1.setContentID(cid);
image1.setDataHandler(new DataHandler(new FileDataSource(imageUrl)));
main.append("<br/><img src='cid:").append(cid).append("'>");
contentImageMM.addBodyPart(image1);
}
} //描述数据之间的关系(正文和图片) 在封装到MimeBodyPart中去
MimeBodyPart content = new MimeBodyPart();
content.setContent(main.toString(), "text/html;charset=UTF-8");
contentImageMM.addBodyPart(content);
contentImageMM.setSubType("related");
MimeBodyPart contentImage = new MimeBodyPart();
contentImage.setContent(contentImageMM); //创建附件
List<String> attachmentUrlList = info.getAttachmentUrlList();
if (attachmentUrlList != null && attachmentUrlList.size() > 0) {
for (String attachmentUrl : attachmentUrlList) {
MimeBodyPart attachment1 = new MimeBodyPart();
DataHandler handler1 = new DataHandler(new FileDataSource(attachmentUrl));
attachment1.setDataHandler(handler1);
attachment1.setFileName(MimeUtility.encodeText(handler1.getName()));
root.addBodyPart(attachment1);
}
} //描述数据之间的关系(把正文和图片封装后的MimeBodyPart,再和附件封装)
root.addBodyPart(contentImage);
contentImageMM.setSubType("mixed"); //封装保存数据
message.setContent(root);
message.saveChanges();
return message;
} private String generatorMD5(String pwd) {
//用于加密的字符
char md5String[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
try {
//使用平台的默认字符集将此 String 编码为 byte序列,并将结果存储到一个新的 byte数组中
byte[] btInput = pwd.getBytes();
//信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
MessageDigest mdInst = MessageDigest.getInstance("MD5");
//MessageDigest对象通过使用 update方法处理数据, 使用指定的byte数组更新摘要
mdInst.update(btInput);
// 摘要更新之后,通过调用digest()执行哈希计算,获得密文
byte[] md = mdInst.digest();
// 把密文转换成十六进制的字符串形式
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) { // i = 0
byte byte0 = md[i]; //95
str[k++] = md5String[byte0 >>> 4 & 0xf]; // 5
str[k++] = md5String[byte0 & 0xf]; // F
}
//返回经过加密后的字符串
return new String(str);
} catch (Exception e) {
return null;
}
}
}

工具类