[JAVA] 邮件发送Markdown文件自动渲染HTML

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值