forked from extern/egroupware
fix charset/transfer encoding issue when sending plain ascii mails but adding utf-8 signature
This commit is contained in:
parent
7a8f36171a
commit
2bf5a61361
@ -6959,13 +6959,20 @@ class Mail
|
||||
*
|
||||
* @param Mailer $mailer instance of SMTP Mailer object
|
||||
* @param string|ressource|Horde_Mime_Part $message string or resource containing the RawMessage / object Mail_mimeDecoded message (part))
|
||||
* @param boolean $force8bitOnPrimaryPart (default false. force transferEncoding and charset to 8bit/utf8 if we have a textpart as primaryPart)
|
||||
* @throws Exception\WrongParameter when the required Horde_Mail_Part not found
|
||||
*/
|
||||
function parseRawMessageIntoMailObject(Mailer $mailer, $message)
|
||||
function parseRawMessageIntoMailObject(Mailer $mailer, $message, $force8bitOnPrimaryPart=false)
|
||||
{
|
||||
if (is_string($message) || is_resource($message))
|
||||
{
|
||||
$structure = Horde_Mime_Part::parseMessage($message);
|
||||
//error_log(__METHOD__.__LINE__.'#'.$structure->getPrimaryType().'#');
|
||||
if ($force8bitOnPrimaryPart&&$structure->getPrimaryType()=='text')
|
||||
{
|
||||
$structure->setTransferEncoding('8bit');
|
||||
$structure->setCharset('utf-8');
|
||||
}
|
||||
$mailer->setBasePart($structure);
|
||||
//error_log(__METHOD__.__LINE__.':'.array2string($structure));
|
||||
|
||||
|
@ -2977,6 +2977,12 @@ $filter['before']= date("d-M-Y", $cutoffdate2);
|
||||
$singleBodyPart['body'] = preg_replace($sar,$rar,$singleBodyPart['body']);
|
||||
}
|
||||
//error_log(__METHOD__.__LINE__.'reports:'.$singleBodyPart['charSet']);
|
||||
if ($singleBodyPart['charSet']=='us-ascii')
|
||||
{
|
||||
$orgCharSet=$singleBodyPart['charSet'];
|
||||
$singleBodyPart['charSet'] = Api\Translation::detect_encoding($singleBodyPart['body']);
|
||||
error_log(__METHOD__.__LINE__.'reports:'.$orgCharSet.' but seems to be:'.$singleBodyPart['charSet']);
|
||||
}
|
||||
$singleBodyPart['body'] = Api\Translation::convert_jsonsafe($singleBodyPart['body'],$singleBodyPart['charSet']);
|
||||
//error_log(__METHOD__.__LINE__.array2string($singleBodyPart));
|
||||
if($singleBodyPart['mimeType'] == 'text/plain')
|
||||
|
@ -390,10 +390,38 @@ class mail_zpush implements activesync_plugin_write, activesync_plugin_sendmail,
|
||||
$activeMailProfile = Mail::getStandardIdentityForProfile($activeMailProfiles,self::$profileID);
|
||||
|
||||
ZLog::Write(LOGLEVEL_DEBUG,__METHOD__."(".__LINE__.")".' ProfileID:'.self::$profileID.' ActiveMailProfile:'.array2string($activeMailProfile));
|
||||
// collect identity / signature for later usage, and to determine if we may have to manipulate TransferEncoding and Charset
|
||||
try
|
||||
{
|
||||
$acc = Mail\Account::read($this->mail->icServer->ImapServerId);
|
||||
//error_log(__METHOD__.__LINE__.array2string($acc));
|
||||
$_signature = Mail\Account::read_identity($acc['ident_id'],true);
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
$_signature=array();
|
||||
}
|
||||
$signature = $_signature['ident_signature'];
|
||||
if ((isset($preferencesArray['disableRulerForSignatureSeparation']) &&
|
||||
$preferencesArray['disableRulerForSignatureSeparation']) ||
|
||||
empty($signature) || trim(Api\Mail\Html::convertHTMLToText($signature)) =='')
|
||||
{
|
||||
$disableRuler = true;
|
||||
}
|
||||
$beforePlain = $beforeHtml = "";
|
||||
$beforeHtml = ($disableRuler ?' <br>':' <br><hr style="border:dotted 1px silver; width:90%; border:dotted 1px silver;">');
|
||||
$beforePlain = ($disableRuler ?"\r\n\r\n":"\r\n\r\n-- \r\n");
|
||||
$sigText = Mail::merge($signature,array($GLOBALS['egw']->accounts->id2name($GLOBALS['egw_info']['user']['account_id'],'person_id')));
|
||||
if ($this->debugLevel>0) ZLog::Write(LOGLEVEL_DEBUG,__METHOD__.__LINE__.' Signature to use:'.$sigText);
|
||||
$sigTextHtml = $beforeHtml.$sigText;
|
||||
$sigTextPlain = $beforePlain.Api\Mail\Html::convertHTMLToText($sigText);
|
||||
|
||||
$force8bit=false;
|
||||
if (Api\Translation::detect_encoding($sigTextPlain)!='ascii') $force8bit=true;
|
||||
// initialize the new Api\Mailer object for sending
|
||||
$mailObject = new Api\Mailer(self::$profileID);
|
||||
$this->mail->parseRawMessageIntoMailObject($mailObject,$smartdata->mime);
|
||||
|
||||
$this->mail->parseRawMessageIntoMailObject($mailObject,$smartdata->mime,$force8bit);
|
||||
// Horde SMTP Class uses utf-8 by default. as we set charset always to utf-8
|
||||
$mailObject->Sender = $activeMailProfile['ident_email'];
|
||||
$mailObject->setFrom($activeMailProfile['ident_email'],Mail::generateIdentityString($activeMailProfile,false));
|
||||
@ -544,32 +572,7 @@ class mail_zpush implements activesync_plugin_write, activesync_plugin_sendmail,
|
||||
$body = str_replace("\r",((preg_match("^text/html^i", $ContentType))?'<br>':""),$body); // what is this for?
|
||||
if ($this->debugLevel>2) ZLog::Write(LOGLEVEL_DEBUG,__METHOD__.__LINE__.' retrieved Body (modified):'.$body);
|
||||
*/
|
||||
// add signature!! -----------------------------------------------------------------
|
||||
ZLog::Write(LOGLEVEL_DEBUG,__METHOD__.__LINE__.' ActiveMailProfile:'.array2string($activeMailProfile));
|
||||
try
|
||||
{
|
||||
$acc = Mail\Account::read($this->mail->icServer->ImapServerId);
|
||||
//error_log(__METHOD__.__LINE__.array2string($acc));
|
||||
$_signature = Mail\Account::read_identity($acc['ident_id'],true);
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
$_signature=array();
|
||||
}
|
||||
$signature = $_signature['ident_signature'];
|
||||
if ((isset($preferencesArray['disableRulerForSignatureSeparation']) &&
|
||||
$preferencesArray['disableRulerForSignatureSeparation']) ||
|
||||
empty($signature) || trim(Api\Mail\Html::convertHTMLToText($signature)) =='')
|
||||
{
|
||||
$disableRuler = true;
|
||||
}
|
||||
$beforePlain = $beforeHtml = "";
|
||||
$beforeHtml = ($disableRuler ?' <br>':' <br><hr style="border:dotted 1px silver; width:90%; border:dotted 1px silver;">');
|
||||
$beforePlain = ($disableRuler ?"\r\n\r\n":"\r\n\r\n-- \r\n");
|
||||
$sigText = Mail::merge($signature,array($GLOBALS['egw']->accounts->id2name($GLOBALS['egw_info']['user']['account_id'],'person_id')));
|
||||
if ($this->debugLevel>0) ZLog::Write(LOGLEVEL_DEBUG,__METHOD__.__LINE__.' Signature to use:'.$sigText);
|
||||
$sigTextHtml = $beforeHtml.$sigText;
|
||||
$sigTextPlain = $beforePlain.Api\Mail\Html::convertHTMLToText($sigText);
|
||||
// actually use prepared signature --------------------collected earlier--------------------------
|
||||
$isreply = $isforward = false;
|
||||
// reply ---------------------------------------------------------------------------
|
||||
if ($smartdata_task == 'reply' && isset($smartdata->source->itemid) &&
|
||||
@ -701,18 +704,21 @@ class mail_zpush implements activesync_plugin_write, activesync_plugin_sendmail,
|
||||
// add signature, in case its not already added in forward or reply
|
||||
if (!$isreply && !$isforward)
|
||||
{
|
||||
$Body = $Body.$sigTextPlain;
|
||||
$AltBody = $AltBody.$sigTextHtml;
|
||||
//error_log(__METHOD__.__LINE__.'adding Signature');
|
||||
$Body = $Body.$sigTextPlain;
|
||||
$AltBody = $AltBody.$sigTextHtml;
|
||||
}
|
||||
// now set the body
|
||||
if ($AltBody && ($html_body = $mailObject->findBody('html')))
|
||||
{
|
||||
if ($this->debugLevel>1) ZLog::Write(LOGLEVEL_DEBUG,__METHOD__.__LINE__.' -> '.$AltBody);
|
||||
//error_log(__METHOD__.__LINE__.' html:'.$AltBody);
|
||||
$html_body->setContents($AltBody,array('encoding'=>Horde_Mime_Part::DEFAULT_ENCODING));
|
||||
}
|
||||
if ($Body && ($text_body = $mailObject->findBody('plain')))
|
||||
{
|
||||
if ($this->debugLevel>1) ZLog::Write(LOGLEVEL_DEBUG,__METHOD__.__LINE__.' -> '.$Body);
|
||||
//error_log(__METHOD__.__LINE__.' text:'.$Body);
|
||||
$text_body->setContents($Body,array('encoding'=>Horde_Mime_Part::DEFAULT_ENCODING));
|
||||
}
|
||||
//advanced debugging
|
||||
|
Loading…
Reference in New Issue
Block a user