Создавайте электронные письма для новостных рассылок в Golang
Вы когда-нибудь задумывались, как работают информационные бюллетени от разных компаний и организаций? Некоторые компании используют такие платформы, как Mailchimp, но если вы хотите понять, что происходит и как создать свою собственную платформу, чтобы иметь полный контроль, тогда следуйте инструкциям, когда мы отправим нашим подписчикам несколько специальных информационных бюллетеней.
Шаблоны
Прежде чем мы начнем писать какой-либо код, давайте разберем, что происходит, когда вы получаете новое электронное письмо, и что может произойти. Когда вы получаете информационный бюллетень с любой платформы, на которую вы подписаны, вы замечаете, что каждая из них имеет свой дизайн, логотип и шрифт. Вы можете увидеть тему и жирный заголовок, а затем тело и иногда изображения. Все они содержатся в Templates
.
В большинстве случаев они создаются с использованием HTML, CSS и Javascript. HTML-файлы могут быть как в формате .html
, так и в формате .tmpl
. Пример шаблона обычно начинается с обычного <!DOCTYPE html>
. Вот пример шаблона:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My Newsletter</title>
<style>
/* Add CSS styles here */
</style>
</head>
<body>
<header>
<h1>Welcome to My Newsletter</h1>
</header>
<main>
<!-- Newsletter content goes here -->
</main>
<footer>
<p>© 2024 My Company. All rights reserved.</p>
</footer>
</body>
</html>
Динамические шаблоны
Было бы хлопотно, если бы нам приходилось постоянно редактировать html-файл каждый раз, когда мы хотим отправить новый контент нашим подписчикам, но, к счастью, есть способ сохранить базовое ощущение нашего информационного бюллетеня, динамически изменяя то, что наши пользователи видят всякий раз, когда они получают письмо от нас.
В Go пакет html/template
позволяет нам создавать динамический HTML-контент с использованием файлов шаблонов. Эти шаблоны могут включать заполнители или переменные, которые заменяются фактическими данными при визуализации шаблона.
Давайте посмотрим на пример файла шаблона newsletter_template.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{.Title}}</title>
<style>
/* Add CSS styles here */
</style>
</head>
<body>
<header>
<h1>{{.Header}}</h1>
</header>
<main>
<p>{{.Content}}</p>
</main>
<footer>
<p>© {{.Year}} My Company. All rights reserved.</p>
</footer>
</body>
</html>
В этом шаблоне мы определили placeholder
, такие как {{.Title}}
, {{.Header}}
, {{.Content}}
, и {{.Year}}
. Они будут динамически заменяться фактическими данными при отрисовке шаблона.
Теперь давайте посмотрим, как мы можем визуализировать этот шаблон в программе Go:
package main
import (
"html/template"
"os"
)
func main() {
// Read template file
tmpl, err := template.ParseFiles("newsletter_template.html")
if err != nil {
panic(err)
}
// Define data for template
data := struct {
Title string
Header string
Content string
Year int
}{
Title: "My Newsletter",
Header: "Welcome to My Newsletter",
Content: "This is a test newsletter. Enjoy!",
Year: 2024,
}
// Execute template
if err := tmpl.Execute(os.Stdout, data); err != nil {
panic(err)
}
}
В этой программе Go мы анализируем файл шаблона newsletter_template.html
и определяем данные, которые будут использоваться при рендеринге шаблона. Затем мы выполняем шаблон, передавая данные, и визуализированный HTML записывается в стандартный вывод os.Stdout
.
Преимущества динамических шаблонов
Использование динамических шаблонов дает несколько преимуществ:
- Гибкость: с помощью динамических шаблонов мы можем легко обновлять содержимое наших информационных бюллетеней, не изменяя базовую структуру HTML. Это позволяет быстро повторять и экспериментировать с различными макетами контента.
- Персонализация: динамические шаблоны позволяют нам персонализировать содержание каждого информационного бюллетеня на основе предпочтений пользователя, демографических данных или поведения. Мы можем адаптировать сообщение так, чтобы оно нашло отклик у каждого подписчика, увеличивая уровень вовлеченности и конверсии.
- Автоматизация: интегрируя динамические шаблоны с нашей системой доставки информационных бюллетеней, мы можем автоматизировать процесс отправки персонализированных электронных писем подписчикам. Это экономит время и усилия, обеспечивая при этом постоянное восприятие бренда получателями.
Подготовка настройки электронной почты
Теперь, когда у нас есть шаблон электронного письма со всеми данными, которые мы хотим отправить, следующим шагом будет его рассылка нашим подписчикам. В этом разделе мы рассмотрим, как это сделать с помощью Go и пакета gomail
.
Использование пакета gomail
Gomail — это разработанный мною пакет, который обеспечивает простой и эффективный способ отправки электронной почты в Go. Мы будем использовать его для составления нашего электронного сообщения, включая HTML-контент из нашего шаблона, и отправки его нашим подписчикам. Для использования пакета нам потребуются определенные требования:
- Каталог шаблонов: для поддержания организации и простоты управления полезно хранить все наши шаблоны электронной почты в специальном каталоге. В этом каталоге будут храниться HTML-шаблоны, которые мы создали для наших информационных бюллетеней. Например, мы можем создать каталог с именем
templates
в каталоге нашего проекта и хранить там все файлы шаблонов.
project_directory/
├── templates/
│ ├── newsletter_template.html
│ └── other_templates...
- Почтовые учетные данные: нам нужны учетные данные почтового клиента. Вы можете получить их у своих любимых поставщиков. Вот как их получить для Google Gmail SMTP. Используя Gomail, мы можем добавить учетные данные с помощью структуры:
package main
import (
"log"
"github.com/rhaqim/gomail"
)
func main() {
auth := gomail.EmailAuthConfig{
Host: "smtp.gmail.com",
Port: 587,
Username: "user",
Password: "password",
From: "me@gmail.com",
}
templateDir := "templates"
g := gomail.NewGoemail(auth, templatesDir)
}
Примечание: я включил каталог шаблона, а также создал новый экземпляр с помощьюauth
иtemplateDir
.
Отправка электронного письма
Теперь, когда у нас есть настройка отправителя электронной почты, нам нужно отправить само письмо. Gomail должен знать, кому вы отправляете электронное письмо (это может быть один или несколько человек), указать тему, какой шаблон в каталоге шаблонов вы хотите использовать, а затем тело сообщения. Собрав все это вместе, мы имеем следующее:
package main
import (
"log"
"github.com/rhaqim/gomail"
)
func main() {
auth := gomail.EmailAuthConfig{
Host: "smtp.gmail.com",
Port: 587,
Username: "user",
Password: "password",
From: "me@gmail.com",
}
templateDir := "templates"
g := gomail.NewGoemail(auth, templatesDir)
NewsletterApp(g)
}
func NewsletterApp(mail gomail.Gomail) {
email := &gomail.Email{
Recipients: []string{"recipient1e@gmail.com", "recipiente2@gmail.com"},
Subject: "Hello",
Body: "Hello, this is a test email",
TemplateFileName: "newsletter_template.html",
}
err := mail.SendEmail(email)
if err != nil {
log.Fatal(err)
}
}
Заключение
Это абстракция, и код Gomail общедоступен. Не стесняйтесь создавать форки и модифицировать их для своих нужд.