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
"encoding/hex"
2014-03-26 05:37:18 +04:00
"errors"
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
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"
"github.com/gogits/gogs/modules/middleware"
2014-03-19 15:21:23 +04:00
)
2014-03-19 16:27:27 +04:00
// Create New mail message use MailFrom and MailUser
2014-03-26 05:37:18 +04:00
func NewMailMessageFrom ( To [ ] string , from , subject , body string ) Message {
msg := NewHtmlMessage ( To , from , subject , body )
2014-03-19 16:27:27 +04:00
msg . User = base . MailService . User
return msg
}
2014-03-26 05:37:18 +04:00
// Create New mail message use MailFrom and MailUser
func NewMailMessage ( To [ ] string , subject , body string ) Message {
return NewMailMessageFrom ( To , base . MailService . User , subject , body )
}
2014-03-19 15:21:23 +04:00
func GetMailTmplData ( user * models . User ) map [ interface { } ] interface { } {
data := make ( map [ interface { } ] interface { } , 10 )
data [ "AppName" ] = base . AppName
data [ "AppVer" ] = base . AppVer
data [ "AppUrl" ] = base . AppUrl
data [ "AppLogo" ] = base . AppLogo
2014-03-19 18:46:48 +04:00
data [ "ActiveCodeLives" ] = base . Service . ActiveCodeLives / 60
data [ "ResetPwdCodeLives" ] = base . Service . ResetPwdCodeLives / 60
2014-03-19 15:21:23 +04:00
if user != nil {
data [ "User" ] = user
}
return data
}
2014-03-19 18:46:48 +04:00
// create a time limit code for user active
func CreateUserActiveCode ( user * models . User , startInf interface { } ) string {
2014-03-19 20:50:44 +04:00
minutes := base . Service . ActiveCodeLives
2014-03-19 18:46:48 +04:00
data := base . ToStr ( user . Id ) + user . Email + user . LowerName + user . Passwd + user . Rands
2014-03-19 20:50:44 +04:00
code := base . CreateTimeLimitCode ( data , minutes , startInf )
2014-03-19 18:46:48 +04:00
// add tail hex username
code += hex . EncodeToString ( [ ] byte ( user . LowerName ) )
return code
}
// Send user register mail with active code
func SendRegisterMail ( r * middleware . Render , user * models . User ) {
code := CreateUserActiveCode ( user , nil )
subject := "Register success, Welcome"
data := GetMailTmplData ( user )
data [ "Code" ] = code
body , err := r . HTMLString ( "mail/auth/register_success" , data )
if err != nil {
log . Error ( "mail.SendRegisterMail(fail to render): %v" , err )
return
}
msg := NewMailMessage ( [ ] string { user . Email } , subject , body )
msg . Info = fmt . Sprintf ( "UID: %d, send register mail" , user . Id )
2014-03-20 05:05:48 +04:00
SendAsync ( & msg )
2014-03-19 18:46:48 +04:00
}
// Send email verify active email.
func SendActiveMail ( r * middleware . Render , user * models . User ) {
code := CreateUserActiveCode ( user , nil )
2014-03-19 20:50:44 +04:00
subject := "Verify your e-mail address"
2014-03-19 18:46:48 +04:00
data := GetMailTmplData ( user )
data [ "Code" ] = code
2014-03-19 20:50:44 +04:00
body , err := r . HTMLString ( "mail/auth/active_email" , data )
2014-03-19 18:46:48 +04:00
if err != nil {
log . Error ( "mail.SendActiveMail(fail to render): %v" , err )
return
}
msg := NewMailMessage ( [ ] string { user . Email } , subject , body )
2014-04-05 20:32:34 +04:00
msg . Info = fmt . Sprintf ( "UID: %d, send active mail" , user . Id )
SendAsync ( & msg )
}
// Send reset password email.
func SendResetPasswdMail ( r * middleware . Render , user * models . User ) {
code := CreateUserActiveCode ( user , nil )
subject := "Reset your password"
data := GetMailTmplData ( user )
data [ "Code" ] = code
body , err := r . HTMLString ( "mail/auth/reset_passwd" , data )
if err != nil {
log . Error ( "mail.SendResetPasswdMail(fail to render): %v" , err )
return
}
msg := NewMailMessage ( [ ] string { user . Email } , subject , body )
msg . Info = fmt . Sprintf ( "UID: %d, send reset password email" , user . Id )
2014-03-19 18:46:48 +04:00
2014-03-20 05:05:48 +04:00
SendAsync ( & msg )
2014-03-19 18:46:48 +04:00
}
2014-03-26 05:37:18 +04:00
2014-04-07 20:56:40 +04:00
// SendIssueNotifyMail sends mail notification of all watchers of repository.
func SendIssueNotifyMail ( user , owner * models . User , repo * models . Repository , issue * models . Issue ) ( [ ] string , error ) {
2014-04-02 18:38:30 +04:00
watches , err := models . GetWatches ( repo . Id )
2014-03-26 05:37:18 +04:00
if err != nil {
2014-04-07 20:56:40 +04:00
return nil , errors . New ( "mail.NotifyWatchers(get watches): " + err . Error ( ) )
2014-03-26 05:37:18 +04:00
}
tos := make ( [ ] string , 0 , len ( watches ) )
for i := range watches {
uid := watches [ i ] . UserId
2014-04-02 18:38:30 +04:00
if user . Id == uid {
2014-03-26 05:37:18 +04:00
continue
}
u , err := models . GetUserById ( uid )
if err != nil {
2014-04-07 20:56:40 +04:00
return nil , errors . New ( "mail.NotifyWatchers(get user): " + err . Error ( ) )
2014-03-26 05:37:18 +04:00
}
tos = append ( tos , u . Email )
}
if len ( tos ) == 0 {
2014-04-07 20:56:40 +04:00
return tos , nil
2014-03-26 05:37:18 +04:00
}
2014-05-05 12:27:28 +04: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 ) ,
base . AppUrl , owner . Name , repo . Name , issue . Index )
2014-05-06 04:09:38 +04:00
msg := NewMailMessageFrom ( tos , user . Email , subject , content )
2014-04-07 20:56:40 +04:00
msg . Info = fmt . Sprintf ( "Subject: %s, send issue notify emails" , subject )
SendAsync ( & msg )
return tos , nil
}
// SendIssueMentionMail sends mail notification for who are mentioned in issue.
2014-05-05 12:27:28 +04:00
func SendIssueMentionMail ( r * middleware . Render , user , owner * models . User ,
repo * models . Repository , issue * models . Issue , tos [ ] string ) error {
2014-04-07 20:56:40 +04:00
if len ( tos ) == 0 {
return nil
}
2014-05-05 12:27:28 +04:00
subject := fmt . Sprintf ( "[%s] %s(#%d)" , repo . Name , issue . Name , issue . Index )
data := GetMailTmplData ( nil )
data [ "IssueLink" ] = fmt . Sprintf ( "%s/%s/issues/%d" , owner . Name , repo . Name , issue . Index )
data [ "Subject" ] = subject
body , err := r . HTMLString ( "mail/notify/mention" , data )
if err != nil {
return fmt . Errorf ( "mail.SendIssueMentionMail(fail to render): %v" , err )
}
2014-05-06 04:09:38 +04:00
msg := NewMailMessageFrom ( tos , user . Email , subject , body )
2014-04-07 20:56:40 +04:00
msg . Info = fmt . Sprintf ( "Subject: %s, send issue mention emails" , subject )
2014-03-26 05:37:18 +04:00
SendAsync ( & msg )
return nil
}
2014-05-05 12:27:28 +04:00
// SendCollaboratorMail sends mail notification to new collaborator.
func SendCollaboratorMail ( r * middleware . Render , user , owner * models . User ,
repo * models . Repository ) error {
subject := fmt . Sprintf ( "%s added you to %s" , owner . Name , repo . Name )
data := GetMailTmplData ( nil )
data [ "RepoLink" ] = path . Join ( owner . Name , repo . Name )
data [ "Subject" ] = subject
body , err := r . HTMLString ( "mail/notify/collaborator" , data )
if err != nil {
return fmt . Errorf ( "mail.SendCollaboratorMail(fail to render): %v" , err )
}
msg := NewMailMessage ( [ ] string { user . Email } , subject , body )
msg . Info = fmt . Sprintf ( "UID: %d, send register mail" , user . Id )
SendAsync ( & msg )
return nil
}