diff --git a/CHANGELOG.md b/CHANGELOG.md index 27be4b7..0f5311d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,21 @@ Notable changes to Mailpit will be documented in this file. +## 0.1.3 + +### Feature +- Mark all messages as read + +### UI +- Better error handling when connection to server is broken +- Add reset search button +- Minor UI tweaks +- Update pagination values when new mail arrives when not on first page + + +### Pull Requests +- Merge pull request [#6](https://github.com/axllent/mailpit/issues/6) from KaptinLin/develop + ## 0.1.2 ### Feature diff --git a/cmd/root.go b/cmd/root.go index a5547fb..da09ca3 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -87,15 +87,21 @@ func init() { if len(os.Getenv("MP_UI_AUTH_FILE")) > 0 { config.UIAuthFile = os.Getenv("MP_UI_AUTH_FILE") } - if len(os.Getenv("MP_SMTP_AUTH_FILE")) > 0 { - config.SMTPAuthFile = os.Getenv("MP_SMTP_AUTH_FILE") - } if len(os.Getenv("MP_UI_SSL_CERT")) > 0 { config.UISSLCert = os.Getenv("MP_UI_SSL_CERT") } if len(os.Getenv("MP_UI_SSL_KEY")) > 0 { config.UISSLKey = os.Getenv("MP_UI_SSL_KEY") } + if len(os.Getenv("MP_SMTP_AUTH_FILE")) > 0 { + config.SMTPAuthFile = os.Getenv("MP_SMTP_AUTH_FILE") + } + if len(os.Getenv("MP_SMTP_SSL_CERT")) > 0 { + config.SMTPSSLCert = os.Getenv("MP_SMTP_SSL_CERT") + } + if len(os.Getenv("MP_SMTP_SSL_KEY")) > 0 { + config.SMTPSSLKey = os.Getenv("MP_SMTP_SSL_KEY") + } // deprecated 2022/08/06 if len(os.Getenv("MP_AUTH_FILE")) > 0 { diff --git a/screenshot.png b/screenshot.png index d2005ab..ef3a4fb 100644 Binary files a/screenshot.png and b/screenshot.png differ diff --git a/server/api.go b/server/api.go index e5f5662..468d3e2 100644 --- a/server/api.go +++ b/server/api.go @@ -218,6 +218,22 @@ func apiUnreadOne(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte("ok")) } +// Mark single message as unread +func apiMarkAllRead(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + + mailbox := vars["mailbox"] + + err := storage.MarkAllRead(mailbox) + if err != nil { + httpError(w, err.Error()) + return + } + + w.Header().Add("Content-Type", "text/plain") + _, _ = w.Write([]byte("ok")) +} + // Websocket to broadcast changes func apiWebsocket(w http.ResponseWriter, r *http.Request) { websockets.ServeWs(websockets.MessageHub, w, r) diff --git a/server/server.go b/server/server.go index 8c202a9..ada8462 100644 --- a/server/server.go +++ b/server/server.go @@ -39,6 +39,7 @@ func Listen() { r.HandleFunc("/api/{mailbox}/search", middleWareFunc(apiSearchMailbox)) r.HandleFunc("/api/{mailbox}/delete", middleWareFunc(apiDeleteAll)) r.HandleFunc("/api/{mailbox}/events", apiWebsocket) + r.HandleFunc("/api/{mailbox}/read", apiMarkAllRead) r.HandleFunc("/api/{mailbox}/{id}/source", middleWareFunc(apiDownloadSource)) r.HandleFunc("/api/{mailbox}/{id}/part/{partID}", middleWareFunc(apiDownloadAttachment)) r.HandleFunc("/api/{mailbox}/{id}/delete", middleWareFunc(apiDeleteOne)) diff --git a/server/ui-src/App.vue b/server/ui-src/App.vue index e846b83..83cc588 100644 --- a/server/ui-src/App.vue +++ b/server/ui-src/App.vue @@ -99,6 +99,13 @@ export default { this.loadMessages(); }, + resetSearch: function(e) { + e.preventDefault(); + this.search = ''; + this.scrollInPlace = true; + this.loadMessages(); + }, + reloadMessages: function() { this.search = ""; this.start = 0; @@ -198,6 +205,16 @@ export default { }); }, + markAllRead: function() { + let self = this; + let uri = 'api/' + self.mailbox + '/read' + self.get(uri, false, function(response) { + window.location.hash = ""; + self.scrollInPlace = true; + self.loadMessages(); + }); + }, + // websocket connect connect: function () { let wsproto = location.protocol == 'https:' ? 'wss' : 'ws'; @@ -210,12 +227,14 @@ export default { } // new messages if (response.Type == "new" && response.Data) { - if (self.start < 1) { - if (!self.searching) { + if (!self.searching) { + if (self.start < 1) { self.items.unshift(response.Data); if (self.items.length > self.limit) { self.items.pop(); } + } else { + self.start++; } } self.total++; @@ -299,7 +318,7 @@ export default {