Add support to send emails

And use it to send the wellcome email.

- Resolves: #18
merge-requests/8/head
meskio 4 years ago
parent 1f47124d04
commit de6b93211c
Signed by: meskio
GPG Key ID: 52B8F5AC97A2DA86
  1. 58
      mail/mail.go
  2. 7
      main.go
  3. 5
      server/add_user.go
  4. 22
      server/server.go
  5. 27
      tmpl/wellcome.mail

@ -0,0 +1,58 @@
package mail
import (
"bytes"
"net/smtp"
"strings"
"text/template"
)
// Mail holds the mail sender object
type Mail struct {
auth smtp.Auth
smtpaddr string
fromAddr string
domain string
tmpl *template.Template
}
// Init mail sender
func Init(email, password, smtpaddr, domain string) *Mail {
tmpl := template.Must(template.ParseFiles(
"tmpl/wellcome.mail",
))
hostname := strings.Split(smtpaddr, ":")[0]
username := strings.Split(email, "@")[0]
return &Mail{
auth: smtp.PlainAuth("", username, password, hostname),
smtpaddr: smtpaddr,
fromAddr: email,
domain: domain,
tmpl: tmpl,
}
}
type tmplData struct {
To string
From string
Data interface{}
}
// Send mail to recipients using a mail template
func (m Mail) Send(to []string, template string, data interface{}) error {
for i, recipient := range to {
if !strings.Contains(recipient, "@") {
to[i] += "@" + m.domain
}
}
tmplD := tmplData{
To: strings.Join(to, ", "),
From: m.fromAddr,
Data: data}
var buff bytes.Buffer
err := m.tmpl.ExecuteTemplate(&buff, template+".mail", tmplD)
if err != nil {
return err
}
return smtp.SendMail(m.smtpaddr, m.auth, m.fromAddr, to, buff.Bytes())
}

@ -10,6 +10,7 @@ import (
"0xacab.org/sindominio/lowry/db"
"0xacab.org/sindominio/lowry/ldap"
"0xacab.org/sindominio/lowry/mail"
"0xacab.org/sindominio/lowry/server"
"github.com/namsral/flag"
)
@ -24,6 +25,9 @@ func main() {
domain = flag.String("domain", "", "LDAP domain components")
ldappass = flag.String("ldappass", "", "Password of the LDAP `admin' user")
homepath = flag.String("homepath", "/home/", "Path to the user homes")
smtpaddr = flag.String("smtpaddr", "localhost:25", "The address of the smtp server to send email")
email = flag.String("email", "", "The email address to send notifications from")
emailpass = flag.String("emailpass", "", "The password of the email address")
httpaddr = flag.String("httpaddr", ":8080", "Web server address and port")
dbpath = flag.String("dbpath", "bolt.db", "The path to store the lowry status database")
ro = flag.Bool("ro", false, "Read-Only mode")
@ -32,6 +36,7 @@ func main() {
flag.String(flag.DefaultConfigFlagname, "/etc/lowry.conf", "Path to configuration file")
flag.Parse()
m := mail.Init(*email, *emailpass, *smtpaddr, *domain)
l := ldap.Ldap{
Addr: *ldapaddr,
Domain: *domain,
@ -56,7 +61,7 @@ func main() {
usersAskRole = readUserList(*askRolePath)
}
log.Fatal(server.Serve(*httpaddr, &l, ldb, usersAskRole))
log.Fatal(server.Serve(*httpaddr, &l, m, ldb, usersAskRole))
}
func cleanInvites(ldb *db.DB) {

@ -156,6 +156,11 @@ func (s *server) addUserHandler(w http.ResponseWriter, r *http.Request) {
log.Println("Error deleting invite: ", err)
}
err = s.mail.Send([]string{name}, "wellcome", name)
if err != nil {
log.Println("Error sending wellcome mail: ", err)
}
response = s.newResponse("adduser_success", w, r)
response.execute("name")
}

@ -6,11 +6,13 @@ import (
"0xacab.org/sindominio/lowry/db"
"0xacab.org/sindominio/lowry/ldap"
"0xacab.org/sindominio/lowry/mail"
"github.com/gorilla/mux"
)
type server struct {
ldap *ldap.Ldap
mail *mail.Mail
db *db.DB
sess *sessionStore
tmpl *template.Template
@ -18,13 +20,15 @@ type server struct {
}
// Serve lowry web site
func Serve(addr string, l *ldap.Ldap, ldb *db.DB, usersAskRole []string) error {
var s server
s.ldap = l
s.db = ldb
s.sess = initSessionStore()
s.tmpl = initTemplate()
s.usersAskRole = usersAskRole
func Serve(addr string, l *ldap.Ldap, m *mail.Mail, ldb *db.DB, usersAskRole []string) error {
s := server{
ldap: l,
mail: m,
db: ldb,
sess: initSessionStore(),
tmpl: initTemplate(),
usersAskRole: usersAskRole,
}
r := mux.NewRouter()
var notFoundFunc http.HandlerFunc
@ -51,7 +55,9 @@ func Serve(addr string, l *ldap.Ldap, ldb *db.DB, usersAskRole []string) error {
r.HandleFunc("/bundle.js", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "dist/bundle.js") })
r.HandleFunc("/style.css", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "dist/style.css") })
r.HandleFunc("/js/zxcvbn.js", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "dist/js/zxcvbn.js") })
r.HandleFunc("/js/zxcvbn-bootstrap-strength-meter.js", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "dist/js/zxcvbn-bootstrap-strength-meter.js") })
r.HandleFunc("/js/zxcvbn-bootstrap-strength-meter.js", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "dist/js/zxcvbn-bootstrap-strength-meter.js")
})
r.Handle("/img/{img}", http.StripPrefix("/img/", http.FileServer(http.Dir("img"))))
return http.ListenAndServe(addr, r)

