2014-03-19 07: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 10:46:48 -04:00
"encoding/hex"
2014-03-25 21:37:18 -04:00
"errors"
2014-03-19 10:46:48 -04:00
"fmt"
2014-03-19 07:21:23 -04:00
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/base"
2014-03-19 10:46:48 -04:00
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/middleware"
2014-03-19 07:21:23 -04:00
)
2014-03-19 08:27:27 -04:00
// Create New mail message use MailFrom and MailUser
2014-03-25 21:37:18 -04:00
func NewMailMessageFrom ( To [ ] string , from , subject , body string ) Message {
msg := NewHtmlMessage ( To , from , subject , body )
2014-03-19 08:27:27 -04:00
msg . User = base . MailService . User
return msg
}
2014-03-25 21: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 07: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 10:46:48 -04:00
data [ "ActiveCodeLives" ] = base . Service . ActiveCodeLives / 60
data [ "ResetPwdCodeLives" ] = base . Service . ResetPwdCodeLives / 60
2014-03-19 07:21:23 -04:00
if user != nil {
data [ "User" ] = user
}
return data
}
2014-03-19 10:46:48 -04:00
// create a time limit code for user active
func CreateUserActiveCode ( user * models . User , startInf interface { } ) string {
2014-03-19 12:50:44 -04:00
minutes := base . Service . ActiveCodeLives
2014-03-19 10:46:48 -04:00
data := base . ToStr ( user . Id ) + user . Email + user . LowerName + user . Passwd + user . Rands
2014-03-19 12:50:44 -04:00
code := base . CreateTimeLimitCode ( data , minutes , startInf )
2014-03-19 10: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-19 21:05:48 -04:00
SendAsync ( & msg )
2014-03-19 10:46:48 -04:00
}
// Send email verify active email.
func SendActiveMail ( r * middleware . Render , user * models . User ) {
code := CreateUserActiveCode ( user , nil )
2014-03-19 12:50:44 -04:00
subject := "Verify your e-mail address"
2014-03-19 10:46:48 -04:00
data := GetMailTmplData ( user )
data [ "Code" ] = code
2014-03-19 12:50:44 -04:00
body , err := r . HTMLString ( "mail/auth/active_email" , data )
2014-03-19 10: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 12: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 10:46:48 -04:00
2014-03-19 21:05:48 -04:00
SendAsync ( & msg )
2014-03-19 10:46:48 -04:00
}
2014-03-25 21:37:18 -04:00
// SendNotifyMail sends mail notification of all watchers.
2014-04-02 10:38:30 -04:00
func SendNotifyMail ( user , owner * models . User , repo * models . Repository , issue * models . Issue ) error {
watches , err := models . GetWatches ( repo . Id )
2014-03-25 21:37:18 -04:00
if err != nil {
return errors . New ( "mail.NotifyWatchers(get watches): " + err . Error ( ) )
}
tos := make ( [ ] string , 0 , len ( watches ) )
for i := range watches {
uid := watches [ i ] . UserId
2014-04-02 10:38:30 -04:00
if user . Id == uid {
2014-03-25 21:37:18 -04:00
continue
}
u , err := models . GetUserById ( uid )
if err != nil {
return errors . New ( "mail.NotifyWatchers(get user): " + err . Error ( ) )
}
tos = append ( tos , u . Email )
}
if len ( tos ) == 0 {
return nil
}
2014-04-02 10:38:30 -04:00
subject := fmt . Sprintf ( "[%s] %s" , repo . Name , issue . Name )
content := fmt . Sprintf ( "%s<br>-<br> <a href=\"%s%s/%s/issues/%d\">View it on Gogs</a>." ,
issue . Content , base . AppUrl , owner . Name , repo . Name , issue . Index )
msg := NewMailMessageFrom ( tos , user . Name , subject , content )
2014-03-25 21:37:18 -04:00
msg . Info = fmt . Sprintf ( "Subject: %s, send notify emails" , subject )
SendAsync ( & msg )
return nil
}