mirror of
https://github.com/the-djmaze/snappymail.git
synced 2024-09-20 15:45:55 +08:00
Resolve #1228
This commit is contained in:
parent
f6ef6d45ff
commit
83456164c7
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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', // +++++++
|
||||||
|
|
Loading…
Reference in a new issue