Zeile 204 | Zeile 204 |
---|
if($this->connected()) {
|
if($this->connected()) {
|
if(!$this->send_data('MAIL FROM:<'.$this->from.'>', '250'))
| if(!$this->send_data('MAIL FROM:<'.$this->from.'>', 250))
|
{ $this->fatal_error("The mail server does not understand the MAIL FROM command. Reason: ".$this->get_error()); return false;
| { $this->fatal_error("The mail server does not understand the MAIL FROM command. Reason: ".$this->get_error()); return false;
|
Zeile 215 | Zeile 215 |
---|
foreach($emails as $to) { $to = trim($to);
|
foreach($emails as $to) { $to = trim($to);
|
if(!$this->send_data('RCPT TO:<'.$to.'>', '250'))
| if(!$this->send_data('RCPT TO:<'.$to.'>', 250))
|
{ $this->fatal_error("The mail server does not understand the RCPT TO command. Reason: ".$this->get_error()); return false; } }
|
{ $this->fatal_error("The mail server does not understand the RCPT TO command. Reason: ".$this->get_error()); return false; } }
|
if($this->send_data('DATA', '354'))
| if($this->send_data('DATA', 354))
|
{ $this->send_data('Date: ' . gmdate('r')); $this->send_data('To: ' . $this->to);
| { $this->send_data('Date: ' . gmdate('r')); $this->send_data('To: ' . $this->to);
|
Zeile 247 | Zeile 247 |
---|
return false; }
|
return false; }
|
$this->send_data('.', '250');
| if(!$this->send_data('.', 250)) { $this->fatal_error("Mail may not be delivered. Reason: ".$this->get_error()); }
|
if(!$this->keep_alive) {
| if(!$this->keep_alive) {
|
Zeile 297 | Zeile 300 |
---|
$helo = 'HELO'; }
|
$helo = 'HELO'; }
|
$data = $this->send_data("{$helo} {$this->helo}", '250');
| $data = $this->send_data("{$helo} {$this->helo}", 250);
|
if(!$data) { $this->fatal_error("The server did not understand the {$helo} command");
| if(!$data) { $this->fatal_error("The server did not understand the {$helo} command");
|
Zeile 306 | Zeile 309 |
---|
if($this->use_tls && preg_match("#250( |-)STARTTLS#mi", $data)) {
|
if($this->use_tls && preg_match("#250( |-)STARTTLS#mi", $data)) {
|
if(!$this->send_data('STARTTLS', '220'))
| if(!$this->send_data('STARTTLS', 220))
|
{
|
{
|
$this->fatal_error("The server did not understand the STARTTLS command. Reason: ".$this->get_error());
| $this->fatal_error("The server did not understand the STARTTLS command. Reason: ".$this->get_error());
|
return false; } if(!@stream_socket_enable_crypto($this->connection, true, STREAM_CRYPTO_METHOD_TLS_CLIENT))
| return false; } if(!@stream_socket_enable_crypto($this->connection, true, STREAM_CRYPTO_METHOD_TLS_CLIENT))
|
Zeile 317 | Zeile 320 |
---|
return false; } // Resend EHLO to get updated service list
|
return false; } // Resend EHLO to get updated service list
|
$data = $this->send_data("{$helo} {$this->helo}", '250');
| $data = $this->send_data("{$helo} {$this->helo}", 250);
|
if(!$data) { $this->fatal_error("The server did not understand the EHLO command");
|
if(!$data) { $this->fatal_error("The server did not understand the EHLO command");
|
return false;
| return false;
|
} }
if(!empty($this->username) && !empty($this->password)) {
|
} }
if(!empty($this->username) && !empty($this->password)) {
|
preg_match("#250( |-)AUTH( |=)(.+)$#mi", $data, $matches);
| if(!preg_match("#250( |-)AUTH( |=)(.+)$#mi", $data, $matches)) { $this->fatal_error("The server did not understand the AUTH command"); return false; }
|
if(!$this->auth($matches[3])) { return false;
| if(!$this->auth($matches[3])) { return false;
|
Zeile 336 | Zeile 343 |
---|
return true; } else
|
return true; } else
|
{
| {
|
$this->fatal_error("Unable to connect to the mail server with the given details. Reason: {$error_number}: {$error_string}"); return false; }
| $this->fatal_error("Unable to connect to the mail server with the given details. Reason: {$error_number}: {$error_string}"); return false; }
|
Zeile 357 | Zeile 364 |
---|
if(in_array("LOGIN", $auth_methods)) { if(!$this->send_data("AUTH LOGIN", 334))
|
if(in_array("LOGIN", $auth_methods)) { if(!$this->send_data("AUTH LOGIN", 334))
|
{
| {
|
if($this->code == 503) { return true;
| if($this->code == 503) { return true;
|
Zeile 365 | Zeile 372 |
---|
$this->fatal_error("The SMTP server did not respond correctly to the AUTH LOGIN command"); return false; }
|
$this->fatal_error("The SMTP server did not respond correctly to the AUTH LOGIN command"); return false; }
|
if(!$this->send_data(base64_encode($this->username), '334')) { $this->fatal_error("The SMTP server rejected the supplied SMTP username. Reason: ".$this->get_error()); return false; }
if(!$this->send_data(base64_encode($this->password), '235')) { $this->fatal_error("The SMTP server rejected the supplied SMTP password. Reason: ".$this->get_error()); return false; } }
| if(!$this->send_data(base64_encode($this->username), 334)) { $this->fatal_error("The SMTP server rejected the supplied SMTP username. Reason: ".$this->get_error()); return false; }
if(!$this->send_data(base64_encode($this->password), 235)) { $this->fatal_error("The SMTP server rejected the supplied SMTP password. Reason: ".$this->get_error()); return false; } }
|
else if(in_array("PLAIN", $auth_methods)) {
|
else if(in_array("PLAIN", $auth_methods)) {
|
if(!$this->send_data("AUTH PLAIN", '334'))
| if(!$this->send_data("AUTH PLAIN", 334)) { if($this->code == 503) { return true; } $this->fatal_error("The SMTP server did not respond correctly to the AUTH PLAIN command"); return false; } $auth = base64_encode(chr(0).$this->username.chr(0).$this->password); if(!$this->send_data($auth, 235)) { $this->fatal_error("The SMTP server rejected the supplied login username and password. Reason: ".$this->get_error()); return false; } } else if(in_array("CRAM-MD5", $auth_methods)) { $data = $this->send_data("AUTH CRAM-MD5", 334); if(!$data)
|
{ if($this->code == 503) { return true; }
|
{ if($this->code == 503) { return true; }
|
$this->fatal_error("The SMTP server did not respond correctly to the AUTH PLAIN command");
| $this->fatal_error("The SMTP server did not respond correctly to the AUTH CRAM-MD5 command");
|
return false; }
|
return false; }
|
$auth = base64_encode(chr(0).$this->username.chr(0).$this->password);
| $challenge = base64_decode(substr($data, 4)); $auth = base64_encode($this->username.' '.$this->cram_md5_response($this->password, $challenge));
|
if(!$this->send_data($auth, 235)) { $this->fatal_error("The SMTP server rejected the supplied login username and password. Reason: ".$this->get_error());
|
if(!$this->send_data($auth, 235)) { $this->fatal_error("The SMTP server rejected the supplied login username and password. Reason: ".$this->get_error());
|
return false; }
| return false; }
|
} else
|
} else
|
{
| {
|
$this->fatal_error("The SMTP server does not support any of the AUTH methods that MyBB supports"); return false;
|
$this->fatal_error("The SMTP server does not support any of the AUTH methods that MyBB supports"); return false;
|
}
| }
|
// Still here, we're authenticated return true;
|
// Still here, we're authenticated return true;
|
}
| }
|
/** * Fetch data from the SMTP server. *
| /** * Fetch data from the SMTP server. *
|
Zeile 414 | Zeile 443 |
---|
function get_data() { $string = '';
|
function get_data() { $string = '';
|
|
|
while((($line = fgets($this->connection, 515)) !== false)) { $string .= $line;
| while((($line = fgets($this->connection, 515)) !== false)) { $string .= $line;
|
Zeile 427 | Zeile 456 |
---|
$this->data = $string; $this->code = substr($this->data, 0, 3); return $string;
|
$this->data = $string; $this->code = substr($this->data, 0, 3); return $string;
|
}
/**
| }
/**
|
* Check if we're currently connected to an SMTP server * * @return boolean true if connected
| * Check if we're currently connected to an SMTP server * * @return boolean true if connected
|
Zeile 534 | Zeile 563 |
---|
function set_error($error) { $this->last_error = $error;
|
function set_error($error) { $this->last_error = $error;
|
| }
/** * Generate a CRAM-MD5 response from a server challenge. * * @param string $password Password. * @param string $challenge Challenge sent from SMTP server. * * @return string CRAM-MD5 response. */ function cram_md5_response($password, $challenge) { if(strlen($password) > 64) { $password = pack('H32', md5($password)); }
if(strlen($password) < 64) { $password = str_pad($password, 64, chr(0)); }
$k_ipad = substr($password, 0, 64) ^ str_repeat(chr(0x36), 64); $k_opad = substr($password, 0, 64) ^ str_repeat(chr(0x5C), 64);
$inner = pack('H32', md5($k_ipad.$challenge));
return md5($k_opad.$inner);
|
} }
| } }
|