Вы используете объект, содержащий ссылку нулевого значения. Таким образом, он дает пустое исключение. В примере строковое значение равно null, и при проверке его длины произошло исключение.
Пример:
string value = null;
if (value.Length == 0) // <-- Causes exception
{
Console.WriteLine(value); // <-- Never reached
}
Ошибка исключения:
Необработанное исключение:
System.NullReferenceException: ссылка на объект не установлена в экземпляр объекта. в Program.Main ()
blockquote>
есть mail.exampleserver.com существует ??? , если не попробовать следующий код (у вас должна быть учетная запись gmail)
$mail->SMTPSecure = "ssl";
$mail->Host='smtp.gmail.com';
$mail->Port='465';
$mail->Username = 'you@gmail.com'; // SMTP account username
$mail->Password = 'your gmail password';
$mail->SMTPKeepAlive = true;
$mail->Mailer = "smtp";
$mail->IsSMTP(); // telling the class to use SMTP
$mail->SMTPAuth = true; // enable SMTP authentication
$mail->CharSet = 'utf-8';
$mail->SMTPDebug = 0;
У меня была аналогичная проблема. Я установил PHPMailer версии 1.72, который не готов управлять SSL-соединениями. Обновление до последней версии решило проблему.
Следующий код работал для меня:
$mail = new PHPMailer(true);
$mail->isSMTP();// Set mailer to use SMTP
$mail->CharSet = "utf-8";// set charset to utf8
$mail->SMTPAuth = true;// Enable SMTP authentication
$mail->SMTPSecure = 'tls';// Enable TLS encryption, `ssl` also accepted
$mail->Host = 'smtp.gmail.com';// Specify main and backup SMTP servers
$mail->Port = 587;// TCP port to connect to
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
$mail->isHTML(true);// Set email format to HTML
$mail->Username = 'Sender Email';// SMTP username
$mail->Password = 'Sender Email Password';// SMTP password
$mail->setFrom('example@mail.com', 'John Smith');//Your application NAME and EMAIL
$mail->Subject = 'Test';//Message subject
$mail->MsgHTML('HTML code');// Message body
$mail->addAddress('User Email', 'User Name');// Target email
$mail->send();
Поскольку это популярная ошибка, проверьте PHPMailer Wiki на устранение неполадок.
Также это сработало для меня
$mailer->Port = '587';
У меня была аналогичная проблема, и выяснилось, что это была директива конфигурации openssl.cafile
в php.ini
, которая должна была быть установлена, чтобы разрешить проверку безопасных одноранговых узлов. Вы просто установили его в расположение файла центра сертификации, подобного тому, который вы можете получить в http://curl.haxx.se/docs/caextract.html .
Это директива является новой по сравнению с PHP 5.6, поэтому это меня не впечатлило при обновлении с PHP 5.5.
Поскольку эти вопросы появляются в google, я хотел бы поделиться здесь своим решением для случая, когда PHP был просто обновлен до версии 5.6 (который имеет более строгие правила SSL).
Вики-страница PHPMailer имеет раздел об этом:
https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting#php-56-certificate-verification-failure
Предлагаемое решение включает следующий фрагмент кода:
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
Это должно работать для PHPMailer 5.2.10 (и выше).
Примечание: Очевидно, а также как предлагается в этой вики, это должно быть временным решением!
Правильное исправление для этого - заменить неверный, неправильно сконфигурированный или самоподписанный сертификат с хорошим.
У меня была та же проблема, и именно потому, что PHPMailer понял, что сервер поддерживает STARTTLS, поэтому он попытался автоматически обновить соединение с зашифрованным соединением. Мой почтовый сервер находится в той же подсети, что и веб-сервер в моей сети, который находится за нашими брандмауэрами домена, поэтому я не слишком беспокоюсь об использовании шифрования (плюс генерируемые электронные письма не содержат конфиденциальных данных).
Итак, что я сделал, и изменил SMTPAutoTLS на false в файле class.phpmailer.php.
/**
* Whether to enable TLS encryption automatically if a server supports it,
* even if `SMTPSecure` is not set to 'tls'.
* Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
* @var boolean
*/
public $SMTPAutoTLS = false;
В моем случае это было отсутствие поддержки SSL в PHP, которая дала эту ошибку.
Поэтому я включил расширение = php_openssl.dll
$mail->SMTPDebug = 1;
также намекнул на это решение .
Обновление 2017
$mail->SMTPDebug = 2;
, см.: https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting#enabling-debug-output
Вероятнее всего, ваша проблема связана с этим
Безопасность подключения: STARTTLS Connection Security: SSL / TLS
Это два разных протокола: используете ли вы правильный, независимо от того, re использование в Thunderbird должно быть использовано.
Попробуйте установить переменную:
// if you're using SSL
$mail->SMTPSecure = 'ssl';
// OR use TLS
$mail->SMTPSecure = 'tls';