mirror of
https://github.com/abhinavxd/libredesk.git
synced 2025-11-04 14:03:19 +00:00
Compare commits
2 Commits
v0.7.4-alp
...
fix/imap-i
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
beee4bace6 | ||
|
|
a29c707795 |
@@ -11,6 +11,7 @@ import (
|
|||||||
"github.com/abhinavxd/libredesk/internal/attachment"
|
"github.com/abhinavxd/libredesk/internal/attachment"
|
||||||
"github.com/abhinavxd/libredesk/internal/conversation/models"
|
"github.com/abhinavxd/libredesk/internal/conversation/models"
|
||||||
"github.com/abhinavxd/libredesk/internal/envelope"
|
"github.com/abhinavxd/libredesk/internal/envelope"
|
||||||
|
"github.com/abhinavxd/libredesk/internal/stringutil"
|
||||||
umodels "github.com/abhinavxd/libredesk/internal/user/models"
|
umodels "github.com/abhinavxd/libredesk/internal/user/models"
|
||||||
"github.com/emersion/go-imap/v2"
|
"github.com/emersion/go-imap/v2"
|
||||||
"github.com/emersion/go-imap/v2/imapclient"
|
"github.com/emersion/go-imap/v2/imapclient"
|
||||||
@@ -182,14 +183,29 @@ func (e *Email) fetchAndProcessMessages(ctx context.Context, client *imapclient.
|
|||||||
|
|
||||||
// processEnvelope processes an email envelope.
|
// processEnvelope processes an email envelope.
|
||||||
func (e *Email) processEnvelope(ctx context.Context, client *imapclient.Client, env *imap.Envelope, seqNum uint32, inboxID int) error {
|
func (e *Email) processEnvelope(ctx context.Context, client *imapclient.Client, env *imap.Envelope, seqNum uint32, inboxID int) error {
|
||||||
|
// No from?
|
||||||
if len(env.From) == 0 {
|
if len(env.From) == 0 {
|
||||||
e.lo.Warn("no sender received for email", "message_id", env.MessageID)
|
e.lo.Warn("no sender received for email", "message_id", env.MessageID)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var fromAddress = strings.ToLower(env.From[0].Addr())
|
var (
|
||||||
|
fromEmail = strings.ToLower(env.From[0].Addr())
|
||||||
|
inboxFromAddress = e.FromAddress()
|
||||||
|
)
|
||||||
|
|
||||||
// Check if the message already exists in the database.
|
// If the sender email address is the same as the inbox email address, ignore it.
|
||||||
// If it does, ignore it.
|
// Extract email address from the inbox `from` address. "Name <email@example.com>"
|
||||||
|
inboxEmail, err := stringutil.ExtractEmail(inboxFromAddress)
|
||||||
|
if err != nil {
|
||||||
|
e.lo.Error("error extracting email from inbox address", "inbox_from_address", inboxFromAddress, "error", err)
|
||||||
|
return fmt.Errorf("extracting email from inbox address (%s): %w", inboxFromAddress, err)
|
||||||
|
}
|
||||||
|
if strings.EqualFold(fromEmail, inboxEmail) {
|
||||||
|
e.lo.Info("ignoring incoming message from inbox address", "message_id", env.MessageID, "from_email", fromEmail, "inbox_email", inboxEmail)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// If message already exists in the database, ignore it.
|
||||||
exists, err := e.messageStore.MessageExists(env.MessageID)
|
exists, err := e.messageStore.MessageExists(env.MessageID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
e.lo.Error("error checking if message exists", "message_id", env.MessageID)
|
e.lo.Error("error checking if message exists", "message_id", env.MessageID)
|
||||||
@@ -200,18 +216,18 @@ func (e *Email) processEnvelope(ctx context.Context, client *imapclient.Client,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check if contact with this email is blocked / disabed, if so, ignore the message.
|
// Check if contact with this email is blocked / disabed, if so, ignore the message.
|
||||||
if contact, err := e.userStore.GetContact(0, fromAddress); err != nil {
|
if contact, err := e.userStore.GetContact(0, fromEmail); err != nil {
|
||||||
envErr, ok := err.(envelope.Error)
|
envErr, ok := err.(envelope.Error)
|
||||||
if !ok || envErr.ErrorType != envelope.NotFoundError {
|
if !ok || envErr.ErrorType != envelope.NotFoundError {
|
||||||
e.lo.Error("error checking if user is blocked", "email", fromAddress, "error", err)
|
e.lo.Error("error checking if contact is blocked", "email", fromEmail, "error", err)
|
||||||
return fmt.Errorf("checking if user is blocked: %w", err)
|
return fmt.Errorf("checking if contact is blocked: %w", err)
|
||||||
}
|
}
|
||||||
} else if !contact.Enabled {
|
} else if !contact.Enabled {
|
||||||
e.lo.Debug("contact is blocked, ignoring message", "email", fromAddress)
|
e.lo.Info("contact is blocked, ignoring message", "email", fromEmail)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
e.lo.Debug("message does not exist", "message_id", env.MessageID)
|
e.lo.Info("message does not exist", "message_id", env.MessageID)
|
||||||
|
|
||||||
// Make contact.
|
// Make contact.
|
||||||
firstName, lastName := getContactName(env.From[0])
|
firstName, lastName := getContactName(env.From[0])
|
||||||
@@ -220,8 +236,8 @@ func (e *Email) processEnvelope(ctx context.Context, client *imapclient.Client,
|
|||||||
FirstName: firstName,
|
FirstName: firstName,
|
||||||
LastName: lastName,
|
LastName: lastName,
|
||||||
SourceChannel: null.NewString(e.Channel(), true),
|
SourceChannel: null.NewString(e.Channel(), true),
|
||||||
SourceChannelID: null.NewString(fromAddress, true),
|
SourceChannelID: null.NewString(fromEmail, true),
|
||||||
Email: null.NewString(fromAddress, true),
|
Email: null.NewString(fromEmail, true),
|
||||||
Type: umodels.UserTypeContact,
|
Type: umodels.UserTypeContact,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user