У меня есть конфигурация электронной почты smtp для отправки электронной почты через Codeigniter следующим образом:
$config = [
'protocol' => 'smtp',
'smtp_host' => 'ssl://cph.dnet.net.id',
'smtp_port' => 465,
'smtp_timeout' => 50,
'smtp_user' => '[email protected]',
'smtp_pass' => 'MyPaSsWoRd',
'smtp_keepalive' => 'TRUE',
'mailtype' => 'html',
'charset' => 'iso-8859-1'
];
$this->email->initialize($config);
Если я отправлю всего несколько писем, это всегда сработает. Однако, когда я отправляю много писем, возникает следующая ошибка:
Fatal error: Maximum execution time of 30 seconds exceeded in C:\XAMPP\htdocs\sicuti\system\libraries\Email.php on line 2268
ошибка решается редактированием "php.ini" в значении "max_execution_time" на 9999 .b но codeigniter отображает новые проблемы вроде этого:
fwrite(): SSL operation failed with code 1. OpenSSL Error messages: error:140D00CF:SSL routines:SSL_write:protocol is shutdown
хотя моя конфигурация smtp правильная, согласно рекомендациям в моей cpanel
Если только несколько писем определенно будут работать, но если появится более 10 ошибок, что мне следует изменить, чтобы я мог отправлять несколько писем за раз? Спасибо, я ценю любой ответ.
Мое предложение: можете ли вы измерить время с помощью секундомера, сколько времени нужно, чтобы эти ошибки обнаружились? Если это всегда одно и то же количество секунд, это может быть директива SMTP-сервера, которая закрывает соединение. Вы можете отключить сокет и открывать новый в каждом письме, но это может привести к значительным накладным расходам. Если вам действительно нужно отправлять массовые электронные письма с помощью цикла, я бы посоветовал вам подумать о службе доставки почты вместо того, чтобы отправлять электронные письма самостоятельно.
У меня есть функция цикла для отправки нескольких электронных писем, что вызывает ошибки, потому что я отправляю много писем одновременно, поэтому я даю перенаправление для каждой доставки электронной почты, чтобы доставка работала нормально. В следующую функцию цикла я вставил функцию перенаправления, и она работает очень хорошо:
function index () {
if (!empty($this->Leave_Model->count_all_leave_wait())) {
$leave_wait_data = $this->Leave_Model->get_all_leave_wait();
foreach ($leave_wait_data as $res) {
if (date('Y-m-d')>$res->Confirm_Date) {
$this->Send_Leave_Request($res->L_Request_ID); # Send Email
$this->Leave_Model->update_lvd_confirm_date($res->L_Request_ID); # Update Confirm Date When Success Send
redirect('Login_Employe'); # Redirect
}
}
}
}
function Send_Leave_Request ($id)
{
# bla bla bla
$this->email->message('Bla bla la bla bla...');
$this->email->send();
}
Первую ошибку, хотя и смягченную путем изменения максимального времени выполнения в PHP, нельзя считать окончательно решенной. Увеличение максимального времени выполнения может серьезно повлиять на производительность вашего сервера в будущем, плюс это позволит избежать ошибок только на стороне PHP. Тем не менее,
140D00CF
указывает, что сокет OpenSSL никогда не открывался или закрылся сам и больше не доступен. Возможно, это связано с тем, что розетка остается открытой в течение длительного времени.