@ -0,0 +1,27 @@
To: {{.To}}
From: {{.From}}
Content-Type: text/plain; charset="utf-4"
Subject: ¡Bienvenida a SinDominio!
Hola {{.Data}},
Una SinDominante te ha invitado a formar parte de SinDominio como amiga, ¡bienvenida!
A partir de ahora tienes acceso a servicios como el correo electronico [https://webmail.sindominio.net] y el chat [https://chat.sindominio.net/].
No te exigimos una participación en la asamblea de SinDominio pero nos gustaría que conocieras este proyecto. Y si quisieras formar parte de ella, e implicarte de forma directa en SinDominio, las puertas están abiertas, únicamente necesitarás una SinDominante que te amadrine así como la aprobación por parte de la asamblea.
Irás recibiendo nuestros boletines informativos donde iremos comunicando las novedades, necesidades y notícias referentes a la situación del proyecto.
No dudes en contactarnos si tienes alguna sugeréncia o duda o simplemente quieres felicitarnos por mantener vivo este proyecto: sd@sindominio.net
SinDominio tiene unos costes económicos para el mantenimiento físico de la infraestructura y su conexión a internet. Piensa que hay unas máquinas conectadas las 24 horas del día que consumen electricidad, discos duros, fuentes de alimentación, etc y la conexión de datos, gastos de los cuales no conseguimos escapar por ahora. Estas diferentes estructuras necesitan ser renovadas de vez en cuando.
Por ello te invitamos a no olvidarnos cuando tengas algo de dinero ahorrado para dar a esos proyectos en los que confías. Con tus aportaciones a SinDominio estás contribuyendo a que las comunicaciones sean más seguras y libres para muchos colectivos y personas.
Ayuda a que SinDominio siga funcionando otros 20 años más.
Caja de Ingenieros - ES86 3025 0006 21 1433230004.
Gracias
la Asamblea de SinDominio
Loading…
Cancel
Save