Skip to content

Commit 1f6c68d

Browse files
committed
MAILER
1 parent a630935 commit 1f6c68d

File tree

2 files changed

+49
-33
lines changed

2 files changed

+49
-33
lines changed

services/mailer/mail_workflow_run.go

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import (
99
"fmt"
1010
"sort"
1111

12+
"code.gitea.io/gitea/modules/translation"
13+
1214
actions_model "code.gitea.io/gitea/models/actions"
1315
"code.gitea.io/gitea/models/db"
1416
repo_model "code.gitea.io/gitea/models/repo"
@@ -26,8 +28,6 @@ func generateMessageIDForActionsWorkflowRunStatusEmail(repo *repo_model.Reposito
2628
}
2729

2830
func sendActionsWorkflowRunStatusEmail(ctx context.Context, repo *repo_model.Repository, run *actions_model.ActionRun, sender *user_model.User, recipients []*user_model.User) {
29-
msgs := make([]*sender_service.Message, 0, len(recipients))
30-
3131
messageID := generateMessageIDForActionsWorkflowRunStatusEmail(repo, run)
3232
headers := generateMetadataHeaders(repo)
3333

@@ -62,35 +62,46 @@ func sendActionsWorkflowRunStatusEmail(ctx context.Context, repo *repo_model.Rep
6262
})
6363
}
6464

65-
var mailBody bytes.Buffer
66-
if err := bodyTemplates.ExecuteTemplate(&mailBody, tplWorkflowRun, map[string]any{
67-
"Subject": subject,
68-
"Repo": repo,
69-
"Run": run,
70-
"Jobs": jobs,
71-
}); err != nil {
72-
log.Error("ExecuteTemplate [%s]: %v", tplWorkflowRun, err)
73-
}
65+
displayName := fromDisplayName(sender)
7466

75-
for _, recipient := range recipients {
76-
msg := sender_service.NewMessageFrom(
77-
recipient.Email,
78-
fromDisplayName(sender),
79-
setting.MailService.FromEmail,
80-
subject,
81-
mailBody.String(),
82-
)
83-
msg.Info = subject
84-
for k, v := range generateSenderRecipientHeaders(sender, recipient) {
85-
msg.SetHeader(k, v)
67+
langMap := make(map[string][]*user_model.User)
68+
for _, user := range recipients {
69+
langMap[user.Language] = append(langMap[user.Language], user)
70+
}
71+
for lang, tos := range langMap {
72+
locale := translation.NewLocale(lang)
73+
var mailBody bytes.Buffer
74+
if err := bodyTemplates.ExecuteTemplate(&mailBody, tplWorkflowRun, map[string]any{
75+
"Subject": subject,
76+
"Repo": repo,
77+
"Run": run,
78+
"Jobs": jobs,
79+
"locale": locale,
80+
"Language": locale.Language(),
81+
}); err != nil {
82+
log.Error("ExecuteTemplate [%s]: %v", tplWorkflowRun, err)
8683
}
87-
for k, v := range headers {
88-
msg.SetHeader(k, v)
84+
msgs := make([]*sender_service.Message, 0, len(tos))
85+
for _, rec := range tos {
86+
msg := sender_service.NewMessageFrom(
87+
rec.Email,
88+
displayName,
89+
setting.MailService.FromEmail,
90+
subject,
91+
mailBody.String(),
92+
)
93+
msg.Info = subject
94+
for k, v := range generateSenderRecipientHeaders(sender, rec) {
95+
msg.SetHeader(k, v)
96+
}
97+
for k, v := range headers {
98+
msg.SetHeader(k, v)
99+
}
100+
msg.SetHeader("Message-ID", messageID)
101+
msgs = append(msgs, msg)
89102
}
90-
msg.SetHeader("Message-ID", messageID)
91-
msgs = append(msgs, msg)
103+
SendAsync(msgs...)
92104
}
93-
SendAsync(msgs...)
94105
}
95106

96107
func SendActionsWorkflowRunStatusEmail(ctx context.Context, sender *user_model.User, repo *repo_model.Repository, run *actions_model.ActionRun) {

templates/mail/notify/workflow_run.tmpl

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,27 @@
44
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
55
<meta name="format-detection" content="telephone=no,date=no,address=no,email=no,url=no">
66
<title>{{.Subject}}</title>
7+
<style>
8+
.footer { font-size: small; color: #666; }
9+
</style>
710
</head>
811
<body>
9-
<h1>{{.Repo.FullName}} {{.Run.WorkflowID}}: {{.Run.Status}}</h1>
12+
<h4>
13+
{{.Repo.FullName}} {{.Run.WorkflowID}}: {{if .Run.Status.IsSuccess}}{{.locale.Tr "actions.status.success"}}{{else if .Run.Status.IsFailure}}{{.locale.Tr "actions.status.failure"}}{{else if .Run.Status.IsCancelled}}{{.locale.Tr "actions.status.cancelled"}}{{else}}{{.locale.Tr "actions.status.skipped"}}{{end}}
14+
</h4>
1015
<ul>
11-
{{range $index, $job := .Jobs}}
16+
{{range $job := .Jobs}}
1217
<li>
13-
<a href="{{$.Run.Link}}/jobs/{{$index}}">
14-
{{$job.Status}}: {{$job.Name}}{{if gt $job.Attempt 1}}, Attempt #{{$job.Attempt}}{{end}}
15-
</a>
18+
{{if $job.Status.IsSuccess}}{{.locale.Tr "actions.status.success"}}{{else if $job.Status.IsFailure}}{{.locale.Tr "actions.status.failure"}}{{else if $job.Status.IsCancelled}}{{.locale.Tr "actions.status.cancelled"}}{{else}}{{.locale.Tr "actions.status.skipped"}}{{end}}: {{$job.Name}}{{if gt $job.Attempt 1}}, Attempt #{{$job.Attempt}}{{end}}
1619
</li>
1720
{{end}}
1821
</ul>
22+
<div class="footer">
1923
<p>
2024
---
2125
<br>
22-
<a href="{{.Run.Link}}">{{.locale.Tr "mail.view_it_on" AppName}}</a>.
26+
<a href="{{.Run.HTMLURL}}">{{.locale.Tr "mail.view_it_on" AppName}}</a>.
2327
</p>
28+
</div>
2429
</body>
2530
</html>

0 commit comments

Comments
 (0)