PHP Custom SMTP Mail функция Возврат ОШИБКА отправка байтов не выполнена errno = 32 Сломанный канал - PullRequest
4 голосов
/ 02 декабря 2010

Я написал следующую пользовательскую функцию PHP для отправки почты через SMTP MAIL SERVER.

function send($format = 'text'){

    $smtpServer  = 'mail.mymailserver.com.mx';
    $port        = '25';
    $timeout     = '60';
    $username    = 'myuser';
    $password    = 'mypassword';
    $localhost   = 'www.mydomain.com.mx';
    $newLine     = "\r\n";

    $smtpConnect = fsockopen( $smtpServer, $port, $errno, $errstr, $timeout );

    fputs( $smtpConnect,'AUTH LOGIN'.$newLine );
    fputs( $smtpConnect, base64_encode( $username )  . $newLine    );
    fputs( $smtpConnect, base64_encode( $password )  . $newLine    );
    fputs( $smtpConnect, 'HELO '       . $localhost  . $newLine    );
    fputs( $smtpConnect, 'MAIL FROM: ' . $this->from . $newLine    );
    fputs( $smtpConnect, 'RCPT TO: '   . $this->to   . $newLine    );

    if( !empty( $this->cc ) ){
        fputs( $smtpConnect, 'RCPT TO: '   . $this->cc   . $newLine    );
    }

    if( !empty( $this->bcc ) ){
        fputs( $smtpConnect, 'RCPT TO: '   . $this->bcc  . $newLine    );
    }

    fputs( $smtpConnect, 'DATA'        . $newLine                  );

    fflush( $smtpConnect );

    $raw  = "";
    $raw  = @fread( $smtpConnect, 255 ) . "@";
    $raw .= @fread( $smtpConnect, 255 );

    fputs( $smtpConnect, 'To:     '  . $this->to . $newLine        );
    fputs( $smtpConnect, 'From:   <' . $this->from .'>' . $newLine );
    fputs( $smtpConnect, 'Subject:'  . $this->subject . $newLine   );

    $format = 'html';

    if( $format == 'text' ){

        $headers  = "Content-Type: text/plain; charset=\"iso-8859-1\"" . "\r\n";
        $headers .= "Content-Transfer-Encoding: 7bit" . "\r\n";

        $message  = $this->bodyText();

        fputs( $smtpConnect, $headers   . $newLine  . $newLine       );
        fputs( $smtpConnect, $message   . $newLine  . '.' . $newLine );

    }else{

        $random_hash = md5(date('r', time()));

        $headers  = "Content-Type: multipart/alternative; boundary=\"PHP-alt-".$random_hash."\"\r\n";
        $headers .= "--PHP-alt-" . $random_hash . "\r\n";
        $headers .= "Content-Type: text/plain; charset=\"iso-8859-1\"" . "\r\n";
        $headers .= "Content-Transfer-Encoding: 7bit" . "\r\n";

        $message  = $this->bodyText();

        fputs( $smtpConnect, $headers . $newLine );
        fputs( $smtpConnect, $message . $newLine );

        $headers  = "--PHP-alt-" . $random_hash . "\r\n";
        $headers .= "Content-Type: text/html; charset=\"iso-8859-1\"" . "\r\n";
        $headers .= "Content-Transfer-Encoding: 7bit" . "\r\n";

        $message  = $this->bodyHtml();

        fputs( $smtpConnect, $headers  . $newLine );
        fputs( $smtpConnect, $message  . $newLine );

        $headers  = "--PHP-alt-" . $random_hash . "--\r\n";

        fputs( $smtpConnect, $headers . '.' . $newLine  );

    }

    fputs( $smtpConnect,'QUIT'      . $newLine );

    return true;

}

Функция работала очень хорошо, но в последние дни я получил ошибки php nexts:

Примечание: fputs () [function.fputs]: отправка 8192 байт завершилась неудачно с errno = 32 Сломанный канал в /cakeapp/trunk/app/controllers/components/email.php в строке 165

Примечание: fputs () [function.fputs]: сбой передачи 49 байтов с ошибкой errno = 32. Сломанный канал в /cakeapp/trunk/app/controllers/components/email.php в строке 169

Примечание: fputs ()[function.fputs]: отправка 6 байтов завершилась неудачно с errno = 32 Сломанный канал в /cakeapp/trunk/app/controllers/components/email.php в строке 182

Я искал в Google некоторые предложения, ноинформация, которую я нашел, говорила о проблеме, связанной с превышением времени соединения!

Может ли кто-нибудь предложить способ решения этой проблемы?

Ответы [ 2 ]

6 голосов
/ 12 октября 2013

У меня возникла та же проблема, и я нашел решение, установив для протокола «mail» (конечно, это не тот случай, когда вам всегда нужно использовать «mail» в качестве протокола, я использовал «smtp» в качестве протокола на другом веб-сайте). и работал нормально, но тот же код, который я скопировал и вставил для какого-то другого веб-сайта, не работал, поэтому мне пришлось изменить его на «mail»). Мой пример конфигурации выглядит следующим образом (замените заглавные слова своими учетными данными):

'protocol' => 'mail',            
'smtp_host' => 'mail.YOUR_WEBSITE_DOMAIN.com.au',            
'smtp_port' => 25,            
'smtp_user' => 'YOUR_EMAIL_ACCOUNT@YOUR_WEBSITE_DOMAIN.com.au',            
'smtp_pass' => 'YOUR_PASSWORD_FOR_YOUR_EMAIL_ACCOUNT',            
'smtp_timeout' => 5,// The default value            
'mailtype' => 'html' //default: text        
0 голосов
/ 22 сентября 2014

http://tools.ietf.org/html/rfc2045 Кодированные строки не должны быть длиннее 76 символов, не считая завершающего CRLF. Если во входящих закодированных данных обнаруживаются более длинные строки, надежная реализация, тем не менее, может декодировать строки и сообщать пользователю об ошибочной кодировке.

Итак, если у вас возникла та же проблема, попробуйте chunk_split! Например: $ message = chunk_split ($ message)

...