2014-03-19 15:21:23 +04:00
// Copyright 2014 The Gogs 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 (
2014-03-19 18:46:48 +04:00
"fmt"
2014-05-05 12:27:28 +04:00
"path"
2014-03-19 18:46:48 +04:00
2015-10-16 04:28:12 +03:00
"gopkg.in/macaron.v1"
2014-07-26 08:24:27 +04:00
2014-03-19 15:21:23 +04:00
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/base"
2014-03-19 18:46:48 +04:00
"github.com/gogits/gogs/modules/log"
2014-05-26 04:11:25 +04:00
"github.com/gogits/gogs/modules/setting"
2014-03-19 15:21:23 +04:00
)
2014-06-22 21:14:03 +04:00
const (
2015-09-26 02:45:44 +03:00
AUTH_ACTIVATE base . TplName = "mail/auth/activate"
AUTH_ACTIVATE_EMAIL base . TplName = "mail/auth/activate_email"
AUTH_REGISTER_NOTIFY base . TplName = "mail/auth/register_notify"
AUTH_RESET_PASSWORD base . TplName = "mail/auth/reset_passwd"
2014-06-22 21:14:03 +04:00
NOTIFY_COLLABORATOR base . TplName = "mail/notify/collaborator"
NOTIFY_MENTION base . TplName = "mail/notify/mention"
)
2015-09-17 08:54:12 +03:00
func ComposeTplData ( u * models . User ) map [ interface { } ] interface { } {
2014-03-19 15:21:23 +04:00
data := make ( map [ interface { } ] interface { } , 10 )
2014-05-26 04:11:25 +04:00
data [ "AppName" ] = setting . AppName
data [ "AppVer" ] = setting . AppVer
data [ "AppUrl" ] = setting . AppUrl
data [ "ActiveCodeLives" ] = setting . Service . ActiveCodeLives / 60
data [ "ResetPwdCodeLives" ] = setting . Service . ResetPwdCodeLives / 60
2015-09-17 22:45:36 +03:00
2014-06-06 06:07:35 +04:00
if u != nil {
data [ "User" ] = u
2014-03-19 15:21:23 +04:00
}
return data
}
2014-03-19 18:46:48 +04:00
2015-09-17 22:45:36 +03:00
func SendUserMail ( c * macaron . Context , u * models . User , tpl base . TplName , code , subject , info string ) {
2015-09-17 08:54:12 +03:00
data := ComposeTplData ( u )
2015-09-17 22:45:36 +03:00
data [ "Code" ] = code
body , err := c . HTMLString ( string ( tpl ) , data )
2014-03-19 18:46:48 +04:00
if err != nil {
2015-09-17 08:54:12 +03:00
log . Error ( 4 , "HTMLString: %v" , err )
2014-03-19 18:46:48 +04:00
return
}
2015-09-17 22:45:36 +03:00
msg := NewMessage ( [ ] string { u . Email } , subject , body )
msg . Info = fmt . Sprintf ( "UID: %d, %s" , u . Id , info )
2014-04-05 20:32:34 +04:00
2015-09-17 08:54:12 +03:00
SendAsync ( msg )
2014-04-05 20:32:34 +04:00
}
2015-09-17 22:45:36 +03:00
func SendActivateAccountMail ( c * macaron . Context , u * models . User ) {
SendUserMail ( c , u , AUTH_ACTIVATE , u . GenerateActivateCode ( ) , c . Tr ( "mail.activate_account" ) , "activate account" )
}
// SendResetPasswordMail sends reset password e-mail.
func SendResetPasswordMail ( c * macaron . Context , u * models . User ) {
SendUserMail ( c , u , AUTH_RESET_PASSWORD , u . GenerateActivateCode ( ) , c . Tr ( "mail.reset_password" ) , "reset password" )
}
2015-09-26 02:45:44 +03:00
// SendRegisterNotifyMail triggers a notify e-mail by admin created a account.
func SendRegisterNotifyMail ( c * macaron . Context , u * models . User ) {
body , err := c . HTMLString ( string ( AUTH_REGISTER_NOTIFY ) , ComposeTplData ( u ) )
if err != nil {
log . Error ( 4 , "HTMLString: %v" , err )
return
}
msg := NewMessage ( [ ] string { u . Email } , c . Tr ( "mail.register_notify" ) , body )
msg . Info = fmt . Sprintf ( "UID: %d, registration notify" , u . Id )
SendAsync ( msg )
}
2015-09-17 08:54:12 +03:00
// SendActivateAccountMail sends confirmation e-mail.
func SendActivateEmailMail ( c * macaron . Context , u * models . User , email * models . EmailAddress ) {
data := ComposeTplData ( u )
data [ "Code" ] = u . GenerateEmailActivateCode ( email . Email )
2014-12-17 18:41:49 +03:00
data [ "Email" ] = email . Email
2015-09-17 08:54:12 +03:00
body , err := c . HTMLString ( string ( AUTH_ACTIVATE_EMAIL ) , data )
2014-12-17 18:41:49 +03:00
if err != nil {
2015-09-17 08:54:12 +03:00
log . Error ( 4 , "HTMLString: %v" , err )
2014-12-17 18:41:49 +03:00
return
}
2015-09-17 08:54:12 +03:00
msg := NewMessage ( [ ] string { email . Email } , c . Tr ( "mail.activate_email" ) , body )
2015-09-17 21:57:24 +03:00
msg . Info = fmt . Sprintf ( "UID: %d, activate email" , u . Id )
2014-12-17 18:41:49 +03:00
2015-09-17 08:54:12 +03:00
SendAsync ( msg )
2014-12-17 18:41:49 +03:00
}
2014-04-07 20:56:40 +04:00
// SendIssueNotifyMail sends mail notification of all watchers of repository.
2014-06-06 06:07:35 +04:00
func SendIssueNotifyMail ( u , owner * models . User , repo * models . Repository , issue * models . Issue ) ( [ ] string , error ) {
2015-08-08 17:43:14 +03:00
ws , err := models . GetWatchers ( repo . ID )
2014-03-26 05:37:18 +04:00
if err != nil {
2015-09-17 22:45:36 +03:00
return nil , fmt . Errorf ( "GetWatchers[%d]: %v" , repo . ID , err )
2014-03-26 05:37:18 +04:00
}
2014-05-08 00:51:14 +04:00
tos := make ( [ ] string , 0 , len ( ws ) )
for i := range ws {
2015-03-18 04:51:39 +03:00
uid := ws [ i ] . UserID
2014-06-06 06:07:35 +04:00
if u . Id == uid {
2014-03-26 05:37:18 +04:00
continue
}
2015-09-17 22:45:36 +03:00
to , err := models . GetUserByID ( uid )
2014-03-26 05:37:18 +04:00
if err != nil {
2015-09-17 22:45:36 +03:00
return nil , fmt . Errorf ( "GetUserByID: %v" , err )
}
if to . IsOrganization ( ) {
continue
2014-03-26 05:37:18 +04:00
}
2015-09-17 22:45:36 +03:00
tos = append ( tos , to . Email )
2014-03-26 05:37:18 +04:00
}
if len ( tos ) == 0 {
2014-04-07 20:56:40 +04:00
return tos , nil
2014-03-26 05:37:18 +04:00
}
2015-08-24 22:05:20 +03:00
subject := fmt . Sprintf ( "[%s] %s (#%d)" , repo . Name , issue . Name , issue . Index )
2014-04-02 18:38:30 +04:00
content := fmt . Sprintf ( "%s<br>-<br> <a href=\"%s%s/%s/issues/%d\">View it on Gogs</a>." ,
2014-04-07 20:56:40 +04:00
base . RenderSpecialLink ( [ ] byte ( issue . Content ) , owner . Name + "/" + repo . Name ) ,
2014-05-26 04:11:25 +04:00
setting . AppUrl , owner . Name , repo . Name , issue . Index )
2015-09-17 21:57:24 +03:00
msg := NewMessage ( tos , subject , content )
2015-09-17 22:45:36 +03:00
msg . Info = fmt . Sprintf ( "Subject: %s, issue notify" , subject )
2015-09-17 08:54:12 +03:00
SendAsync ( msg )
2014-04-07 20:56:40 +04:00
return tos , nil
}
// SendIssueMentionMail sends mail notification for who are mentioned in issue.
2014-07-26 08:24:27 +04:00
func SendIssueMentionMail ( r macaron . Render , u , owner * models . User ,
2014-05-05 12:27:28 +04:00
repo * models . Repository , issue * models . Issue , tos [ ] string ) error {
2014-04-07 20:56:40 +04:00
if len ( tos ) == 0 {
return nil
}
2015-08-24 22:05:20 +03:00
subject := fmt . Sprintf ( "[%s] %s (#%d)" , repo . Name , issue . Name , issue . Index )
2014-05-05 12:27:28 +04:00
2015-09-17 08:54:12 +03:00
data := ComposeTplData ( nil )
2014-05-05 12:27:28 +04:00
data [ "IssueLink" ] = fmt . Sprintf ( "%s/%s/issues/%d" , owner . Name , repo . Name , issue . Index )
data [ "Subject" ] = subject
2015-09-17 22:45:36 +03:00
data [ "ActUserName" ] = u . DisplayName ( )
data [ "Content" ] = string ( base . RenderSpecialLink ( [ ] byte ( issue . Content ) , owner . Name + "/" + repo . Name ) )
2014-05-05 12:27:28 +04:00
2014-06-22 21:14:03 +04:00
body , err := r . HTMLString ( string ( NOTIFY_MENTION ) , data )
2014-05-05 12:27:28 +04:00
if err != nil {
2015-09-17 22:45:36 +03:00
return fmt . Errorf ( "HTMLString: %v" , err )
2014-05-05 12:27:28 +04:00
}
2015-09-17 21:57:24 +03:00
msg := NewMessage ( tos , subject , body )
2015-09-17 22:45:36 +03:00
msg . Info = fmt . Sprintf ( "Subject: %s, issue mention" , subject )
2015-09-17 08:54:12 +03:00
SendAsync ( msg )
2014-03-26 05:37:18 +04:00
return nil
}
2014-05-05 12:27:28 +04:00
// SendCollaboratorMail sends mail notification to new collaborator.
2015-09-17 22:45:36 +03:00
func SendCollaboratorMail ( r macaron . Render , u , doer * models . User , repo * models . Repository ) error {
subject := fmt . Sprintf ( "%s added you to %s/%s" , doer . Name , repo . Owner . Name , repo . Name )
2014-05-05 12:27:28 +04:00
2015-09-17 08:54:12 +03:00
data := ComposeTplData ( nil )
2015-09-17 22:45:36 +03:00
data [ "RepoLink" ] = path . Join ( repo . Owner . Name , repo . Name )
2014-05-05 12:27:28 +04:00
data [ "Subject" ] = subject
2014-06-22 21:14:03 +04:00
body , err := r . HTMLString ( string ( NOTIFY_COLLABORATOR ) , data )
2014-05-05 12:27:28 +04:00
if err != nil {
2015-09-17 22:45:36 +03:00
return fmt . Errorf ( "HTMLString: %v" , err )
2014-05-05 12:27:28 +04:00
}
2015-09-17 08:54:12 +03:00
msg := NewMessage ( [ ] string { u . Email } , subject , body )
2015-09-17 22:45:36 +03:00
msg . Info = fmt . Sprintf ( "UID: %d, add collaborator" , u . Id )
2014-05-05 12:27:28 +04:00
2015-09-17 08:54:12 +03:00
SendAsync ( msg )
2014-05-05 12:27:28 +04:00
return nil
}