mirror of https://github.com/jlelse/GoBlog
Simple blogging system written in Go
https://goblog.app
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.8 KiB
102 lines
2.8 KiB
package main |
|
|
|
import ( |
|
"fmt" |
|
"log" |
|
"net/http" |
|
"strconv" |
|
"time" |
|
|
|
"github.com/emersion/go-sasl" |
|
"github.com/emersion/go-smtp" |
|
"go.goblog.app/app/pkgs/bufferpool" |
|
) |
|
|
|
const defaultContactPath = "/contact" |
|
|
|
func (a *goBlog) serveContactForm(w http.ResponseWriter, r *http.Request) { |
|
_, bc := a.getBlog(r) |
|
cc := bc.Contact |
|
a.render(w, r, a.renderContact, &renderData{ |
|
Data: &contactRenderData{ |
|
title: cc.Title, |
|
description: cc.Description, |
|
privacy: cc.PrivacyPolicy, |
|
}, |
|
}) |
|
} |
|
|
|
func (a *goBlog) sendContactSubmission(w http.ResponseWriter, r *http.Request) { |
|
// Get blog |
|
_, bc := a.getBlog(r) |
|
// Get form values and build message |
|
message := bufferpool.Get() |
|
defer bufferpool.Put(message) |
|
// Message |
|
formMessage := cleanHTMLText(r.FormValue("message")) |
|
if formMessage == "" { |
|
a.serveError(w, r, "Message is empty", http.StatusBadRequest) |
|
return |
|
} |
|
// Name |
|
if formName := cleanHTMLText(r.FormValue("name")); formName != "" { |
|
_, _ = fmt.Fprintf(message, "Name: %s\n", formName) |
|
} |
|
// Email |
|
formEmail := cleanHTMLText(r.FormValue("email")) |
|
if formEmail != "" { |
|
_, _ = fmt.Fprintf(message, "Email: %s\n", formEmail) |
|
} |
|
// Website |
|
if formWebsite := cleanHTMLText(r.FormValue("website")); formWebsite != "" { |
|
_, _ = fmt.Fprintf(message, "Website: %s\n", formWebsite) |
|
} |
|
// Add line break if message is not empty |
|
if message.Len() > 0 { |
|
_, _ = fmt.Fprintf(message, "\n") |
|
} |
|
// Add message text to message |
|
_, _ = message.WriteString(formMessage) |
|
// Send submission |
|
if err := a.sendContactEmail(bc.Contact, message.String(), formEmail); err != nil { |
|
log.Println(err.Error()) |
|
} |
|
// Send notification |
|
a.sendNotification(message.String()) |
|
// Give feedback |
|
a.render(w, r, a.renderContact, &renderData{ |
|
Data: &contactRenderData{ |
|
sent: true, |
|
}, |
|
}) |
|
} |
|
|
|
func (*goBlog) sendContactEmail(cc *configContact, body, replyTo string) error { |
|
// Check required config |
|
if cc == nil || cc.SMTPHost == "" || cc.EmailFrom == "" || cc.EmailTo == "" { |
|
return fmt.Errorf("email not send as config is missing") |
|
} |
|
// Build email |
|
email := bufferpool.Get() |
|
defer bufferpool.Put(email) |
|
_, _ = email.WriteString("Content-Type: text/plain; charset=UTF-8\n") |
|
_, _ = fmt.Fprintf(email, "To: %s\n", cc.EmailTo) |
|
if replyTo != "" { |
|
_, _ = fmt.Fprintf(email, "Reply-To: %s\n", replyTo) |
|
} |
|
_, _ = fmt.Fprintf(email, "Date: %s\n", time.Now().UTC().Format(time.RFC1123Z)) |
|
_, _ = fmt.Fprintf(email, "From: %s\n", cc.EmailFrom) |
|
subject := cc.EmailSubject |
|
if subject == "" { |
|
subject = "New contact message" |
|
} |
|
_, _ = fmt.Fprintf(email, "Subject: %s\n\n", subject) |
|
_, _ = fmt.Fprintf(email, "%s\n", body) |
|
// Send email using SMTP |
|
auth := sasl.NewPlainClient("", cc.SMTPUser, cc.SMTPPassword) |
|
port := cc.SMTPPort |
|
if port == 0 { |
|
port = 587 |
|
} |
|
return smtp.SendMail(cc.SMTPHost+":"+strconv.Itoa(port), auth, cc.EmailFrom, []string{cc.EmailTo}, email) |
|
}
|
|
|