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"
)
2016-11-26 14:53:29 +03:00
// 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" `
}
2016-11-26 14:53:29 +03:00
// NewSMTPWriter creates 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
}
2016-11-26 14:53:29 +03:00
// Init smtp writer with json config.
2014-07-27 02:37:18 +04:00
// 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 )
}
2016-11-26 14:53:29 +03:00
// WriteMsg writes message in smtp writer.
2014-07-27 02:37:18 +04:00
// it will send an email with subject and only this message.
2016-11-26 14:53:29 +03:00
func ( sw * SMTPWriter ) WriteMsg ( msg string , skip , level int ) error {
if level < sw . Level {
2014-07-27 02:37:18 +04:00
return nil
}
2016-11-26 14:53:29 +03:00
hp := strings . Split ( sw . Host , ":" )
2014-07-27 02:37:18 +04:00
// Set up authentication information.
auth := smtp . PlainAuth (
"" ,
2016-11-26 14:53:29 +03:00
sw . Username ,
sw . Password ,
2014-07-27 02:37:18 +04:00
hp [ 0 ] ,
)
// Connect to the server, authenticate, set the sender and recipient,
// and send the email all in one step.
2016-11-26 14:53:29 +03:00
contentType := "Content-Type: text/plain" + "; charset=UTF-8"
mailmsg := [ ] byte ( "To: " + strings . Join ( sw . RecipientAddresses , ";" ) + "\r\nFrom: " + sw . Username + "<" + sw . Username +
">\r\nSubject: " + sw . Subject + "\r\n" + contentType + "\r\n\r\n" + fmt . Sprintf ( ".%s" , time . Now ( ) . Format ( "2006-01-02 15:04:05" ) ) + msg )
2014-07-27 02:37:18 +04:00
return smtp . SendMail (
2016-11-26 14:53:29 +03:00
sw . Host ,
2014-07-27 02:37:18 +04:00
auth ,
2016-11-26 14:53:29 +03:00
sw . Username ,
sw . RecipientAddresses ,
2014-07-27 02:37:18 +04:00
mailmsg ,
)
}
2016-11-26 14:53:29 +03:00
// Flush when log should be flushed
func ( sw * SMTPWriter ) Flush ( ) {
2014-07-27 02:37:18 +04:00
}
2016-11-26 14:53:29 +03:00
// Destroy when writer is destroy
func ( sw * 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
}