直接上代码

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties; import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
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 org.apache.commons.httpclient.HttpException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service; import com.cdp.api.onboarding.onboardingenum.AttachmentTypeEnum; @Service
public class MailService {
@Value("${ALIDM_SMTP_AUTH}")
private String ALIDM_SMTP_AUTH; @Value("${ALIDM_SMTP_HOST}")
private String ALIDM_SMTP_HOST; @Value("${ALIDM_SMTP_PORT}")
private String ALIDM_SMTP_PORT; @Value("${ALIDM_SMTP_MAIL_USER}")
private String ALIDM_SMTP_MAIL_USER; @Value("${ALIDM_SMTP_MAIL_PASSWORD}")
private String ALIDM_SMTP_MAIL_PASSWORD; @Value("${ALIDM_SMTP_MAIL_FROM}")
private String ALIDM_SMTP_MAIL_FROM; @Value("${ALIDM_SMTP_MAIL_FROM_PERSONAL}")
private String ALIDM_SMTP_MAIL_FROM_PERSONAL; @Value("${ALIDM_SMTP_MAIL_FROM_CHARSET}")
private String ALIDM_SMTP_MAIL_FROM_CHARSET; @Value("${ALIDM_SMTP_MAIL_REPLY}")
private String ALIDM_SMTP_MAIL_REPLY; @Value("${QRCODEPICTUREURL}")
private String ORCODEPATH; @Autowired
private ResourceLoader resourceLoader; /**
* 阿里云smtp邮件服务
*
* @param mailTo
* @param mailSubject
* @param mailText
* @param list
* @throws MessagingException
* @throws HttpException
* @throws IOException
*/
public boolean sendMail(String mailTo, String mailSubject, String mailText)
throws Exception {
return sendMail(mailTo, mailSubject, mailText, null);
} public boolean sendMail(String mailTo, String mailSubject, String mailText,
List<Map<Integer, InputStream>> list) throws Exception {
boolean flag = false; // 配置发送邮件的环境属性
final Properties props = new Properties();
// 表示SMTP发送邮件,需要进行身份验证
props.put("mail.smtp.auth", ALIDM_SMTP_AUTH);
props.put("mail.smtp.host", ALIDM_SMTP_HOST);
props.put("mail.smtp.port", ALIDM_SMTP_PORT);
// 如果使用ssl,则去掉使用25端口的配置,进行如下配置,
// props.put("mail.smtp.socketFactory.class",
// "javax.net.ssl.SSLSocketFactory");
// props.put("mail.smtp.socketFactory.port", "465");
// props.put("mail.smtp.port", "465");
// 发件人的账号
props.put("mail.user", ALIDM_SMTP_MAIL_USER);
// 访问SMTP服务时需要提供的密码
props.put("mail.password", ALIDM_SMTP_MAIL_PASSWORD);
// 构建授权信息,用于进行SMTP进行身份验证
Authenticator authenticator = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 用户名、密码
String userName = props.getProperty("mail.user");
String password = props.getProperty("mail.password");
return new PasswordAuthentication(userName, password);
}
};
// 使用环境属性和授权信息,创建邮件会话
Session mailSession = Session.getInstance(props, authenticator);
// mailSession.setDebug(true);
// 创建邮件消息
MimeMessage message = new MimeMessage(mailSession);
try {
// 设置发件人
InternetAddress from = new InternetAddress(ALIDM_SMTP_MAIL_FROM,
ALIDM_SMTP_MAIL_FROM_PERSONAL, ALIDM_SMTP_MAIL_FROM_CHARSET);
message.setFrom(from);
Address[] a = new Address[1];
a[0] = new InternetAddress(ALIDM_SMTP_MAIL_REPLY);
message.setReplyTo(a);
// 设置收件人
InternetAddress to = new InternetAddress(mailTo);
message.setRecipient(MimeMessage.RecipientType.TO, to);
// 设置邮件标题
message.setSubject(mailSubject);
// 设置邮件的内容体
MimeMultipart mp = new MimeMultipart("related");
MimeBodyPart mbpContent = new MimeBodyPart();
// 判断模版是否要加二维码图片
if (mailText.contains("${MAIL_PHOTO}")) {
mailText = mailText
.replace("${MAIL_PHOTO}",
"<img src=\"cid:image\" width='254' height='254' border='0'>");
mbpContent.setContent(mailText, "text/html; charset=utf-8");
mp.addBodyPart(mbpContent);
InputStream ins = resourceLoader.getResource(ORCODEPATH).getInputStream();
DataSource dataSource4 = new ByteArrayDataSource(ins,
"image/jpeg");
MimeBodyPart image = new MimeBodyPart();
DataHandler dataHandler4 = new DataHandler(dataSource4);
image.setDataHandler(dataHandler4);
image.setHeader("Content-ID", "image");
image.setFileName(dataHandler4.getName());
mp.addBodyPart(image);
ins.close();
} else {
mbpContent.setContent(mailText, "text/html; charset=utf-8");
mp.addBodyPart(mbpContent);
}
/* 往邮件中添加附件 */
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
Map<Integer, InputStream> map = list.get(i); //这里取了map的key值
Iterator<Integer> iter = map.keySet().iterator();
while (iter.hasNext()) {
Integer key = Integer.parseInt(String.valueOf(iter
.next()));
InputStream ins = map.get(key);
                //这里加了个枚举
switch (AttachmentTypeEnum.getByValue(key)) {
case PNGJPG:
MimeBodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.removeHeader("Content-Type");
messageBodyPart
.removeHeader("Content-Transfer-Encoding");
messageBodyPart.addHeader("Content-Type",
"text/html; charset=gbk");
messageBodyPart.addHeader(
"Content-Transfer-Encoding", "base64");
DataSource dataSource1 = new ByteArrayDataSource(
ins, "application/png");
DataHandler dataHandler1 = new DataHandler(
dataSource1);
messageBodyPart.setDataHandler(dataHandler1);
messageBodyPart.setFileName(MimeUtility
.encodeText("附件.jpg"));
mp.addBodyPart(messageBodyPart);
ins.close();
break;
case WORD:
MimeBodyPart messageBodyPart2 = new MimeBodyPart();
messageBodyPart2.removeHeader("Content-Type");
messageBodyPart2
.removeHeader("Content-Transfer-Encoding");
messageBodyPart2.addHeader("Content-Type",
"text/html; charset=gbk");
messageBodyPart2.addHeader(
"Content-Transfer-Encoding", "base64");
DataSource dataSource2 = new ByteArrayDataSource(
ins, "application/docx");
DataHandler dataHandler2 = new DataHandler(
dataSource2);
messageBodyPart2.setDataHandler(dataHandler2);
messageBodyPart2.setFileName(MimeUtility
.encodeText("附件.docx"));
mp.addBodyPart(messageBodyPart2);
ins.close();
break;
case EXCEL:
MimeBodyPart messageBodyPart3 = new MimeBodyPart();
messageBodyPart3.removeHeader("Content-Type");
messageBodyPart3
.removeHeader("Content-Transfer-Encoding");
messageBodyPart3.addHeader("Content-Type",
"text/html; charset=gbk");
messageBodyPart3.addHeader(
"Content-Transfer-Encoding", "base64");
DataSource dataSource3 = new ByteArrayDataSource(
ins, "application/xlsx");
DataHandler dataHandler3 = new DataHandler(
dataSource3);
messageBodyPart3.setDataHandler(dataHandler3);
messageBodyPart3.setFileName(MimeUtility
.encodeText("附件.xlsx"));
mp.addBodyPart(messageBodyPart3);
ins.close();
break;
case MAILPHOTO:
MimeBodyPart image = new MimeBodyPart();
DataSource dataSource4 = new ByteArrayDataSource(
ins, "image/jpeg");
DataHandler dataHandler4 = new DataHandler(
dataSource4);
image.setDataHandler(dataHandler4);
image.setHeader("Content-ID", "a00000002");
image.setFileName(dataHandler4.getName());
mp.addBodyPart(image);
ins.close();
break;
}
}
} }
message.setContent(mp);
message.setSentDate(new Date());
// 发送邮件
Transport.send(message); flag = true;
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e.getMessage());
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e.getMessage());
} return flag;
}
}

