first commit
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
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"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user