codeigniter4 / CodeIgniter4

Open Source PHP Framework (originally from EllisLab)
https://codeigniter.com/
MIT License
5.22k stars 1.87k forks source link

Bug: The error occurred when the built-in Email library was forced to switch to TLS while setting port 465 #7520

Closed skycyclone closed 10 months ago

skycyclone commented 1 year ago

PHP Version

8.1

CodeIgniter4 Version

4.3.4

CodeIgniter4 Installation Method

Composer (using codeigniter4/appstarter)

Which operating systems have you tested for this bug?

Windows

Which server did you use?

apache

Database

No response

What happened?

The built-in Email library, when specifying the SMTP port as 465, disregards the SMTPCrypto settings, and directly sets the encryption method as tls://, which is incomprehensible to me.

Many email services provide SMTP SSL ports that are designated as 465, but the protocols they offer may only be one of ssl:// and tls://, or one may be stable while the other is not. This choice should ideally be decided by the user.

My current situation is that in Codeigniter3, the smtp_crypto was set to ssl on port 465 and has been running stably. But after upgrading the system to Codeigniter4, I found that the framework forcibly sets tls:// when setting port 465; causing the email failure rate to be as high as 30%.

For now, there's no solution, so I had to temporarily set it to port 25 without specifying SMTPCrypto, and no errors have occurred so far. In the old system, the same SMTP parameters of 465+SSL combination also never caused errors.

The SMTP service I use is from 126.com's email service, and the SMTP server address is smtp.126.com.

Steps to Reproduce

$config['protocol'] = 'smtp';
$config['SMTPHost'] = 'smtp.126.com';
$config['SMTPPort'] = 465;
$config['SMTPCrypto'] = 'ssl';
$config['SMTPUser'] = '***';
$config['SMTPPass'] = '***';

$email->initialize($config);

$email->setFrom('your@example.com', 'Your Name');
$email->setTo('someone@example.com');
$email->setSubject('Email Test');
$email->setMessage('Testing the email class.');

$email->send();

Expected Output

To send emails steadily and normally.

Anything else?

No response

kenjis commented 1 year ago

My current situation is that in Codeigniter3, the smtp_crypto was set to ssl on port 465 and has been running stably. But after upgrading the system to Codeigniter4, I found that the framework forcibly sets tls:// when setting port 465; causing the email failure rate to be as high as 30%.

I don't understand why the failure rate is as high as 30%.

kenjis commented 1 year ago

This is not a bug, but a bug fix: #3430 Please ask the service provider why tls makes unstable.

kenjis commented 10 months ago

It would be unlike CI to force the library to change user's settings. I would like to fix this behavior as a bug. See also https://github.com/codeigniter4/CodeIgniter4/pull/7522#issuecomment-1565352711

kenjis commented 10 months ago

@skycyclone I sent a PR to fix this: #7883 Try if you can.