有时在想  一直使用spring感觉会让自己越来越笨,各种写好的注解真的很方便啊

javamail 附件以及正文加图片的更多相关文章

  1. 使用C#发送正文带图片邮件

    最近有个地方用到正文带图片的邮件发送功能,由于发送邮件调用的是web service,要求正文必须是string,而接收方要能看到图片,还不能单纯的添加一个图片地址链接,查阅了很多资料,基本上都是从头 ...

  2. (二)JavaMail创建包含内嵌图片的邮件

    链接:https://blog.csdn.net/qq_41151659/article/details/96475739 代码如下: import com.sun.mail.util.MailSSL ...

  3. 帝国cms发布信息时替换正文IMG图片标签里的ALT内容

    帝国cms发布信息时替换正文IMG图片标签里的ALT内容 在 e/class/userfun.php 里面增加 //替换正文IMG里的ALT内容 function user_imgalt($mid,$ ...

  4. Delphi TreeView – 自动给标题上加图片

    Delphi TreeView – 自动给标题上加图片 当处理完TreeView控件树形结构的数据后,根据不同的树形节点Level,加上不同的图片. 图片的ImageList已经放置好,并且TreeV ...

  5. PHP的图片处理类(缩放、加图片水印和剪裁)

    <!--test.php文件内容--> <?php //包含这个类image.class.php include "image.class.php"; $img ...

  6. 使用JavaMail发送邮件-从FTP读取图片并添加到邮件正文发送

    业务分析: 最近工作需要,需要从FTP读取图片内容,添加到邮件正文发送.发送邮件正文,添加附件采用Spring的MimeMessageHelper对象来完成,添加图片也将采用MimeMessageHe ...

  7. Thinkphp 3.0版本上传文件加图片缩略图实例解析

    先看html加个表单,注意这里的action 路径要选 对. <div> <form action="__URL__/add_img" enctype=" ...

  8. 循序渐进VUE+Element 前端应用开发(23)--- 基于ABP实现前后端的附件上传,图片或者附件展示管理

    在我们一般系统中,往往都会涉及到附件的处理,有时候附件是图片文件,有时候是Excel.Word等文件,一般也就是可以分为图片附件和其他附件了,图片附件可以进行裁剪管理.多个图片上传管理,及图片预览操作 ...

  9. Python批量创建word文档(2)- 加图片和表格

    Python创建word文档,任务要求:小杨在一家公司上班,每天都需要给不同的客户发送word文档,以告知客户每日黄金价格.要求在文档开始处给出banner条,价格日期等用表格表示.最后贴上自己的联系 ...

