This commit is contained in:
the-djmaze 2023-08-08 09:59:53 +02:00
parent f6ef6d45ff
commit 83456164c7
3 changed files with 44 additions and 34 deletions

View file

@ -77,7 +77,8 @@ class MailClient
MimeHeader::AUTOCRYPT, MimeHeader::AUTOCRYPT,
// SPAM // SPAM
MimeHeader::X_SPAM_STATUS, MimeHeader::X_SPAM_STATUS,
// MimeHeader::X_SPAM_FLAG, MimeHeader::X_SPAM_FLAG,
MimeHeader::X_SPAM_INFO,
MimeHeader::X_SPAMD_RESULT, MimeHeader::X_SPAMD_RESULT,
MimeHeader::X_BOGOSITY, MimeHeader::X_BOGOSITY,
// Virus // Virus

View file

@ -13,6 +13,7 @@ namespace MailSo\Mail;
use MailSo\Base\Utils; use MailSo\Base\Utils;
use MailSo\Imap\Enumerations\FetchType; use MailSo\Imap\Enumerations\FetchType;
use MailSo\Mime\Enumerations\Header as MimeHeader;
/** /**
* @category MailSo * @category MailSo
@ -160,7 +161,7 @@ class Message implements \JsonSerializable
$oHeaders = \strlen($sHeaders) ? new \MailSo\Mime\HeaderCollection($sHeaders, false, $sCharset) : null; $oHeaders = \strlen($sHeaders) ? new \MailSo\Mime\HeaderCollection($sHeaders, false, $sCharset) : null;
if ($oHeaders) { if ($oHeaders) {
$sContentTypeCharset = $oHeaders->ParameterValue( $sContentTypeCharset = $oHeaders->ParameterValue(
\MailSo\Mime\Enumerations\Header::CONTENT_TYPE, MimeHeader::CONTENT_TYPE,
\MailSo\Mime\Enumerations\Parameter::CHARSET \MailSo\Mime\Enumerations\Parameter::CHARSET
); );
@ -174,31 +175,31 @@ class Message implements \JsonSerializable
$bCharsetAutoDetect = !\strlen($sCharset); $bCharsetAutoDetect = !\strlen($sCharset);
$oMessage->sSubject = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::SUBJECT, $bCharsetAutoDetect); $oMessage->sSubject = $oHeaders->ValueByName(MimeHeader::SUBJECT, $bCharsetAutoDetect);
$oMessage->sMessageId = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::MESSAGE_ID); $oMessage->sMessageId = $oHeaders->ValueByName(MimeHeader::MESSAGE_ID);
$oMessage->sContentType = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE); $oMessage->sContentType = $oHeaders->ValueByName(MimeHeader::CONTENT_TYPE);
$oMessage->oFrom = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::FROM_, $bCharsetAutoDetect); $oMessage->oFrom = $oHeaders->GetAsEmailCollection(MimeHeader::FROM_, $bCharsetAutoDetect);
$oMessage->oTo = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::TO_, $bCharsetAutoDetect); $oMessage->oTo = $oHeaders->GetAsEmailCollection(MimeHeader::TO_, $bCharsetAutoDetect);
$oMessage->oCc = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::CC, $bCharsetAutoDetect); $oMessage->oCc = $oHeaders->GetAsEmailCollection(MimeHeader::CC, $bCharsetAutoDetect);
$oMessage->oBcc = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::BCC, $bCharsetAutoDetect); $oMessage->oBcc = $oHeaders->GetAsEmailCollection(MimeHeader::BCC, $bCharsetAutoDetect);
$oMessage->oSender = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::SENDER, $bCharsetAutoDetect); $oMessage->oSender = $oHeaders->GetAsEmailCollection(MimeHeader::SENDER, $bCharsetAutoDetect);
$oMessage->oReplyTo = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::REPLY_TO, $bCharsetAutoDetect); $oMessage->oReplyTo = $oHeaders->GetAsEmailCollection(MimeHeader::REPLY_TO, $bCharsetAutoDetect);
$oMessage->oDeliveredTo = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::DELIVERED_TO, $bCharsetAutoDetect); $oMessage->oDeliveredTo = $oHeaders->GetAsEmailCollection(MimeHeader::DELIVERED_TO, $bCharsetAutoDetect);
$oMessage->InReplyTo = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::IN_REPLY_TO); $oMessage->InReplyTo = $oHeaders->ValueByName(MimeHeader::IN_REPLY_TO);
$oMessage->References = Utils::StripSpaces( $oMessage->References = Utils::StripSpaces(
$oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::REFERENCES)); $oHeaders->ValueByName(MimeHeader::REFERENCES));
$oMessage->iHeaderTimeStampInUTC = \MailSo\Base\DateTimeHelper::ParseRFC2822DateString( $oMessage->iHeaderTimeStampInUTC = \MailSo\Base\DateTimeHelper::ParseRFC2822DateString(
$oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::DATE) $oHeaders->ValueByName(MimeHeader::DATE)
); );
// Priority // Priority
$sPriority = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_MSMAIL_PRIORITY) $sPriority = $oHeaders->ValueByName(MimeHeader::X_MSMAIL_PRIORITY)
?: $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::IMPORTANCE) ?: $oHeaders->ValueByName(MimeHeader::IMPORTANCE)
?: $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_PRIORITY); ?: $oHeaders->ValueByName(MimeHeader::X_PRIORITY);
if (\strlen($sPriority)) { if (\strlen($sPriority)) {
switch (\substr(\trim($sPriority), 0, 1)) switch (\substr(\trim($sPriority), 0, 1))
{ {
@ -217,16 +218,16 @@ class Message implements \JsonSerializable
} }
// Delivery Receipt // Delivery Receipt
$oMessage->sDeliveryReceipt = \trim($oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::RETURN_RECEIPT_TO)); $oMessage->sDeliveryReceipt = \trim($oHeaders->ValueByName(MimeHeader::RETURN_RECEIPT_TO));
// Read Receipt // Read Receipt
$oMessage->ReadReceipt = \trim($oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::DISPOSITION_NOTIFICATION_TO)); $oMessage->ReadReceipt = \trim($oHeaders->ValueByName(MimeHeader::DISPOSITION_NOTIFICATION_TO));
if (empty($oMessage->ReadReceipt)) { if (empty($oMessage->ReadReceipt)) {
$oMessage->ReadReceipt = \trim($oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_CONFIRM_READING_TO)); $oMessage->ReadReceipt = \trim($oHeaders->ValueByName(MimeHeader::X_CONFIRM_READING_TO));
} }
// Unsubscribe links // Unsubscribe links
$UnsubsribeLinks = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::LIST_UNSUBSCRIBE); $UnsubsribeLinks = $oHeaders->ValueByName(MimeHeader::LIST_UNSUBSCRIBE);
if ($UnsubsribeLinks) { if ($UnsubsribeLinks) {
$oMessage->UnsubsribeLinks = \array_map( $oMessage->UnsubsribeLinks = \array_map(
function ($link) { function ($link) {
@ -236,7 +237,7 @@ class Message implements \JsonSerializable
); );
} }
if ($spam = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_SPAMD_RESULT)) { if ($spam = $oHeaders->ValueByName(MimeHeader::X_SPAMD_RESULT)) {
if (\preg_match('/\\[([\\d\\.-]+)\\s*\\/\\s*([\\d\\.]+)\\];/', $spam, $match)) { if (\preg_match('/\\[([\\d\\.-]+)\\s*\\/\\s*([\\d\\.]+)\\];/', $spam, $match)) {
if ($threshold = \floatval($match[2])) { if ($threshold = \floatval($match[2])) {
$oMessage->setSpamScore(100 * \floatval($match[1]) / $threshold); $oMessage->setSpamScore(100 * \floatval($match[1]) / $threshold);
@ -244,13 +245,13 @@ class Message implements \JsonSerializable
} }
} }
$oMessage->bIsSpam = false !== \stripos($oMessage->sSubject, '*** SPAM ***'); $oMessage->bIsSpam = false !== \stripos($oMessage->sSubject, '*** SPAM ***');
} else if ($spam = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_BOGOSITY)) { } else if ($spam = $oHeaders->ValueByName(MimeHeader::X_BOGOSITY)) {
$oMessage->sSpamResult = $spam; $oMessage->sSpamResult = $spam;
$oMessage->bIsSpam = !\str_contains($spam, 'Ham'); $oMessage->bIsSpam = !\str_contains($spam, 'Ham');
if (\preg_match('/spamicity=([\\d\\.]+)/', $spam, $spamicity)) { if (\preg_match('/spamicity=([\\d\\.]+)/', $spam, $spamicity)) {
$oMessage->setSpamScore(100 * \floatval($spamicity[1])); $oMessage->setSpamScore(100 * \floatval($spamicity[1]));
} }
} else if ($spam = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_SPAM_STATUS)) { } else if ($spam = $oHeaders->ValueByName(MimeHeader::X_SPAM_STATUS)) {
$oMessage->sSpamResult = $spam; $oMessage->sSpamResult = $spam;
if (\preg_match('/(?:hits|score)=([\\d\\.-]+)/', $spam, $value) if (\preg_match('/(?:hits|score)=([\\d\\.-]+)/', $spam, $value)
&& \preg_match('/required=([\\d\\.-]+)/', $spam, $required)) { && \preg_match('/required=([\\d\\.-]+)/', $spam, $required)) {
@ -259,26 +260,33 @@ class Message implements \JsonSerializable
$oMessage->sSpamResult = "{$value[1]} / {$required[1]}"; $oMessage->sSpamResult = "{$value[1]} / {$required[1]}";
} }
} }
$oMessage->bIsSpam = 'Yes' === \substr($spam, 0, 3); // https://github.com/the-djmaze/snappymail/issues/1228
// $spam = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_SPAM_FLAG); else if (\preg_match('@([\\d\\.]+)/([\\d\\.]+)@', $spam, $value)
// $oMessage->bIsSpam = false !== \stripos($spam, 'YES'); || \preg_match('@([\\d\\.]+)/([\\d\\.]+)@', $oHeaders->ValueByName(MimeHeader::X_SPAM_INFO), $value)
) {
$oMessage->sSpamResult = "{$value[1]} / {$value[2]}";
$oMessage->setSpamScore(100 * \floatval($value[1]) / \floatval($value[2]));
}
$oMessage->bIsSpam = 'Yes' === \substr($spam, 0, 3)
|| false !== \stripos($oHeaders->ValueByName(MimeHeader::X_SPAM_FLAG), 'YES');
} }
if ($virus = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_VIRUS)) { if ($virus = $oHeaders->ValueByName(MimeHeader::X_VIRUS)) {
$oMessage->bHasVirus = true; $oMessage->bHasVirus = true;
} }
if ($virus = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_VIRUS_STATUS)) { if ($virus = $oHeaders->ValueByName(MimeHeader::X_VIRUS_STATUS)) {
if (false !== \stripos($spam, 'infected')) { if (false !== \stripos($spam, 'infected')) {
$oMessage->bHasVirus = true; $oMessage->bHasVirus = true;
} else if (false !== \stripos($spam, 'clean')) { } else if (false !== \stripos($spam, 'clean')) {
$oMessage->bHasVirus = false; $oMessage->bHasVirus = false;
} }
} }
if ($virus = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_VIRUS_SCANNED)) { if ($virus = $oHeaders->ValueByName(MimeHeader::X_VIRUS_SCANNED)) {
$oMessage->sVirusScanned = $virus; $oMessage->sVirusScanned = $virus;
} }
$sDraftInfo = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_DRAFT_INFO); $sDraftInfo = $oHeaders->ValueByName(MimeHeader::X_DRAFT_INFO);
if (\strlen($sDraftInfo)) { if (\strlen($sDraftInfo)) {
$sType = ''; $sType = '';
$sFolder = ''; $sFolder = '';
@ -320,7 +328,7 @@ class Message implements \JsonSerializable
} }
} }
$oMessage->sAutocrypt = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::AUTOCRYPT); $oMessage->sAutocrypt = $oHeaders->ValueByName(MimeHeader::AUTOCRYPT);
} }
else if ($oFetchResponse->GetEnvelope()) else if ($oFetchResponse->GetEnvelope())
{ {
@ -360,7 +368,7 @@ class Message implements \JsonSerializable
// /?/Raw/&q[]=/0/View/&q[]=/... // /?/Raw/&q[]=/0/View/&q[]=/...
'bodyPartId' => $oPart->SubParts()[0]->PartID(), 'bodyPartId' => $oPart->SubParts()[0]->PartID(),
'sigPartId' => $oPgpSignaturePart->PartID(), 'sigPartId' => $oPgpSignaturePart->PartID(),
'micAlg' => $oHeaders ? (string) $oHeaders->ParameterValue(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE, 'micalg') : '' 'micAlg' => $oHeaders ? (string) $oHeaders->ParameterValue(MimeHeader::CONTENT_TYPE, 'micalg') : ''
]; ];
/* /*
// An empty section specification refers to the entire message, including the header. // An empty section specification refers to the entire message, including the header.

View file

@ -60,6 +60,7 @@ abstract class Header
X_SPAM_STATUS = 'X-Spam-Status', // Yes|No X_SPAM_STATUS = 'X-Spam-Status', // Yes|No
X_SPAM_BAR = 'X-Spam-Bar', // ++ | -- X_SPAM_BAR = 'X-Spam-Bar', // ++ | --
X_SPAM_REPORT = 'X-Spam-Report', X_SPAM_REPORT = 'X-Spam-Report',
X_SPAM_INFO = 'X-Spam-Info', // v4.0.0
// Rspamd // Rspamd
X_SPAMD_RESULT = 'X-Spamd-Result', // default: False [7.13 / 9.00], X_SPAMD_RESULT = 'X-Spamd-Result', // default: False [7.13 / 9.00],
X_SPAMD_BAR = 'X-Spamd-Bar', // +++++++ X_SPAMD_BAR = 'X-Spamd-Bar', // +++++++