Readme
作用
将Markdown文件渲染成HTML后以邮件形式发送出去,添加对文字颜色修改的功能,添加对本地内嵌图片的支持。
用法
java -jar EmailServer.jar Receiver Title MdFile
参数
None
自定义功能
实现文字编辑自定义颜色功能
格式如下:
$\c{grey}{This an $example}$
$\c{#FF3032}{This an example}$
实现图片本地文件内嵌上传功能
目前只支持绝对路径。
看使用情况,如有必要,则考虑增加调整大小尺寸的功能。
![](C:\Users\yun\Pictures\hei.jpg)
![](C:\Users\yun\Pictures\he.jpg)
源码
package com.ck;
import com.sun.mail.util.MailSSLSocketFactory;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.*;
import java.security.GeneralSecurityException;
import java.util.Properties;
public class EmailServer {
private static final String server = "smtp.163.com";
private static final String password = "16位码";
private static final String sender = "xxx@163.com";
private static String receiver;
private static String title;
private static String mdFilePath;
public static void main(String[] args) throws GeneralSecurityException, MessagingException, IOException {
try {
receiver = args[0];
title = args[1];
mdFilePath = args[2];
} catch (ArrayIndexOutOfBoundsException e) {
System.out.printf(
"\033[01;31m%s\033[0m\n",
"Example: java -jar EmailServer.jar Receiver Title MdFile"
);
System.exit(1);
}
Properties prop = new Properties();
prop.setProperty("mail.host", server); // 设置邮件服务器
prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议
prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码
// QQ邮箱设置SSL加密
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
//1、创建定义整个应用程序所需的环境信息的 Session 对象
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//传入发件人的姓名和授权码
return new PasswordAuthentication(sender, password);
}
});
//2、通过session获取transport对象
Transport transport = session.getTransport();
//3、通过transport对象邮箱用户名和授权码连接邮箱服务器
transport.connect(server, sender, password);
//4、创建邮件,传入session对象
MimeMessage mimeMessage = complexEmail(session);
//5、发送邮件
transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
//6、关闭连接
transport.close();
}
public static MimeMessage complexEmail(Session session) throws MessagingException, IOException {
//消息的固定信息
MimeMessage mimeMessage = new MimeMessage(session);
//发件人
mimeMessage.setFrom(new InternetAddress(sender));
//收件人
mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));
//邮件标题
mimeMessage.setSubject(title);
//准备文本
MDToHTML mdToHTML = new MDToHTML();
String content = mdToHTML.generateHtml(new File(mdFilePath));
MimeMultipart mimeMultipart = new MimeMultipart();
// 获取图片信息
Document doc = Jsoup.parse(content);
Elements img = doc.getElementsByTag("img");
for (Element s: img) {
String imgPath = s.attr("src");
String fileName = new File(imgPath).getName();
//准备图片数据
MimeBodyPart image = new MimeBodyPart();
DataHandler handler = new DataHandler(new FileDataSource(imgPath));
image.setDataHandler(handler);
image.setContentID(fileName); //设置图片id
content = content.replace(imgPath, String.format("cid:%s", fileName));
mimeMultipart.addBodyPart(image);
}
System.out.println(content);
//邮件内容
// File file = new File("D:\\scripts\\private\\emailServer\\src\\main\\java\\com\\ck\\a.html");
// FileOutputStream fileOutputStream = new FileOutputStream(file);
// OutputStreamWriter fileWriter = new OutputStreamWriter(fileOutputStream, "GBK");
// fileWriter.write(content);
// fileWriter.close();
// System.out.println(content);
MimeBodyPart text = new MimeBodyPart();
text.setContent(content, "text/html;charset=utf-8");
//附件
// MimeBodyPart appendix = new MimeBodyPart();
// appendix.setDataHandler(new DataHandler(
// new FileDataSource("D:\\root\\workspace\\ck\\jar\\G7StopEvent\\log\\G7StopEvent_info.log"))
// );
// appendix.setFileName("g.log");
//拼装邮件正文
mimeMultipart.addBodyPart(text);
// mimeMultipart.setSubType("related"); //文本和图片内嵌成功
//将拼装好的正文内容设置为主体
MimeBodyPart contentText = new MimeBodyPart();
contentText.setContent(mimeMultipart);
//拼接附件
MimeMultipart allFile = new MimeMultipart();
// allFile.addBodyPart(appendix); //附件
allFile.addBodyPart(contentText); //正文
// allFile.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed
//放到Message消息中
mimeMessage.setContent(allFile);
mimeMessage.saveChanges(); //保存修改
return mimeMessage;
}
}
package com.ck;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.pegdown.PegDownProcessor;
public class MDToHTML {
public String generateHtml(File mdFile) throws IOException {
BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream(mdFile), StandardCharsets.UTF_8)
);
String line;
StringBuilder mdContent = new StringBuilder();
while ((line = br.readLine()) != null) {
mdContent.append(line).append("\r\n");
}
PegDownProcessor pdp = new PegDownProcessor(Integer.MAX_VALUE);
return htmlFormat(pdp.markdownToHtml(mdContent.toString()));
}
private String htmlFormat(String cnt) {
String pattern = "\\$\\\\c.*?}\\$";
Matcher matcher = Pattern.compile(pattern).matcher(cnt);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
String group = matcher.group();
String color = group.split("\\{")[1].split("}$")[0];
String formatStr = String.format("<span style=\"color:%s\">", color);
String body = group.split("\\{")[2].split("}")[0];
String finalString = formatStr + body + "</span>";
matcher.appendReplacement(sb, Matcher.quoteReplacement(finalString));
}
matcher.appendTail(sb);
return sb.toString();
}
public static void main(String[] args) throws IOException {
MDToHTML mdToHTML = new MDToHTML();
String content = mdToHTML.generateHtml(
new File("D:\\scripts\\private\\emailServer\\readme.md")
);
System.out.println(content.replace("<br/>", "\n"));
}
}
依赖
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<mail.version>1.6.2</mail.version>
<pegdown.version>1.6.0</pegdown.version>
<slf4j.version>1.7.32</slf4j.version>
<log4j.version>1.2.17</log4j.version>
<log4j2.version>2.13.3</log4j2.version>
<jsoup.version>1.12.1</jsoup.version>
</properties>
<dependencies>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>${mail.version}</version>
</dependency>
<dependency>
<groupId>org.pegdown</groupId>
<artifactId>pegdown</artifactId>
<version>${pegdown.version}</version>
<!-- <scope>test</scope>-->
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>${slf4j.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>${jsoup.version}</version>
</dependency>
</dependencies>