随机推荐

  1. 如何将DataTable转换成List<T>

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  2. 【React -- 9/100】 抽离顶部导航栏 - [组件复用]

    今天写的页面中需要重复使用到顶部导航栏,所以把顶部导航栏抽离出来 考虑复用组件的健壮性,使用PropTypes校验,可以自定义一个click事件 JSX import React from " ...

  3. Codeforces Round #426 (Div. 2) - B

    题目链接:http://codeforces.com/contest/834/problem/B 题意:一共有26个门(A-Z表示),然后现在有n个人要走的门和k个守卫.每当有人要经过某个门时,门要一 ...

  4. Codeforces 957 水位标记思维题

    A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...

  5. 针对360浏览器读取不了cookie的问题

    今天学习cookie的时候发现在360和谷歌浏览器下设置cookie打开是空白的!经过一番搜索才知道在本地是访问不了cookie只能在服务器端进行访问,但是仍然可以在火狐下进行访问

  6. 写api接口神器--带你5分钟了解swagger

    随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了:前端渲染.先后端分离的形态,而且前端技术和后端技术在各自的道路上越走越远. 前端和后端的唯一联系,变成了API接口:API文档变成了 ...

  7. Flutter SDK安装(windows)

    Flutter集成了Dart,因此不需要单独安装dart-sdk.Flutter的SDK可以从官网下载:https://flutter.io/sdk-archive/#windows 在Flutter ...

  8. DUBBO原理、应用与面经总结

    研读dubbo源码已经有一段时间了,dubbo中有非常多优秀的设计模式和示例代码值得学习,但是dubbo的调用层级和方法链都较为繁杂,如果不对源码思路进行梳理则很容易忘却,因此总结一篇研读心得,从阅读 ...

  9. 【leetcode】522. Longest Uncommon Subsequence II

    题目如下: 解题思路:因为given list长度最多是50,我的解法就比较随意了,直接用一个嵌套的循环,判断数组中每个元素是否是其他的subsequence,最后找出不属于任何元素subsequen ...

  10. PHP入门培训教程 php动态网页怎么转换成html

       当动态网页遇上搜索引擎 虽然动态网页相比于静态页面拥有许多优势,但它在搜索引擎的检索上却碰了个大钉子.无论任何一家网站,尤其是那些以营销为目的的企业网站,没有谁会希望自己的网页无法被搜索引擎检索 ...