2020-10-24 23:38:14 +03:00
// Copyright 2020 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2020-10-24 23:38:14 +03:00
package private
import (
2022-10-31 18:51:14 +03:00
stdCtx "context"
2020-10-24 23:38:14 +03:00
"fmt"
"net/http"
"strconv"
2022-08-16 07:05:15 +03:00
"code.gitea.io/gitea/models/db"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2021-07-24 19:03:58 +03:00
"code.gitea.io/gitea/modules/json"
2020-10-24 23:38:14 +03:00
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/private"
2020-10-26 19:42:27 +03:00
"code.gitea.io/gitea/modules/setting"
2024-02-27 10:12:22 +03:00
"code.gitea.io/gitea/services/context"
2020-10-24 23:38:14 +03:00
"code.gitea.io/gitea/services/mailer"
)
// SendEmail pushes messages to mail queue
//
// It doesn't wait before each message will be processed
2021-01-26 18:36:53 +03:00
func SendEmail ( ctx * context . PrivateContext ) {
2020-10-26 19:42:27 +03:00
if setting . MailService == nil {
2021-06-23 22:38:19 +03:00
ctx . JSON ( http . StatusInternalServerError , private . Response {
Err : "Mail service is not enabled." ,
2020-10-26 19:42:27 +03:00
} )
return
}
var mail private . Email
2021-01-26 18:36:53 +03:00
rd := ctx . Req . Body
2020-10-26 19:42:27 +03:00
defer rd . Close ( )
2021-07-24 19:03:58 +03:00
2020-10-26 19:42:27 +03:00
if err := json . NewDecoder ( rd ) . Decode ( & mail ) ; err != nil {
2024-04-07 14:17:06 +03:00
log . Error ( "JSON Decode failed: %v" , err )
2021-06-23 22:38:19 +03:00
ctx . JSON ( http . StatusInternalServerError , private . Response {
Err : err . Error ( ) ,
2020-10-26 19:42:27 +03:00
} )
return
}
2020-10-24 23:38:14 +03:00
var emails [ ] string
if len ( mail . To ) > 0 {
for _ , uname := range mail . To {
2022-05-20 17:08:52 +03:00
user , err := user_model . GetUserByName ( ctx , uname )
2020-10-24 23:38:14 +03:00
if err != nil {
err := fmt . Sprintf ( "Failed to get user information: %v" , err )
log . Error ( err )
2021-06-23 22:38:19 +03:00
ctx . JSON ( http . StatusInternalServerError , private . Response {
Err : err ,
2020-10-24 23:38:14 +03:00
} )
return
}
2020-10-26 19:42:27 +03:00
if user != nil && len ( user . Email ) > 0 {
2020-10-24 23:38:14 +03:00
emails = append ( emails , user . Email )
}
}
} else {
2022-10-31 18:51:14 +03:00
err := db . Iterate ( ctx , nil , func ( ctx stdCtx . Context , user * user_model . User ) error {
2022-03-19 15:45:44 +03:00
if len ( user . Email ) > 0 && user . IsActive {
2020-10-26 19:42:27 +03:00
emails = append ( emails , user . Email )
}
2020-10-24 23:38:14 +03:00
return nil
} )
if err != nil {
err := fmt . Sprintf ( "Failed to find users: %v" , err )
log . Error ( err )
2021-06-23 22:38:19 +03:00
ctx . JSON ( http . StatusInternalServerError , private . Response {
Err : err ,
2020-10-24 23:38:14 +03:00
} )
return
}
}
sendEmail ( ctx , mail . Subject , mail . Message , emails )
}
2021-01-26 18:36:53 +03:00
func sendEmail ( ctx * context . PrivateContext , subject , message string , to [ ] string ) {
2020-10-24 23:38:14 +03:00
for _ , email := range to {
2023-01-22 17:23:52 +03:00
msg := mailer . NewMessage ( email , subject , message )
2020-10-24 23:38:14 +03:00
mailer . SendAsync ( msg )
}
wasSent := strconv . Itoa ( len ( to ) )
2021-12-15 09:59:57 +03:00
ctx . PlainText ( http . StatusOK , wasSent )
2020-10-24 23:38:14 +03:00
}