mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-03 21:08:25 +00:00 
			
		
		
		
	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)
 | 
						|
}
 |