mirror of
https://codeberg.org/forgejo/forgejo
synced 2024-11-24 10:46:10 +01:00
5248232c44
Unfortunately many email readers will (helpfully) detect url or url-like names and automatically create links to them, even in HTML emails. This is not ideal when usernames can have dots in them. This PR tries to prevent this behaviour by sticking ZWJ characters between dots and also set the meta tag to prevent format detection. Not every email template has been changed in this way - just the activation emails but it may be that we should be setting the above meta tag in all of our emails too. Signed-off-by: Andrew Thornton <art27@cantab.net>
102 lines
2.7 KiB
Go
102 lines
2.7 KiB
Go
// Copyright 2020 The Gitea Authors. All rights reserved.
|
|
// Use of this source code is governed by a MIT-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package mailer
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
|
|
"code.gitea.io/gitea/models"
|
|
repo_model "code.gitea.io/gitea/models/repo"
|
|
user_model "code.gitea.io/gitea/models/user"
|
|
"code.gitea.io/gitea/modules/base"
|
|
"code.gitea.io/gitea/modules/log"
|
|
"code.gitea.io/gitea/modules/markup"
|
|
"code.gitea.io/gitea/modules/markup/markdown"
|
|
"code.gitea.io/gitea/modules/setting"
|
|
"code.gitea.io/gitea/modules/templates"
|
|
"code.gitea.io/gitea/modules/translation"
|
|
)
|
|
|
|
const (
|
|
tplNewReleaseMail base.TplName = "release"
|
|
)
|
|
|
|
// MailNewRelease send new release notify to all all repo watchers.
|
|
func MailNewRelease(ctx context.Context, rel *models.Release) {
|
|
if setting.MailService == nil {
|
|
// No mail service configured
|
|
return
|
|
}
|
|
|
|
watcherIDList, err := repo_model.GetRepoWatchersIDs(ctx, rel.RepoID)
|
|
if err != nil {
|
|
log.Error("GetRepoWatchersIDs(%d): %v", rel.RepoID, err)
|
|
return
|
|
}
|
|
|
|
recipients, err := user_model.GetMaileableUsersByIDs(watcherIDList, false)
|
|
if err != nil {
|
|
log.Error("user_model.GetMaileableUsersByIDs: %v", err)
|
|
return
|
|
}
|
|
|
|
langMap := make(map[string][]string)
|
|
for _, user := range recipients {
|
|
if user.ID != rel.PublisherID {
|
|
langMap[user.Language] = append(langMap[user.Language], user.Email)
|
|
}
|
|
}
|
|
|
|
for lang, tos := range langMap {
|
|
mailNewRelease(ctx, lang, tos, rel)
|
|
}
|
|
}
|
|
|
|
func mailNewRelease(ctx context.Context, lang string, tos []string, rel *models.Release) {
|
|
locale := translation.NewLocale(lang)
|
|
|
|
var err error
|
|
rel.RenderedNote, err = markdown.RenderString(&markup.RenderContext{
|
|
Ctx: ctx,
|
|
URLPrefix: rel.Repo.Link(),
|
|
Metas: rel.Repo.ComposeMetas(),
|
|
}, rel.Note)
|
|
if err != nil {
|
|
log.Error("markdown.RenderString(%d): %v", rel.RepoID, err)
|
|
return
|
|
}
|
|
|
|
subject := locale.Tr("mail.release.new.subject", rel.TagName, rel.Repo.FullName())
|
|
mailMeta := map[string]interface{}{
|
|
"Release": rel,
|
|
"Subject": subject,
|
|
"Language": locale.Language(),
|
|
// helper
|
|
"i18n": locale,
|
|
"Str2html": templates.Str2html,
|
|
"DotEscape": templates.DotEscape,
|
|
}
|
|
|
|
var mailBody bytes.Buffer
|
|
|
|
if err := bodyTemplates.ExecuteTemplate(&mailBody, string(tplNewReleaseMail), mailMeta); err != nil {
|
|
log.Error("ExecuteTemplate [%s]: %v", string(tplNewReleaseMail)+"/body", err)
|
|
return
|
|
}
|
|
|
|
msgs := make([]*Message, 0, len(tos))
|
|
publisherName := rel.Publisher.DisplayName()
|
|
relURL := "<" + rel.HTMLURL() + ">"
|
|
for _, to := range tos {
|
|
msg := NewMessageFrom([]string{to}, publisherName, setting.MailService.FromEmail, subject, mailBody.String())
|
|
msg.Info = subject
|
|
msg.SetHeader("Message-ID", relURL)
|
|
msgs = append(msgs, msg)
|
|
}
|
|
|
|
SendAsyncs(msgs)
|
|
}
|