Files
mailgoserver/internal/relay/log.go
T
2026-08-12 12:56:22 +01:00

76 lines
1.8 KiB
Go

package relay
import (
"mailgoserver/internal/db"
"mailgoserver/internal/toolbox"
"gopkg.in/ini.v1"
)
// LogEmail mirrors EmailRelay.log_email: computes the overall status from per-recipient
// results (relayed/partial/failed) and persists the EmailLog + EmailRecipientLog rows.
func (r *Relay) LogEmail(cfg *ini.File, peerIP, mailFrom, toAddress, ccAddresses, bccAddresses, subject, emailHeaders, messageBody, messageID, username string, dkimSigned bool, results []Result) (int64, error) {
overall := overallStatus(results)
logID, err := r.DB.InsertEmailLog(db.EmailLog{
MessageID: messageID,
Timestamp: toolbox.GetCurrentTime(cfg),
PeerIP: peerIP,
MailFrom: mailFrom,
ToAddress: toAddress,
CcAddresses: ccAddresses,
BccAddresses: bccAddresses,
Subject: subject,
EmailHeaders: emailHeaders,
MessageBody: messageBody,
Status: overall,
DKIMSigned: dkimSigned,
Username: username,
})
if err != nil {
return 0, err
}
for _, res := range results {
recipientType := res.RecipientType
if recipientType == "" {
recipientType = "to"
}
if err := r.DB.InsertEmailRecipientLog(db.EmailRecipientLog{
EmailLogID: logID,
Recipient: res.Recipient,
RecipientType: recipientType,
Status: res.Status,
ErrorCode: res.ErrorCode,
ErrorMessage: res.ErrorMessage,
ServerResponse: res.ServerResponse,
}); err != nil {
r.Logger.Error("Failed to log recipient %s: %v", res.Recipient, err)
}
}
return logID, nil
}
func overallStatus(results []Result) string {
if len(results) == 0 {
return "failed"
}
success, failed := 0, 0
for _, res := range results {
if res.Status == "success" {
success++
} else {
failed++
}
}
switch {
case success > 0 && failed > 0:
return "partial"
case success > 0:
return "relayed"
default:
return "failed"
}
}