2014-07-27 02:37:18 +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 log
import (
"encoding/json"
"fmt"
"net/smtp"
"strings"
"time"
)
const (
subjectPhrase = "Diagnostic message from server"
)
// smtpWriter implements LoggerInterface and is used to send emails via given SMTP-server.
2016-11-07 23:58:22 +03:00
type SMTPWriter struct {
2014-07-27 02:37:18 +04:00
Username string ` json:"Username" `
Password string ` json:"password" `
Host string ` json:"Host" `
Subject string ` json:"subject" `
RecipientAddresses [ ] string ` json:"sendTos" `
Level int ` json:"level" `
}
// create smtp writer.
2016-11-07 23:58:22 +03:00
func NewSMTPWriter ( ) LoggerInterface {
return & SMTPWriter { Level : TRACE }
2014-07-27 02:37:18 +04:00
}
// init smtp writer with json config.
// config like:
// {
// "Username":"example@gmail.com",
// "password:"password",
// "host":"smtp.gmail.com:465",
// "subject":"email title",
// "sendTos":["email1","email2"],
// "level":LevelError
// }
2016-11-07 23:58:22 +03:00
func ( sw * SMTPWriter ) Init ( jsonconfig string ) error {
2014-07-27 02:37:18 +04:00
return json . Unmarshal ( [ ] byte ( jsonconfig ) , sw )
}
// write message in smtp writer.
// it will send an email with subject and only this message.
2016-11-07 23:58:22 +03:00
func ( s * SMTPWriter ) WriteMsg ( msg string , skip , level int ) error {
2014-07-27 02:37:18 +04:00
if level < s . Level {
return nil
}
hp := strings . Split ( s . Host , ":" )
// Set up authentication information.
auth := smtp . PlainAuth (
"" ,
s . Username ,
s . Password ,
hp [ 0 ] ,
)
// Connect to the server, authenticate, set the sender and recipient,
// and send the email all in one step.
content_type := "Content-Type: text/plain" + "; charset=UTF-8"
mailmsg := [ ] byte ( "To: " + strings . Join ( s . RecipientAddresses , ";" ) + "\r\nFrom: " + s . Username + "<" + s . Username +
">\r\nSubject: " + s . Subject + "\r\n" + content_type + "\r\n\r\n" + fmt . Sprintf ( ".%s" , time . Now ( ) . Format ( "2006-01-02 15:04:05" ) ) + msg )
return smtp . SendMail (
s . Host ,
auth ,
s . Username ,
s . RecipientAddresses ,
mailmsg ,
)
}
2016-11-07 23:58:22 +03:00
func ( _ * SMTPWriter ) Flush ( ) {
2014-07-27 02:37:18 +04:00
}
2016-11-07 23:58:22 +03:00
func ( _ * SMTPWriter ) Destroy ( ) {
2014-07-27 02:37:18 +04:00
}
func init ( ) {
2016-11-07 23:58:22 +03:00
Register ( "smtp" , NewSMTPWriter )
2014-07-27 02:37:18 +04:00
}