diff --git a/.travis.yml b/.travis.yml index 605785e7..d93f0eea 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,12 +10,15 @@ matrix: allow_failures: - php: hhvm -script: vendor/bin/tester tests -s -c tests/php-unix.ini +script: + - vendor/bin/tester tests -s + - php code-checker/src/code-checker.php -d src after_failure: # Print *.actual content - for i in $(find tests -name \*.actual); do echo "--- $i"; cat $i; echo; echo; done before_script: - # Install Nette Tester + # Install Nette Tester & Code Checker - composer install --no-interaction --dev --prefer-source + - composer create-project nette/code-checker code-checker ~2.2 --no-interaction --prefer-source diff --git a/src/Mail/Message.php b/src/Mail/Message.php index 086515d7..8e405e9e 100644 --- a/src/Mail/Message.php +++ b/src/Mail/Message.php @@ -235,7 +235,7 @@ public function setHtmlBody($html, $basePath = NULL) PREG_OFFSET_CAPTURE ); foreach (array_reverse($matches) as $m) { - $file = rtrim($basePath, '/\\') . '/' . $m[3][0]; + $file = rtrim($basePath, '/\\') . '/' . urldecode($m[3][0]); if (!isset($cids[$file])) { $cids[$file] = substr($this->addEmbeddedFile($file)->getHeader('Content-ID'), 1, -1); } diff --git a/src/Mail/MimePart.php b/src/Mail/MimePart.php index e6753509..d4400255 100644 --- a/src/Mail/MimePart.php +++ b/src/Mail/MimePart.php @@ -129,25 +129,19 @@ public function getEncodedHeader($name) $s = ''; foreach ($this->headers[$name] as $email => $name) { if ($name != NULL) { // intentionally == - $s .= self::encodeHeader($name, $offset, strpbrk($name, '.,;<@>()[]"=?')); + $s .= self::encodeHeader($name, $offset, TRUE); $email = " <$email>"; } - $email .= ','; - if ($s !== '' && $offset + strlen($email) > self::LINE_LENGTH) { - $s .= self::EOL . "\t"; - $offset = 1; - } - $s .= $email; - $offset += strlen($email); + $s .= self::append($email . ',', $offset); } - return substr($s, 0, -1); // last comma + return ltrim(substr($s, 0, -1)); // last comma } elseif (preg_match('#^(\S+; (?:file)?name=)"(.*)"\z#', $this->headers[$name], $m)) { // Content-Disposition $offset += strlen($m[1]); return $m[1] . '"' . self::encodeHeader($m[2], $offset) . '"'; } else { - return self::encodeHeader($this->headers[$name], $offset); + return ltrim(self::encodeHeader($this->headers[$name], $offset)); } } @@ -303,29 +297,41 @@ public function getEncodedMessage() * @param bool * @return string */ - private static function encodeHeader($s, & $offset = 0, $force = FALSE) + private static function encodeHeader($s, & $offset = 0, $quotes = FALSE) { + if (strspn($s, "!\"#$%&\'()*+,-./0123456789:;<>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^`abcdefghijklmnopqrstuvwxyz{|}~=? _\r\n\t") === strlen($s)) { + if ($quotes && preg_match('#[^ a-zA-Z0-9!\#$%&\'*+/?^_`{|}~-]#', $s)) { // RFC 2822 atext except = + return self::append('"' . addcslashes($s, '"\\') . '"', $offset); + } + return self::append($s, $offset); + } + $o = ''; if ($offset >= 55) { // maximum for iconv_mime_encode $o = self::EOL . "\t"; $offset = 1; } - if (!$force && strspn($s, "!\"#$%&\'()*+,-./0123456789:;<>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^`abcdefghijklmnopqrstuvwxyz{|}=? _\r\n\t") === strlen($s) - && ($offset + strlen($s) <= self::LINE_LENGTH) - ) { - $offset += strlen($s); - return $o . $s; - } - - $o .= str_replace("\n ", "\n\t", substr(iconv_mime_encode(str_repeat(' ', $offset), $s, array( + $s = iconv_mime_encode(str_repeat(' ', $old = $offset), $s, array( 'scheme' => 'B', // Q is broken 'input-charset' => 'UTF-8', 'output-charset' => 'UTF-8', - )), $offset + 2)); + )); - $offset = strlen($o) - strrpos($o, "\n"); - return $o; + $offset = strlen($s) - strrpos($s, "\n"); + $s = str_replace("\n ", "\n\t", substr($s, $old + 2)); // adds ': ' + return $o . $s; + } + + + private static function append($s, & $offset = 0) + { + if ($offset + strlen($s) > self::LINE_LENGTH) { + $offset = 1; + $s = self::EOL . "\t" . $s; + } + $offset += strlen($s); + return $s; } } diff --git a/src/Mail/SendmailMailer.php b/src/Mail/SendmailMailer.php index 0c21b469..ecaa7cf1 100644 --- a/src/Mail/SendmailMailer.php +++ b/src/Mail/SendmailMailer.php @@ -42,11 +42,9 @@ public function send(Message $mail) if ($this->commandArgs) { $args[] = (string) $this->commandArgs; } - set_error_handler(function($severity, $message) use (& $info) { + $res = Nette\Utils\Callback::invokeSafe('mail', $args, function($message) use (& $info) { $info = ": $message"; }); - $res = call_user_func_array('mail', $args); - restore_error_handler(); if ($res === FALSE) { throw new Nette\InvalidStateException("Unable to send email$info."); } diff --git a/tests/Mail/Mail.email.long.phpt b/tests/Mail/Mail.email.long.phpt index 2fb7d886..f69e4fcc 100644 --- a/tests/Mail/Mail.email.long.phpt +++ b/tests/Mail/Mail.email.long.phpt @@ -31,9 +31,7 @@ Date: %a% To: veryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylongemail@example.com Cc: John Doe -Bcc: =?UTF-8?B?dmVyeXZlcnl2ZXJ5dmVyeXZlcnl2ZXJ5dmVyeXZlcnl2ZXJ5dmU=?= - =?UTF-8?B?cnl2ZXJ5dmVyeXZlcnl2ZXJ5dmVyeXZlcnl2ZXJ5dmVyeXZlcnl2ZXI=?= - =?UTF-8?B?eXZlcnl2ZXJ5dmVyeXZlcnlsb25nIG5hbWU=?= +Bcc: veryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong name Message-ID: <%a%@%a%> Content-Type: text/plain; charset=UTF-8 diff --git a/tests/Mail/Mail.email.phpt b/tests/Mail/Mail.email.phpt index 32efe8c6..75ebc2a4 100644 --- a/tests/Mail/Mail.email.phpt +++ b/tests/Mail/Mail.email.phpt @@ -25,6 +25,7 @@ $mail->addTo('doe3@example.com', "John 'jd' Doe"); $mail->addCc('The\Mail '); $mail->addCc('doe4@example.com', 'John Doe'); +$mail->addCc('The.Mail '); $mail->addBcc('Žluťoučký kůň '); $mail->addBcc('doe5@example.com'); @@ -43,7 +44,8 @@ Reply-To: =?UTF-8?B?xb1sdcWlb3XEjWvDvSBrxa/FiA==?= , John Doe To: =?UTF-8?B?xb1sdcWlb3XEjWvDvSAia8WvxYgi?= , John 'jd' Doe -Cc: The\Mail ,John Doe +Cc: "The\\Mail" ,John Doe ,"The.Mail" + Bcc: =?UTF-8?B?xb1sdcWlb3XEjWvDvSBrxa/FiA==?= , doe5@example.com Return-Path: doe@example.com diff --git a/tests/Mail/Mail.subject.phpt b/tests/Mail/Mail.subject.phpt index 0ff6205d..89780a80 100644 --- a/tests/Mail/Mail.subject.phpt +++ b/tests/Mail/Mail.subject.phpt @@ -36,9 +36,7 @@ $mailer->send($mail); Assert::match( 'MIME-Version: 1.0 X-Mailer: Nette Framework Date: %a% -Subject: =?UTF-8?B?dmVyeXZlcnl2ZXJ5dmVyeXZlcnl2ZXJ5dmVyeXZlcnl2ZXI=?= - =?UTF-8?B?eXZlcnl2ZXJ5dmVyeXZlcnl2ZXJ5dmVyeXZlcnl2ZXJ5dmVyeXZlcnk=?= - =?UTF-8?B?dmVyeXZlcnl2ZXJ5dmVyeXZlcnlsb25nZW1haWw=?= +Subject: veryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylongemail Message-ID: <%S%@%S%> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit diff --git a/tests/Mail/Mail.textualAndHtmlBody.embedded.phpt b/tests/Mail/Mail.textualAndHtmlBody.embedded.phpt index 47fb284d..190f43aa 100644 --- a/tests/Mail/Mail.textualAndHtmlBody.embedded.phpt +++ b/tests/Mail/Mail.textualAndHtmlBody.embedded.phpt @@ -21,7 +21,7 @@ $mail->setSubject('Hello Jane!'); $mail->setBody('Sample text'); -$mail->setHTMLBody('Sample text ', __DIR__ . '/files'); +$mail->setHTMLBody('Sample text ', __DIR__ . '/files'); // append automatically $mail->addEmbeddedFile('files/background.png'); $mailer = new TestMailer(); diff --git a/tests/php-unix.ini b/tests/php-unix.ini deleted file mode 100644 index 27f8a415..00000000 --- a/tests/php-unix.ini +++ /dev/null @@ -1,4 +0,0 @@ -[PHP] - -[Zend] -;zend_extension="./ext/zend_extension" diff --git a/tests/php-win.ini b/tests/php-win.ini index 5839751f..4b044eda 100644 --- a/tests/php-win.ini +++ b/tests/php-win.ini @@ -1,5 +1,6 @@ [PHP] extension_dir = "./ext" +extension=php_fileinfo.dll [Zend] ;zend_extension="./ext/php_xdebug-2.0.5-5.3-vc6.dll"