在用java发送邮件之前,可以先去了解一下邮件相关的基本知识和一些简单的协议。我这里就不再说这些基本的知识了。我接下来会直接贴上代码以及注释。告诉你实际开发中是怎么用的,有哪些是必要的哪些是非必要的。废话不多说,直接上代码!
1:发送邮件需要准备的基本邮件信息
import java.util.Properties;
/**
* 发送邮件信息类
*
* @author:
* @date: 2017年11月2日
*/
public class MailSenderInfo {
// 发送邮件的服务器的IP和端口,我这里是苏宁的邮件服务器以及端口
private String mailServerHost = "smtp.cnsuning.com";
private String mailServerPort = "25";
// 邮件发送者的地址
private String fromUser;
// 邮件接收者的地址
private String toUser;
// 邮件抄送
private String copyUser;
// 邮件密送地址
private String bCopyUser;
// 登陆邮件发送服务器的用户名和密码
private String userName;
private String password;
// 是否需要身份验证
private boolean validate = true;
// 邮件主题
private String subject;
// 邮件的文本内容
private String content;
/**
* 获得邮件会话属性
*/
public Properties getProperties() {
Properties p = new Properties();
p.put("mail.smtp.host", this.mailServerHost);
p.put("mail.smtp.port", this.mailServerPort);
p.put("mail.smtp.auth", validate ? "true" : "false");
return p;
}
public String getMailServerHost() {
return mailServerHost;
}
public void setMailServerHost(String mailServerHost) {
this.mailServerHost = mailServerHost;
}
public String getMailServerPort() {
return mailServerPort;
}
public void setMailServerPort(String mailServerPort) {
this.mailServerPort = mailServerPort;
}
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;
}
public boolean isValidate() {
return validate;
}
public void setValidate(boolean validate) {
this.validate = validate;
}
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 String getFromUser() {
return fromUser;
}
public void setFromUser(String fromUser) {
this.fromUser = fromUser;
}
public String getToUser() {
return toUser;
}
public void setToUser(String toUser) {
this.toUser = toUser;
}
public String getCopyUser() {
return copyUser;
}
public void setCopyUser(String copyUser) {
this.copyUser = copyUser;
}
public String getbCopyUser() {
return bCopyUser;
}
public void setbCopyUser(String bCopyUser) {
this.bCopyUser = bCopyUser;
}
}
2:下面这个类主要是用来调用接口sendTextMail发送邮件
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;
import javax.mail.Address;
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.MimeMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.suning.secis.common.utils.CommonConstant;
public class SimpleMailSender {
private static final Logger LOGGER = LoggerFactory.getLogger(SimpleMailSender.class);
/**
* 获取邮箱基本信息并进行发送(账号开通邮件通知)
* created by 88424579 on 20190111
* @param mailInfo 邮箱基本信息
* @param multipart HTML+附件信息
* @return
*/
public static boolean sendTextMail(MailSenderInfo mailInfo,Multipart multipart) {
// 判断是否需要身份认证
MonitorAuthenticator authenticator = null;
Properties pro = mailInfo.getProperties();
if (mailInfo.isValidate()) {
// 如果需要身份认证,则创建一个密码验证器
authenticator = new MonitorAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
}
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
//sendMailSession.setDebug(true); //打印javamail内部日志
try {
// 根据session创建一个邮件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 创建邮件发送者地址
String nick = javax.mail.internet.MimeUtility.encodeText("发送人名称");
Address from = new InternetAddress(nick + " <" + mailInfo.getFromUser() + ">");
// 设置邮件消息的发送者
mailMessage.setFrom(from);
// 创建邮件的接收者地址,并设置到邮件消息中
if (null != mailInfo.getToUser() && !"".equals(mailInfo.getToUser())) {
String[] to = mailInfo.getToUser().split(",");
Address[] tos = new InternetAddress[to.length];
for (int i = 0; i < to.length; i++) {
tos[i] = new InternetAddress(to[i]);// 收件人
}
mailMessage.setRecipients(Message.RecipientType.TO, tos);
}
if (null != mailInfo.getCopyUser() && !"".equals(mailInfo.getCopyUser())) {
String[] copy = mailInfo.getCopyUser().split(",");
Address[] copys = new InternetAddress[copy.length];
for (int i = 0; i < copy.length; i++) {
copys[i] = new InternetAddress(copy[i]);
}
mailMessage.setRecipients(Message.RecipientType.CC, copys);
}
if (null != mailInfo.getbCopyUser() && !"".equals(mailInfo.getbCopyUser())) {
String[] bcopy = mailInfo.getbCopyUser().split(",");
Address[] bcopys = new InternetAddress[bcopy.length];
for (int i = 0; i < bcopy.length; i++) {
bcopys[i] = new InternetAddress(bcopy[i]);
}
mailMessage.setRecipients(Message.RecipientType.BCC, bcopys);
}
/*Address to = new InternetAddress(mailInfo.getToUser());
mailMessage.setRecipient(Message.RecipientType.TO, to);*/
// 设置邮件消息的主题
mailMessage.setSubject(mailInfo.getSubject());
// 设置邮件消息发送的时间
mailMessage.setSentDate(new Date());
// 设置邮件消息的主要内容
// 这里的内容主要是一些简单的字符串文字之类的,设置好放进content便可以了。这里先注释掉,大家发什么类型的邮件自己选就好了
//mailMessage.setText(mailInfo.getContent());
// mailMessage.setContent(mailInfo.getContent(), "text/html;charset=UTF-8");
// multipart主要是放入带有附件、HTML、图片等的信息
mailMessage.setContent(multipart, "text/html;charset=UTF-8");
// 发送邮件
Transport.send(mailMessage);
return true;
} catch (MessagingException ex) {
LOGGER.error("exception1 in #sendTextMail," + ex.getMessage(), ex);
//ex.printStackTrace();
} catch (UnsupportedEncodingException e) {
LOGGER.error("exception2 in #sendTextMail," + e.getMessage(), e);
//e.printStackTrace();
} catch (Exception ep) {
LOGGER.error("exception3 in #sendTextMail," + ep.getMessage());
//e.printStackTrace();
}
return false;
}
}
3:发送邮件的工具类可传入HTML,图片,附件还是调用上个类的SimpleMailSender的sendTextMail方法
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import org.springframework.stereotype.Service;
/**
*
* @author yangwj created by id 88424579 on 20190110
*
* send a email for new account inform the some message
*/
public class EmailAdditionalTool{
public static String userName="[email protected]";
public static String passWord="password";
public static String FromUser="[email protected]";
public static String ToUser="";
public static String attachmentUrl="";//附件URL地址
public static String picpath="";//图片地址
public static String htmlpath="";//HTML地址
@SuppressWarnings("static-access")
public void EmailSender(String htmlStr) throws MessagingException, Exception{
//邮箱基本信息
MailSenderInfo mailInfo = new MailSenderInfo();
mailInfo.setMailServerHost("smtp.cnsuning.com");
mailInfo.setMailServerPort("25");
mailInfo.setValidate(true);
mailInfo.setUserName(userName);
mailInfo.setPassword(passWord);
mailInfo.setFromUser(FromUser);
mailInfo.setToUser(ToUser);
mailInfo.setSubject("企业风险预警系统帐号开题通知");//邮件主题
//邮箱内容以及附件
Multipart multipart=new MimeMultipart();
// multipart.addBodyPart(createContent(""));//HTML格式邮件内容
multipart.addBodyPart(createAttachment(attachmentUrl));//文件附件
multipart.addBodyPart(createAttachment(picpath));//图片附件
//邮件HTML内容格式
// String htmlString=readHTML(htmlpath);
multipart.addBodyPart(createContent(htmlStr));//HTML格式邮件内容
// 这个类主要来发送邮件
SimpleMailSender sms = new SimpleMailSender();
//调用接口发送邮件
sms.sendTextMail(mailInfo,multipart);
}
/**
* 创建HTML格式的邮件内容
* @param body 邮件内容
* @return 邮件内容实体
* @throws Exception
*/
public static MimeBodyPart createContent(String body) throws Exception{
MimeBodyPart htmlBodyPart=new MimeBodyPart();
htmlBodyPart.setContent(body, "text/html;charset=UTF-8");
return htmlBodyPart;
}
/**
* 创建邮件中的附件
* @param filepath 附件的路径
* @return 生成附件的对象
* @throws Exception
*/
public static MimeBodyPart createAttachment(String filepath) throws Exception{
/*创建一个表示附件的MimeBodyPart对象,并加入附件内容以及相应的信息*/
MimeBodyPart attachPart=new MimeBodyPart();
//FileDataSource用于读取文件数据,并返回代表数据的输入输出和数据的MIME类型
FileDataSource fileDataSource=new FileDataSource(filepath);
//DataHandler类用于封装FileDataSource对象,并为应用程序提供访问数据的接口
attachPart.setDataHandler(new DataHandler(fileDataSource));
//设置附件名称,MimeUtility.encodeText可以处理乱码问题
attachPart.setFileName(MimeUtility.encodeText(fileDataSource.getName()));
return attachPart;
}
/**
* 传入页面url地址返回整个页面的转成流再变成流输出
*
* @param htmlpth html页面url
* @return 返回String字符串
* @throws IOException
*/
public String readHTML(String htmlpth) throws IOException {
InputStreamReader isReader = null;
BufferedReader bufReader = null;
StringBuffer buf = new StringBuffer();
try {
File file = new File(htmlpth);
isReader = new InputStreamReader(new FileInputStream(file), "utf-8");
bufReader = new BufferedReader(isReader, 1);
String data;
while((data = bufReader.readLine())!= null) {
buf.append(data);
}
} catch (Exception e) {
//TODO 处理异常
} finally {
//TODO 关闭流
isReader.close();
bufReader.close();
}
return buf.toString();
}
}
4:这里我给出一个我的类具体是如何调用的以上的EmailAdditionalTool工具类的,放入的是HTML和附件。具体的底层实现类和接口我就不给了。
package com.suning.secis.service.user.impl;
import com.suning.secis.common.utils.mail.EmailAdditionalTool;
import com.suning.secis.util.StringUtil;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
import javax.mail.MessagingException;
import java.io.*;
/**
*
* @author yangwj created by ID 88424579
* this class act on sending Email after administrator help user register suning Email
*/
@Component
public class SendEmailForRegisteredUser {
public String htmlUrl= "attachment/email.html";
public String attachmentUrl="attachment/风险监控服务操作手册 V2.0.pdf";
public static String name="";
public static String toUserEmail="";
public EmailAdditionalTool emailadditionaltool=new EmailAdditionalTool();
public void renderDataInHtml(){
try {
File inputStream = new ClassPathResource(htmlUrl).getFile();
File attUrl = new ClassPathResource(attachmentUrl).getFile();
Document doc=Jsoup.parse(inputStream,"UTF-8","http://www.oschina.net/");
Elements human_names=doc.getElementsByClass("human-name");
for (Element element : human_names) {
System.out.println(human_names);
if(null!=element && !"".equals(element)){
element.text("风险管理中心-"+name);
System.out.println(element);
}
}
if(false==toUserEmail.isEmpty() && false==StringUtil.isBlack(attachmentUrl)){
emailadditionaltool.ToUser=toUserEmail;
emailadditionaltool.attachmentUrl=attUrl.getPath();
}
try {
System.out.println(doc.html());
emailadditionaltool.EmailSender(doc.html().toString());
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
5:调用之后的效果如下:包含附件信息和HTML样式
6:希望大家有疑问的和不明白的地方或者不对的地方留言告诉我就行了
7:另外补充一点:在maven打包的时候可能会出现pdf文件转码的时候变成空白文件的问题:
org.apache.maven.plugins
maven-compiler-plugin
3.5.1
1.6
1.6
org.apache.maven.plugins
maven-resources-plugin
2.4
pdf
加上以上这段防止转码就可以了