2020-10-24 23:38:14 +03:00
// 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 private
import (
2020-10-26 19:42:27 +03:00
"encoding/json"
2020-10-24 23:38:14 +03:00
"fmt"
"net/http"
"strconv"
"code.gitea.io/gitea/models"
"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"
2020-10-24 23:38:14 +03:00
"code.gitea.io/gitea/services/mailer"
"gitea.com/macaron/macaron"
)
// SendEmail pushes messages to mail queue
//
// It doesn't wait before each message will be processed
2020-10-26 19:42:27 +03:00
func SendEmail ( ctx * macaron . Context ) {
if setting . MailService == nil {
ctx . JSON ( http . StatusInternalServerError , map [ string ] interface { } {
"err" : "Mail service is not enabled." ,
} )
return
}
var mail private . Email
rd := ctx . Req . Body ( ) . ReadCloser ( )
defer rd . Close ( )
if err := json . NewDecoder ( rd ) . Decode ( & mail ) ; err != nil {
log . Error ( "%v" , err )
ctx . JSON ( http . StatusInternalServerError , map [ string ] interface { } {
"err" : err ,
} )
return
}
2020-10-24 23:38:14 +03:00
var emails [ ] string
if len ( mail . To ) > 0 {
for _ , uname := range mail . To {
user , err := models . GetUserByName ( uname )
if err != nil {
err := fmt . Sprintf ( "Failed to get user information: %v" , err )
log . Error ( err )
ctx . JSON ( http . StatusInternalServerError , map [ string ] interface { } {
"err" : err ,
} )
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 {
err := models . IterateUser ( func ( user * models . User ) error {
2020-10-26 19:42:27 +03:00
if len ( user . Email ) > 0 {
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 )
ctx . JSON ( http . StatusInternalServerError , map [ string ] interface { } {
"err" : err ,
} )
return
}
}
sendEmail ( ctx , mail . Subject , mail . Message , emails )
}
func sendEmail ( ctx * macaron . Context , subject , message string , to [ ] string ) {
for _ , email := range to {
msg := mailer . NewMessage ( [ ] string { email } , subject , message )
mailer . SendAsync ( msg )
}
wasSent := strconv . Itoa ( len ( to ) )
ctx . PlainText ( http . StatusOK , [ ] byte ( wasSent ) )
}