邮件箱发送案例从邮件箱配置到实现图片,附件,文本发送:
首先导入相关依赖jar;
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.0</version>
</dependency>
第一,使用xml的bean配置固定参数配置;
applicationContext-email.xml;
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd">
<bean id="mailSendUtil" class="com.zxq.iov.cloud.sp.fota.utils.email.MailSendUtil">
<property name="protocol" value="smtp"></property>
<property name="host" value="smtp.163.com"></property>
<property name="port" value="25"></property>
<property name="isAuth" value="true"></property>
<property name="isEnabledDebugMod" value="false"></property>
</bean>
</beans>
这里使用的时bean的set方法模式
第二:创建邮件发送类;
mailUtils();类
private static Properties props = null;
private static String protocol;
private static String host;
private static String port;
private static String isAuth;
private static String isEnabledDebugMod;
public static void setHost(String host) {
MailSendUtil.host = host;
}
public static void setPort(String port) {
MailSendUtil.port = port;
}
public static void setIsAuth(String isAuth) {
MailSendUtil.isAuth = isAuth;
}
public static void setIsEnabledDebugMod(String isEnabledDebugMod) {
MailSendUtil.isEnabledDebugMod = isEnabledDebugMod;
}
public static void setProtocol(String protocol) {
MailSendUtil.protocol = protocol;
}
/**
* 发送图片,文本,附件,HTML的邮件
*/
public static void sendTextEmail(SoftwareMailBean mailMessage,List<String> sendTos) throws Exception {
props = new Properties();
props.setProperty("mail.transport.protocol", protocol);
props.setProperty("mail.smtp.host", host);
props.setProperty("mail.smtp.port", port);
props.setProperty("mail.smtp.auth", isAuth);
props.setProperty("mail.debug", isEnabledDebugMod);
// 创建Session实例对象
Session session = Session.getDefaultInstance(props);
// 创建MimeMessage实例对象
MimeMessage message = new MimeMessage(session);
// 设置发件人
message.setFrom(new InternetAddress(mailMessage.getUserMail(), mailMessage.getSubject(), "utf-8"));
// 设置邮件主题
message.setSubject(mailMessage.getSubject());
// 设置收件人
if (!CollectionUtils.isEmpty(sendTos)) {
List<Address> addressList = new ArrayList<>();
for (String sendTo : sendTos) {
addressList.add(new InternetAddress(sendTo));
}
Address[] addresses = new Address[addressList.size()];
message.setRecipients(RecipientType.TO, addressList.toArray(addresses));
} else {
new RuntimeException();
}
// 设置发送时间
message.setSentDate(new Date());
// 设置优先级(1:紧急 3:普通 5:低)
message.setHeader("X-Priority", "1");
// 设置纯文本内容为邮件正文
message.setText(mailMessage.getContent());
//设置(文本+图片)和 附件 的关系(合成一个大的混合“节点” / Multipart )
if (StringUtils.isNotEmpty(mailMessage.getImageFile()) && StringUtils.isNotBlank(mailMessage.getAccessoryFile())) {
MimeMultipart mm = new MimeMultipart();
if (StringUtils.isNotEmpty(mailMessage.getImageFile())) {
// 5. 创建图片“节点”
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource(new File(mailMessage.getImageFile()))); // 读取本地文件
image.setDataHandler(dh); // 将图片数据添加到“节点”
image.setContentID("image_fairy_tail"); // 为“节点”设置一个唯一编号(在文本“节点”将引用该ID)
// 6. 创建文本“节点”
MimeBodyPart text = new MimeBodyPart();
// 这里添加图片的方式是将整个图片包含到邮件内容中, 实际上也可以以 http 链接的形式添加网络图片
text.setContent("这是一张图片<br/><img src='cid:image_fairy_tail'/>", "text/html;charset=UTF-8");
// 7. (文本+图片)设置 文本 和 图片 “节点”的关系(将 文本 和 图片 “节点”合成一个混合“节点”)
MimeMultipart mm_text_image = new MimeMultipart();
mm_text_image.addBodyPart(text);
mm_text_image.addBodyPart(image);
mm_text_image.setSubType("related"); // 关联关系
// 8. 将 文本+图片 的混合“节点”封装成一个普通“节点”
// 最终添加到邮件的 Content 是由多个 BodyPart 组成的 Multipart, 所以我们需要的是 BodyPart,
// 上面的 mm_text_image 并非 BodyPart, 所有要把 mm_text_image 封装成一个 BodyPart
MimeBodyPart text_image = new MimeBodyPart();
text_image.setContent(mm_text_image);
mm.addBodyPart(text_image);
}
if (StringUtils.isNotBlank(mailMessage.getAccessoryFile())) {
// 9. 创建附件“节点”
MimeBodyPart attachment = new MimeBodyPart();
DataHandler dh2 = new DataHandler(new FileDataSource(new File(mailMessage.getAccessoryFile()))); // 读取本地文件
attachment.setDataHandler(dh2); // 将附件数据添加到“节点”
attachment.setFileName(MimeUtility.encodeText(dh2.getName())); // 设置附件的文件名(需要编码)
// 10.
mm.addBodyPart(attachment); // 如果有多个附件,可以创建多个多次添加
mm.setSubType("mixed"); // 混合关系
}
message.setContent(mm);
}
// 保存并生成最终的邮件内容
message.saveChanges();
// 获得Transport实例对象
Transport transport = session.getTransport();
// 打开连接
transport.connect(mailMessage.getUserMail(), mailMessage.getPassword());
// 将message对象传递给transport对象,将邮件发送出去
transport.sendMessage(message, message.getAllRecipients());
// 关闭连接
transport.close();
}
第三:测试;
public static void main(String[] args) {
ApplicationContext cxt= new ClassPathXmlApplicationContext("applicationContext-email.xml");
MailSendUtil p=(MailSendUtil) cxt.getBean("mailSendUtil");
List<String> sendTos = new ArrayList<>();//创建收件人
sendTos.add("...@163.com");
sendTos.add("...@qq.com");
SoftwareMailBean mailMessage = new SoftwareMailBean();
mailMessage.setUserMail("....@163.com");//发件人
mailMessage.setPassword("...");//发件人密码
mailMessage.setSubject("");//发件主旨
mailMessage.setContent("主要內容");
mailMessage.setTheWriters("陌陌来信");
// mailMessage.setImageFile("D:/page/mm.jpg");//展示图片
// mailMessage.setAccessoryFile("D:/page/hehe.docx");//展示附件
try {
p.sendTextEmail(mailMessage, sendTos);
System.out.println("发送成功");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
好了这就简单的完成了一个邮件发送案例了;