golang实现HTML邮件内联样式处理的插件go-premailer的使用

go-premailer

用于Golang中HTML邮件的内联样式处理

安装

go get github.com/vanng822/go-premailer/premailer

示例

import (
	"fmt"
	"github.com/vanng822/go-premailer/premailer"
	"log"
)

func main() {
	// 从文件创建premailer实例
	prem, err := premailer.NewPremailerFromFile(inputFile, premailer.NewOptions())
	if err != nil {
		log.Fatal(err)
	}
	
	// 转换HTML,将样式内联
	html, err := prem.Transform()
	if err != nil {
		log.Fatal(err)
	}

	// 输出处理后的HTML
	fmt.Println(html)
}

输入示例

<html>
<head>
<title>Title</title>
<style type="text/css">
	h1 { width: 300px; color:red; }
	strong { text-decoration:none; }
</style>
</head>
<body>
	<h1>Hi!</h1>
	<p><strong>Yes!</strong></p>
</body>
</html>

输出结果

<html>
<head>
<title>Title</title>
</head>
<body>
	<h1 style="color:red;width:300px" width="300">Hi!</h1>
	<p><strong style="text-decoration:none">Yes!</strong></p>
</body>
</html>

命令行使用

# 处理HTML文件并输出到控制台
go run main.go -i your_email.html

# 处理HTML文件并输出到指定文件
go run main.go -i your_mail.html -o process_mail.html

这个插件可以将HTML中的CSS样式转换为内联样式,非常适合用于HTML邮件的发送,因为很多邮件客户端不支持外部或头部样式定义。


更多关于golang实现HTML邮件内联样式处理的插件go-premailer的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现HTML邮件内联样式处理的插件go-premailer的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用go-premailer处理HTML邮件内联样式

go-premailer是一个Golang库,用于将HTML文档中的CSS样式转换为内联样式,这在电子邮件HTML处理中非常有用,因为许多邮件客户端不支持外部样式表或<style>标签中的样式。

安装

go get github.com/vanng822/go-premailer/premailer

基本使用

package main

import (
	"fmt"
	"github.com/vanng822/go-premailer/premailer"
)

func main() {
	// 示例HTML内容
	html := `
	<html>
	<head>
		<style type="text/css">
			h1 { color: red; }
			p { font-size: 16px; }
			.button {
				background: #3498db;
				color: white;
				padding: 10px 20px;
				text-decoration: none;
				border-radius: 4px;
			}
		</style>
	</head>
	<body>
		<h1>标题</h1>
		<p>这是一段文字</p>
		<a href="#" class="button">点击按钮</a>
	</body>
	</html>
	`

	// 创建premailer实例
	prem := premailer.NewPremailerFromString(html, premailer.NewOptions())

	// 转换HTML,将CSS内联
	inlineHTML, err := prem.Transform()
	if err != nil {
		panic(err)
	}

	fmt.Println(inlineHTML)
}

高级配置

go-premailer提供了一些配置选项:

options := premailer.NewOptions()
options.RemoveClasses = true  // 移除class属性
options.CssToAttributes = true  // 将CSS转换为HTML属性(如bgcolor)
options.KeepBangImportant = true  // 保留!important声明

prem := premailer.NewPremailerFromString(html, options)

处理外部CSS

如果需要处理外部CSS文件:

options := premailer.NewOptions()
options.BaseURL = "http://example.com"  // 设置基础URL用于解析相对路径

prem := premailer.NewPremailerFromString(html, options)

实际邮件处理示例

func prepareEmailHTML(html string) (string, error) {
	options := premailer.NewOptions()
	options.RemoveClasses = true
	options.CssToAttributes = true
	
	prem := premailer.NewPremailerFromString(html, options)
	
	// 转换HTML
	inlineHTML, err := prem.Transform()
	if err != nil {
		return "", fmt.Errorf("failed to inline CSS: %v", err)
	}
	
	return inlineHTML, nil
}

func sendEmail(to, subject, htmlContent string) error {
	// 处理HTML内容
	processedHTML, err := prepareEmailHTML(htmlContent)
	if err != nil {
		return err
	}
	
	// 这里添加实际的邮件发送逻辑
	// 例如使用net/smtp或其他邮件库
	
	fmt.Println("Email HTML processed successfully")
	return nil
}

注意事项

  1. 性能考虑:对于大量邮件处理,考虑缓存处理结果或批量处理
  2. HTML有效性:确保输入HTML是格式良好的,否则可能导致解析错误
  3. CSS支持:不是所有CSS属性都被邮件客户端支持,即使内联了
  4. 测试:始终在不同邮件客户端测试结果

go-premailer是基于Go的HTML解析器和CSS选择器实现的,相比其他语言的实现可能功能稍有限制,但对于大多数邮件内联样式需求已经足够。

对于更复杂的邮件模板,建议先使用模板引擎(如html/template)生成HTML,然后再用go-premailer处理内联样式。

回到顶部