Push changes to frontend
This commit is contained in:
@@ -1 +0,0 @@
|
||||
../gettext/languages/bin/export-plural-rules
|
||||
4
core/lib/composer/vendor/bin/export-plural-rules
vendored
Executable file
4
core/lib/composer/vendor/bin/export-plural-rules
vendored
Executable file
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
include 'export-plural-rules.php';
|
||||
@@ -1 +0,0 @@
|
||||
../gettext/languages/bin/export-plural-rules.php
|
||||
234
core/lib/composer/vendor/bin/export-plural-rules.php
vendored
Executable file
234
core/lib/composer/vendor/bin/export-plural-rules.php
vendored
Executable file
@@ -0,0 +1,234 @@
|
||||
<?php
|
||||
use Gettext\Languages\Exporter\Exporter;
|
||||
use Gettext\Languages\Language;
|
||||
|
||||
// Let's start by imposing that we don't accept any error or warning.
|
||||
// This is a really life-saving approach.
|
||||
error_reporting(E_ALL);
|
||||
set_error_handler(function ($errno, $errstr, $errfile, $errline) {
|
||||
Enviro::echoErr("$errstr\nFile: $errfile\nLine: $errline\nCode: $errno\n");
|
||||
die(5);
|
||||
});
|
||||
|
||||
require_once dirname(__DIR__).'/src/autoloader.php';
|
||||
|
||||
// Parse the command line options
|
||||
Enviro::initialize();
|
||||
|
||||
try {
|
||||
if (isset(Enviro::$languages)) {
|
||||
$languages = array();
|
||||
foreach (Enviro::$languages as $languageId) {
|
||||
$language = Language::getById($languageId);
|
||||
if (!isset($language)) {
|
||||
throw new Exception("Unable to find the language with id '$languageId'");
|
||||
}
|
||||
$languages[] = $language;
|
||||
}
|
||||
} else {
|
||||
$languages = Language::getAll();
|
||||
}
|
||||
if (Enviro::$reduce) {
|
||||
$languages = Enviro::reduce($languages);
|
||||
}
|
||||
if (isset(Enviro::$outputFilename)) {
|
||||
echo call_user_func(array(Exporter::getExporterClassName(Enviro::$outputFormat), 'toFile'), $languages, Enviro::$outputFilename, array('us-ascii' => Enviro::$outputUSAscii));
|
||||
} else {
|
||||
echo call_user_func(array(Exporter::getExporterClassName(Enviro::$outputFormat), 'toString'), $languages, array('us-ascii' => Enviro::$outputUSAscii));
|
||||
}
|
||||
} catch (Exception $x) {
|
||||
Enviro::echoErr($x->getMessage()."\n");
|
||||
Enviro::echoErr("Trace:\n");
|
||||
Enviro::echoErr($x->getTraceAsString()."\n");
|
||||
die(4);
|
||||
}
|
||||
|
||||
die(0);
|
||||
|
||||
/**
|
||||
* Helper class to handle command line options.
|
||||
*/
|
||||
class Enviro
|
||||
{
|
||||
/**
|
||||
* Shall the output contain only US-ASCII characters?
|
||||
* @var bool
|
||||
*/
|
||||
public static $outputUSAscii;
|
||||
/**
|
||||
* The output format.
|
||||
* @var string
|
||||
*/
|
||||
public static $outputFormat;
|
||||
/**
|
||||
* Output file name.
|
||||
* @var string
|
||||
*/
|
||||
public static $outputFilename;
|
||||
/**
|
||||
* List of wanted language IDs; it not set: all languages will be returned.
|
||||
* @var array|null
|
||||
*/
|
||||
public static $languages;
|
||||
/**
|
||||
* Reduce the language list to the minimum common denominator.
|
||||
* @var bool
|
||||
*/
|
||||
public static $reduce;
|
||||
/**
|
||||
* Parse the command line options.
|
||||
*/
|
||||
public static function initialize()
|
||||
{
|
||||
global $argv;
|
||||
self::$outputUSAscii = false;
|
||||
self::$outputFormat = null;
|
||||
self::$outputFilename = null;
|
||||
self::$languages = null;
|
||||
self::$reduce = null;
|
||||
$exporters = Exporter::getExporters();
|
||||
if (isset($argv) && is_array($argv)) {
|
||||
foreach ($argv as $argi => $arg) {
|
||||
if ($argi === 0) {
|
||||
continue;
|
||||
}
|
||||
if (is_string($arg)) {
|
||||
$argLC = trim(strtolower($arg));
|
||||
switch ($argLC) {
|
||||
case '--us-ascii':
|
||||
self::$outputUSAscii = true;
|
||||
break;
|
||||
case '--reduce=yes':
|
||||
self::$reduce = true;
|
||||
break;
|
||||
case '--reduce=no':
|
||||
self::$reduce = false;
|
||||
break;
|
||||
default:
|
||||
if (preg_match('/^--output=.+$/', $argLC)) {
|
||||
if (isset(self::$outputFilename)) {
|
||||
self::echoErr("The output file name has been specified more than once!\n");
|
||||
self::showSyntax();
|
||||
die(3);
|
||||
}
|
||||
list(, self::$outputFilename) = explode('=', $arg, 2);
|
||||
self::$outputFilename = trim(self::$outputFilename);
|
||||
} elseif (preg_match('/^--languages?=.+$/', $argLC)) {
|
||||
list(, $s) = explode('=', $arg, 2);
|
||||
$list = explode(',', $s);
|
||||
if (is_array(self::$languages)) {
|
||||
self::$languages = array_merge(self::$languages, $list);
|
||||
} else {
|
||||
self::$languages = $list;
|
||||
}
|
||||
} elseif (isset($exporters[$argLC])) {
|
||||
if (isset(self::$outputFormat)) {
|
||||
self::echoErr("The output format has been specified more than once!\n");
|
||||
self::showSyntax();
|
||||
die(3);
|
||||
}
|
||||
self::$outputFormat = $argLC;
|
||||
} else {
|
||||
self::echoErr("Unknown option: $arg\n");
|
||||
self::showSyntax();
|
||||
die(2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!isset(self::$outputFormat)) {
|
||||
self::showSyntax();
|
||||
die(1);
|
||||
}
|
||||
if (isset(self::$languages)) {
|
||||
self::$languages = array_values(array_unique(self::$languages));
|
||||
}
|
||||
if (!isset(self::$reduce)) {
|
||||
self::$reduce = isset(self::$languages) ? false : true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Write out the syntax.
|
||||
*/
|
||||
public static function showSyntax()
|
||||
{
|
||||
$exporters = array_keys(Exporter::getExporters(true));
|
||||
self::echoErr("Syntax: php ".basename(__FILE__)." [--us-ascii] [--languages=<LanguageId>[,<LanguageId>,...]] [--reduce=yes|no] [--output=<file name>] <".implode('|', $exporters).">\n");
|
||||
self::echoErr("Where:\n");
|
||||
self::echoErr("--us-ascii : if specified, the output will contain only US-ASCII characters.\n");
|
||||
self::echoErr("--languages: (or --language) export only the specified language codes.\n");
|
||||
self::echoErr(" Separate languages with commas; you can also use this argument\n");
|
||||
self::echoErr(" more than once; it's case insensitive and accepts both '_' and\n");
|
||||
self::echoErr(" '-' as locale chunks separator (eg we accept 'it_IT' as well as\n");
|
||||
self::echoErr(" 'it-it').\n");
|
||||
self::echoErr("--reduce : if set to yes the output won't contain languages with the same\n");
|
||||
self::echoErr(" base language and rules.\n For instance nl_BE ('Flemish') will be\n");
|
||||
self::echoErr(" omitted because it's the same as nl ('Dutch').\n");
|
||||
self::echoErr(" Defaults to 'no' --languages is specified, to 'yes' otherwise.\n");
|
||||
self::echoErr("--output : if specified, the output will be saved to <file name>. If not\n");
|
||||
self::echoErr(" specified we'll output to standard output.\n");
|
||||
self::echoErr("Output formats\n");
|
||||
$len = max(array_map('strlen', $exporters));
|
||||
foreach ($exporters as $exporter) {
|
||||
self::echoErr(str_pad($exporter, $len).": ".Exporter::getExporterDescription($exporter)."\n");
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Print a string to stderr.
|
||||
* @param string $str The string to be printed out.
|
||||
*/
|
||||
public static function echoErr($str)
|
||||
{
|
||||
$hStdErr = @fopen('php://stderr', 'a');
|
||||
if ($hStdErr === false) {
|
||||
echo $str;
|
||||
} else {
|
||||
fwrite($hStdErr, $str);
|
||||
fclose($hStdErr);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Reduce a language list to the minimum common denominator.
|
||||
* @param Language[] $languages
|
||||
* @return Language[]
|
||||
*/
|
||||
public static function reduce($languages)
|
||||
{
|
||||
for ($numChunks = 3; $numChunks >= 2; $numChunks--) {
|
||||
$filtered = array();
|
||||
foreach ($languages as $language) {
|
||||
$chunks = explode('_', $language->id);
|
||||
$compatibleFound = false;
|
||||
if (count($chunks) === $numChunks) {
|
||||
$categoriesHash = serialize($language->categories);
|
||||
$otherIds = array();
|
||||
$otherIds[] = $chunks[0];
|
||||
for ($k = 2; $k < $numChunks; $k++) {
|
||||
$otherIds[] = $chunks[0].'_'.$chunks[$numChunks - 1];
|
||||
}
|
||||
|
||||
foreach ($languages as $check) {
|
||||
foreach ($otherIds as $otherId) {
|
||||
if (($check->id === $otherId) && ($check->formula === $language->formula) && (serialize($check->categories) === $categoriesHash)) {
|
||||
$compatibleFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ($compatibleFound === true) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!$compatibleFound) {
|
||||
$filtered[] = $language;
|
||||
}
|
||||
}
|
||||
$languages = $filtered;
|
||||
}
|
||||
|
||||
return $languages;
|
||||
}
|
||||
}
|
||||
1
core/lib/composer/vendor/bin/markdown
vendored
1
core/lib/composer/vendor/bin/markdown
vendored
@@ -1 +0,0 @@
|
||||
../cebe/markdown/bin/markdown
|
||||
170
core/lib/composer/vendor/bin/markdown
vendored
Executable file
170
core/lib/composer/vendor/bin/markdown
vendored
Executable file
@@ -0,0 +1,170 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2014 Carsten Brandt
|
||||
* @license https://github.com/cebe/markdown/blob/master/LICENSE
|
||||
* @link https://github.com/cebe/markdown#readme
|
||||
*/
|
||||
|
||||
$composerAutoload = [
|
||||
__DIR__ . '/../vendor/autoload.php', // standalone with "composer install" run
|
||||
__DIR__ . '/../../../autoload.php', // script is installed as a composer binary
|
||||
];
|
||||
foreach ($composerAutoload as $autoload) {
|
||||
if (file_exists($autoload)) {
|
||||
require($autoload);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Send all errors to stderr
|
||||
ini_set('display_errors', 'stderr');
|
||||
|
||||
$flavor = 'cebe\\markdown\\Markdown';
|
||||
$flavors = [
|
||||
'gfm' => ['cebe\\markdown\\GithubMarkdown', __DIR__ . '/../GithubMarkdown.php'],
|
||||
'extra' => ['cebe\\markdown\\MarkdownExtra', __DIR__ . '/../MarkdownExtra.php'],
|
||||
];
|
||||
|
||||
$full = false;
|
||||
$src = [];
|
||||
foreach($argv as $k => $arg) {
|
||||
if ($k == 0) {
|
||||
continue;
|
||||
}
|
||||
if ($arg[0] == '-') {
|
||||
$arg = explode('=', $arg);
|
||||
switch($arg[0]) {
|
||||
case '--flavor':
|
||||
if (isset($arg[1])) {
|
||||
if (isset($flavors[$arg[1]])) {
|
||||
require($flavors[$arg[1]][1]);
|
||||
$flavor = $flavors[$arg[1]][0];
|
||||
} else {
|
||||
error("Unknown flavor: " . $arg[1], "usage");
|
||||
}
|
||||
} else {
|
||||
error("Incomplete argument --flavor!", "usage");
|
||||
}
|
||||
break;
|
||||
case '--full':
|
||||
$full = true;
|
||||
break;
|
||||
case '-h':
|
||||
case '--help':
|
||||
echo "PHP Markdown to HTML converter\n";
|
||||
echo "------------------------------\n\n";
|
||||
echo "by Carsten Brandt <mail@cebe.cc>\n\n";
|
||||
usage();
|
||||
break;
|
||||
default:
|
||||
error("Unknown argument " . $arg[0], "usage");
|
||||
}
|
||||
} else {
|
||||
$src[] = $arg;
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($src)) {
|
||||
$markdown = file_get_contents("php://stdin");
|
||||
} elseif (count($src) == 1) {
|
||||
$file = reset($src);
|
||||
if (!file_exists($file)) {
|
||||
error("File does not exist:" . $file);
|
||||
}
|
||||
$markdown = file_get_contents($file);
|
||||
} else {
|
||||
error("Converting multiple files is not yet supported.", "usage");
|
||||
}
|
||||
|
||||
/** @var cebe\markdown\Parser $md */
|
||||
$md = new $flavor();
|
||||
$markup = $md->parse($markdown);
|
||||
|
||||
if ($full) {
|
||||
echo <<<HTML
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
||||
"http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<style>
|
||||
body { font-family: Arial, sans-serif; }
|
||||
code { background: #eeeeff; padding: 2px; }
|
||||
li { margin-bottom: 5px; }
|
||||
img { max-width: 1200px; }
|
||||
table, td, th { border: solid 1px #ccc; border-collapse: collapse; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
$markup
|
||||
</body>
|
||||
</html>
|
||||
HTML;
|
||||
} else {
|
||||
echo $markup;
|
||||
}
|
||||
|
||||
// functions
|
||||
|
||||
/**
|
||||
* Display usage information
|
||||
*/
|
||||
function usage() {
|
||||
global $argv;
|
||||
$cmd = $argv[0];
|
||||
echo <<<EOF
|
||||
Usage:
|
||||
$cmd [--flavor=<flavor>] [--full] [file.md]
|
||||
|
||||
--flavor specifies the markdown flavor to use. If omitted the original markdown by John Gruber [1] will be used.
|
||||
Available flavors:
|
||||
|
||||
gfm - Github flavored markdown [2]
|
||||
extra - Markdown Extra [3]
|
||||
|
||||
--full ouput a full HTML page with head and body. If not given, only the parsed markdown will be output.
|
||||
|
||||
--help shows this usage information.
|
||||
|
||||
If no file is specified input will be read from STDIN.
|
||||
|
||||
Examples:
|
||||
|
||||
Render a file with original markdown:
|
||||
|
||||
$cmd README.md > README.html
|
||||
|
||||
Render a file using gihtub flavored markdown:
|
||||
|
||||
$cmd --flavor=gfm README.md > README.html
|
||||
|
||||
Convert the original markdown description to html using STDIN:
|
||||
|
||||
curl http://daringfireball.net/projects/markdown/syntax.text | $cmd > md.html
|
||||
|
||||
|
||||
[1] http://daringfireball.net/projects/markdown/syntax
|
||||
[2] https://help.github.com/articles/github-flavored-markdown
|
||||
[3] http://michelf.ca/projects/php-markdown/extra/
|
||||
|
||||
EOF;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send custom error message to stderr
|
||||
* @param $message string
|
||||
* @param $callback mixed called before script exit
|
||||
* @return void
|
||||
*/
|
||||
function error($message, $callback = null) {
|
||||
$fe = fopen("php://stderr", "w");
|
||||
fwrite($fe, "Error: " . $message . "\n");
|
||||
|
||||
if (is_callable($callback)) {
|
||||
call_user_func($callback);
|
||||
}
|
||||
|
||||
exit(1);
|
||||
}
|
||||
1
core/lib/composer/vendor/bin/phpunit
vendored
1
core/lib/composer/vendor/bin/phpunit
vendored
@@ -1 +0,0 @@
|
||||
../phpunit/phpunit/phpunit
|
||||
53
core/lib/composer/vendor/bin/phpunit
vendored
Executable file
53
core/lib/composer/vendor/bin/phpunit
vendored
Executable file
@@ -0,0 +1,53 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/*
|
||||
* This file is part of PHPUnit.
|
||||
*
|
||||
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
if (version_compare('7.0.0', PHP_VERSION, '>')) {
|
||||
fwrite(
|
||||
STDERR,
|
||||
sprintf(
|
||||
'This version of PHPUnit is supported on PHP 7.0 and PHP 7.1.' . PHP_EOL .
|
||||
'You are using PHP %s (%s).' . PHP_EOL,
|
||||
PHP_VERSION,
|
||||
PHP_BINARY
|
||||
)
|
||||
);
|
||||
|
||||
die(1);
|
||||
}
|
||||
|
||||
if (!ini_get('date.timezone')) {
|
||||
ini_set('date.timezone', 'UTC');
|
||||
}
|
||||
|
||||
foreach (array(__DIR__ . '/../../autoload.php', __DIR__ . '/../vendor/autoload.php', __DIR__ . '/vendor/autoload.php') as $file) {
|
||||
if (file_exists($file)) {
|
||||
define('PHPUNIT_COMPOSER_INSTALL', $file);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
unset($file);
|
||||
|
||||
if (!defined('PHPUNIT_COMPOSER_INSTALL')) {
|
||||
fwrite(
|
||||
STDERR,
|
||||
'You need to set up the project dependencies using Composer:' . PHP_EOL . PHP_EOL .
|
||||
' composer install' . PHP_EOL . PHP_EOL .
|
||||
'You can learn all about Composer on https://getcomposer.org/.' . PHP_EOL
|
||||
);
|
||||
|
||||
die(1);
|
||||
}
|
||||
|
||||
require PHPUNIT_COMPOSER_INSTALL;
|
||||
|
||||
PHPUnit\TextUI\Command::main();
|
||||
1
core/lib/composer/vendor/bin/robo
vendored
1
core/lib/composer/vendor/bin/robo
vendored
@@ -1 +0,0 @@
|
||||
../consolidation/robo/robo
|
||||
22
core/lib/composer/vendor/bin/robo
vendored
Executable file
22
core/lib/composer/vendor/bin/robo
vendored
Executable file
@@ -0,0 +1,22 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
/**
|
||||
* if we're running from phar load the phar autoload,
|
||||
* else let the script 'robo' search for the autoloader
|
||||
*/
|
||||
if (strpos(basename(__FILE__), 'phar')) {
|
||||
require_once 'phar://robo.phar/vendor/autoload.php';
|
||||
} else {
|
||||
if (file_exists(__DIR__.'/vendor/autoload.php')) {
|
||||
require_once __DIR__.'/vendor/autoload.php';
|
||||
} elseif (file_exists(__DIR__.'/../../autoload.php')) {
|
||||
require_once __DIR__ . '/../../autoload.php';
|
||||
} else {
|
||||
require_once 'phar://robo.phar/vendor/autoload.php';
|
||||
}
|
||||
}
|
||||
$runner = new \Robo\Runner();
|
||||
$runner->setSelfUpdateRepository('consolidation/robo');
|
||||
$statusCode = $runner->execute($_SERVER['argv']);
|
||||
exit($statusCode);
|
||||
@@ -1 +0,0 @@
|
||||
docs/guide.txt
|
||||
267
core/lib/composer/vendor/pear/net_smtp/README.rst
vendored
Normal file
267
core/lib/composer/vendor/pear/net_smtp/README.rst
vendored
Normal file
@@ -0,0 +1,267 @@
|
||||
======================
|
||||
The Net_SMTP Package
|
||||
======================
|
||||
|
||||
--------------------
|
||||
User Documentation
|
||||
--------------------
|
||||
|
||||
:Author: Jon Parise
|
||||
:Contact: jon@php.net
|
||||
|
||||
.. contents:: Table of Contents
|
||||
.. section-numbering::
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
The ``PEAR_Error`` Class
|
||||
------------------------
|
||||
|
||||
The Net_SMTP package uses the `PEAR_Error`_ class for all of its `error
|
||||
handling`_.
|
||||
|
||||
The ``Net_Socket`` Package
|
||||
--------------------------
|
||||
|
||||
The Net_Socket_ package is used as the basis for all network communications.
|
||||
Connection options can be specified via the `$socket_options` construction
|
||||
parameter::
|
||||
|
||||
$socket_options = array('ssl' => array('verify_peer_name' => false));
|
||||
$smtp = new Net_SMTP($host, null, null, false, 0, $socket_options);
|
||||
|
||||
**Note:** PHP 5.6 introduced `OpenSSL changes`_. Peer certificate verification
|
||||
is now enabled by default. Although not recommended, `$socket_options` can be
|
||||
used to disable peer verification (as shown above).
|
||||
|
||||
.. _OpenSSL changes: http://php.net/manual/en/migration56.openssl.php
|
||||
|
||||
The ``Auth_SASL`` Package
|
||||
-------------------------
|
||||
|
||||
The `Auth_SASL`_ package is an optional dependency. If it is available, the
|
||||
Net_SMTP package will be able to support the DIGEST-MD5_ and CRAM-MD5_ SMTP
|
||||
authentication methods. Otherwise, only the LOGIN_ and PLAIN_ methods will
|
||||
be available.
|
||||
|
||||
Error Handling
|
||||
==============
|
||||
|
||||
All of the Net_SMTP class's public methods return a PEAR_Error_ object if an
|
||||
error occurs. The standard way to check for a PEAR_Error object is by using
|
||||
`PEAR::isError()`_::
|
||||
|
||||
if (PEAR::isError($error = $smtp->connect())) {
|
||||
die($error->getMessage());
|
||||
}
|
||||
|
||||
.. _PEAR::isError(): http://pear.php.net/manual/en/core.pear.pear.iserror.php
|
||||
|
||||
SMTP Authentication
|
||||
===================
|
||||
|
||||
The Net_SMTP package supports the SMTP authentication standard (as defined
|
||||
by RFC-2554_). The Net_SMTP package supports the following authentication
|
||||
methods, in order of preference:
|
||||
|
||||
.. _RFC-2554: http://www.ietf.org/rfc/rfc2554.txt
|
||||
|
||||
DIGEST-MD5
|
||||
----------
|
||||
|
||||
The DIGEST-MD5 authentication method uses `RSA Data Security Inc.`_'s MD5
|
||||
Message Digest algorithm. It is considered the most secure method of SMTP
|
||||
authentication.
|
||||
|
||||
**Note:** The DIGEST-MD5 authentication method is only supported if the
|
||||
AUTH_SASL_ package is available.
|
||||
|
||||
.. _RSA Data Security Inc.: http://www.rsasecurity.com/
|
||||
|
||||
CRAM-MD5
|
||||
--------
|
||||
|
||||
The CRAM-MD5 authentication method has been superseded by the DIGEST-MD5_
|
||||
method in terms of security. It is provided here for compatibility with
|
||||
older SMTP servers that may not support the newer DIGEST-MD5 algorithm.
|
||||
|
||||
**Note:** The CRAM-MD5 authentication method is only supported if the
|
||||
AUTH_SASL_ package is available.
|
||||
|
||||
LOGIN
|
||||
-----
|
||||
|
||||
The LOGIN authentication method encrypts the user's password using the
|
||||
Base64_ encoding scheme. Because decrypting a Base64-encoded string is
|
||||
trivial, LOGIN is not considered a secure authentication method and should
|
||||
be avoided.
|
||||
|
||||
.. _Base64: http://www.php.net/manual/en/function.base64-encode.php
|
||||
|
||||
PLAIN
|
||||
-----
|
||||
|
||||
The PLAIN authentication method sends the user's password in plain text.
|
||||
This method of authentication is not secure and should be avoided.
|
||||
|
||||
Secure Connections
|
||||
==================
|
||||
|
||||
If `secure socket transports`_ have been enabled in PHP, it is possible to
|
||||
establish a secure connection to the remote SMTP server::
|
||||
|
||||
$smtp = new Net_SMTP('ssl://mail.example.com', 465);
|
||||
|
||||
This example connects to ``mail.example.com`` on port 465 (a common SMTPS
|
||||
port) using the ``ssl://`` transport.
|
||||
|
||||
.. _secure socket transports: http://www.php.net/transports
|
||||
|
||||
Sending Data
|
||||
============
|
||||
|
||||
Message data is sent using the ``data()`` method. The data can be supplied
|
||||
as a single string or as an open file resource.
|
||||
|
||||
If a string is provided, it is passed through the `data quoting`_ system and
|
||||
sent to the socket connection as a single block. These operations are all
|
||||
memory-based, so sending large messages may result in high memory usage.
|
||||
|
||||
If an open file resource is provided, the ``data()`` method will read the
|
||||
message data from the file line-by-line. Each chunk will be quoted and sent
|
||||
to the socket connection individually, reducing the overall memory overhead of
|
||||
this data sending operation.
|
||||
|
||||
Header data can be specified separately from message body data by passing it
|
||||
as the optional second parameter to ``data()``. This is especially useful
|
||||
when an open file resource is being used to supply message data because it
|
||||
allows header fields (like *Subject:*) to be built dynamically at runtime.
|
||||
|
||||
::
|
||||
|
||||
$smtp->data($fp, "Subject: My Subject");
|
||||
|
||||
Data Quoting
|
||||
============
|
||||
|
||||
By default, all outbound string data is quoted in accordance with SMTP
|
||||
standards. This means that all native Unix (``\n``) and Mac (``\r``) line
|
||||
endings are converted to Internet-standard CRLF (``\r\n``) line endings.
|
||||
Also, because the SMTP protocol uses a single leading period (``.``) to signal
|
||||
an end to the message data, single leading periods in the original data
|
||||
string are "doubled" (e.g. "``..``").
|
||||
|
||||
These string transformation can be expensive when large blocks of data are
|
||||
involved. For example, the Net_SMTP package is not aware of MIME parts (it
|
||||
just sees the MIME message as one big string of characters), so it is not
|
||||
able to skip non-text attachments when searching for characters that may
|
||||
need to be quoted.
|
||||
|
||||
Because of this, it is possible to extend the Net_SMTP class in order to
|
||||
implement your own custom quoting routine. Just create a new class based on
|
||||
the Net_SMTP class and reimplement the ``quotedata()`` method::
|
||||
|
||||
require 'Net_SMTP.php';
|
||||
|
||||
class Net_SMTP_custom extends Net_SMTP
|
||||
{
|
||||
function quotedata($data)
|
||||
{
|
||||
/* Perform custom data quoting */
|
||||
}
|
||||
}
|
||||
|
||||
Note that the ``$data`` parameter will be passed to the ``quotedata()``
|
||||
function `by reference`_. This means that you can operate directly on
|
||||
``$data``. It also the overhead of copying a large ``$data`` string to and
|
||||
from the ``quotedata()`` method.
|
||||
|
||||
.. _by reference: http://www.php.net/manual/en/language.references.pass.php
|
||||
|
||||
Server Responses
|
||||
================
|
||||
|
||||
The Net_SMTP package retains the server's last response for further
|
||||
inspection. The ``getResponse()`` method returns a 2-tuple (two element
|
||||
array) containing the server's response code as an integer and the response's
|
||||
arguments as a string.
|
||||
|
||||
Upon a successful connection, the server's greeting string is available via
|
||||
the ``getGreeting()`` method.
|
||||
|
||||
Debugging
|
||||
=========
|
||||
|
||||
The Net_SMTP package contains built-in debugging output routines (disabled by
|
||||
default). Debugging output must be explicitly enabled via the ``setDebug()``
|
||||
method::
|
||||
|
||||
$smtp->setDebug(true);
|
||||
|
||||
The debugging messages will be sent to the standard output stream by default.
|
||||
If you need more control over the output, you can optionally install your own
|
||||
debug handler.
|
||||
|
||||
::
|
||||
|
||||
function debugHandler($smtp, $message)
|
||||
{
|
||||
echo "[$smtp->host] $message\n";
|
||||
}
|
||||
|
||||
$smtp->setDebug(true, "debugHandler");
|
||||
|
||||
|
||||
Examples
|
||||
========
|
||||
|
||||
Basic Use
|
||||
---------
|
||||
|
||||
The following script demonstrates how a simple email message can be sent
|
||||
using the Net_SMTP package::
|
||||
|
||||
require 'Net/SMTP.php';
|
||||
|
||||
$host = 'mail.example.com';
|
||||
$from = 'user@example.com';
|
||||
$rcpt = array('recipient1@example.com', 'recipient2@example.com');
|
||||
$subj = "Subject: Test Message\n";
|
||||
$body = "Body Line 1\nBody Line 2";
|
||||
|
||||
/* Create a new Net_SMTP object. */
|
||||
if (! ($smtp = new Net_SMTP($host))) {
|
||||
die("Unable to instantiate Net_SMTP object\n");
|
||||
}
|
||||
|
||||
/* Connect to the SMTP server. */
|
||||
if (PEAR::isError($e = $smtp->connect())) {
|
||||
die($e->getMessage() . "\n");
|
||||
}
|
||||
|
||||
/* Send the 'MAIL FROM:' SMTP command. */
|
||||
if (PEAR::isError($smtp->mailFrom($from))) {
|
||||
die("Unable to set sender to <$from>\n");
|
||||
}
|
||||
|
||||
/* Address the message to each of the recipients. */
|
||||
foreach ($rcpt as $to) {
|
||||
if (PEAR::isError($res = $smtp->rcptTo($to))) {
|
||||
die("Unable to add recipient <$to>: " . $res->getMessage() . "\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* Set the body of the message. */
|
||||
if (PEAR::isError($smtp->data($subj . "\r\n" . $body))) {
|
||||
die("Unable to send data\n");
|
||||
}
|
||||
|
||||
/* Disconnect from the SMTP server. */
|
||||
$smtp->disconnect();
|
||||
|
||||
.. _PEAR_Error: http://pear.php.net/manual/en/core.pear.pear-error.php
|
||||
.. _Net_Socket: http://pear.php.net/package/Net_Socket
|
||||
.. _Auth_SASL: http://pear.php.net/package/Auth_SASL
|
||||
|
||||
.. vim: tabstop=4 shiftwidth=4 softtabstop=4 expandtab textwidth=78 ft=rst:
|
||||
Reference in New Issue
Block a user