feat: add gomailer client in gitness for mail notifications (#748)

pull/3408/head^2
Akhilesh Pandey 2023-11-02 08:25:25 +00:00 committed by Harness
parent 76e5a32b79
commit c0f429e7b7
7 changed files with 136 additions and 1 deletions

View File

@ -0,0 +1,34 @@
// Copyright 2023 Harness, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package mailer
import gomail "gopkg.in/mail.v2"
type MailRequest struct {
CCRecipients []string `json:"cc_recipients"`
ToRecipients []string `json:"to_recipients"`
Subject string `json:"subject"`
Body string `json:"body"`
ContentType string `json:"content_type"`
}
func (dto *MailRequest) ToGoMail() *gomail.Message {
mail := gomail.NewMessage()
mail.SetHeader("To", dto.ToRecipients...)
mail.SetHeader("Cc", dto.CCRecipients...)
mail.SetHeader("Subject", dto.Subject)
mail.SetBody(dto.ContentType, dto.Body)
return mail
}

View File

@ -0,0 +1,49 @@
// Copyright 2023 Harness, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package mailer
import (
"crypto/tls"
gomail "gopkg.in/mail.v2"
)
type Service struct {
dialer *gomail.Dialer
fromMail string
}
func NewMailClient(
host string,
port int,
username string,
fromMail string,
password string,
insecureSkipVerify bool,
) *Service {
d := gomail.NewDialer(host, port, username, password)
d.TLSConfig = &tls.Config{InsecureSkipVerify: insecureSkipVerify} // #nosec G402 (insecure TLS configuration)
return &Service{
dialer: d,
fromMail: fromMail,
}
}
func (c *Service) SendMail(mailRequest *MailRequest) error {
mail := mailRequest.ToGoMail()
mail.SetHeader("From", c.fromMail)
return c.dialer.DialAndSend(mail)
}

View File

@ -0,0 +1,37 @@
// Copyright 2023 Harness, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package mailer
import (
"github.com/harness/gitness/types"
"github.com/google/wire"
)
var WireSet = wire.NewSet(
ProvideMailService,
)
func ProvideMailService(config *types.Config) *Service {
mailSvc := NewMailClient(
config.SMTP.Host,
config.SMTP.Port,
config.SMTP.Username,
config.SMTP.FromMail,
config.SMTP.Password,
config.SMTP.InsecureSkipVerify, // #nosec G402 (insecure skipVerify configuration)
)
return mailSvc
}

View File

@ -38,7 +38,7 @@ type ReaderFactory[R Reader] struct {
}
// Launch launches a new reader for the provided group and client name.
// The setup method should be used to register the differents events the reader will act on.
// The setup method should be used to register the different events the reader will act on.
// To stop the reader and cleanup its resources the returned ReaderCanceler can be used.
// The reader also cancels automatically when the provided context is canceled.
// NOTE: Do not setup the reader outside of the setup method!

2
go.mod
View File

@ -110,6 +110,8 @@ require (
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/mail.v2 v2.3.1 // indirect
)
require (

4
go.sum
View File

@ -1014,6 +1014,8 @@ google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@ -1026,6 +1028,8 @@ gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:a
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4=
gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/mail.v2 v2.3.1 h1:WYFn/oANrAGP2C0dcV6/pbkPzv8yGzqTjPmTeO7qoXk=
gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=

View File

@ -285,4 +285,13 @@ type Config struct {
CodeOwners struct {
FilePath string `envconfig:"GITNESS_CODEOWNERS_FILEPATH" default:".harness/CODEOWNERS"`
}
SMTP struct {
Host string `envconfig:"GITNESS_SMTP_HOST"`
Port int `envconfig:"GITNESS_SMTP_PORT"`
Username string `envconfig:"GITNESS_SMTP_USERNAME"`
Password string `envconfig:"GITNESS_SMTP_PASSWORD"`
FromMail string `envconfig:"GITNESS_SMTP_FROM_MAIL"`
InsecureSkipVerify bool `envconfig:"GITNESS_SMTP_INSECURE_SKIP_VERIFY"`
}
}