CI 使用googlemail

来源:互联网 发布:sql 取最早最晚时间 编辑:程序博客网 时间:2024/06/03 19:56

url http://codeigniter.com/forums/viewthread/84689/P0/

 

I only heard about codeigniter a couple days ago so forgive me if im repeating something found either on the forums or bugtracker etc.

I’ve been trying to use the included Email library in conjunction with my favourite Google Mail service and, like many others, i’ve been having many problems.

Google Mail requires encryption ( SSL/TLS ) for its SMTP access and it has been noted that this is not something that CodeIgniter currently supports. Understanding this I decided to go about either modifying or rewriting the CI_Email class to include these features.

After some reading it seems that SSL and TLS are in fact the same thing ( the protocol was renamed? ). I think its fair to say the most common misunderstanding of these two protocols are that SSL is encryption enabled during connection and that TLS is encryption enabled on the fly after a connection has been made ( hence the STARTTLS ESMTP command ).

In any case, after several hours of farting about, i’ve realised that CodeIgnighter will indeed work with the Gmail service without any modification of the core classes.

Firstly, your PHP installation must include support for openssl ( either compiled in, or with the php_openssl.dll extension loaded ). You will want to read the pages surrounding OpenSSL Installation within the PHP Manual.

With that done, you just need your standard use of the email library with a few noticable changes from the norm:

$config = Array(
    
'protocol' => 'smtp',
    
'smtp_host' => 'ssl://smtp.googlemail.com',
    
'smtp_port' => 465,
    
'smtp_user' => 'gmail.login@googlemail.com',
    
'smtp_pass' => 'your_password',
);
$this->load->library('email'$config);
$this->email->set_newline("/r/n");

$this->email->from('gmail.login@googlemail.com''Your Name');
$this->email->to('recipient@destination.tld');

$this->email->subject(' CodeIgniter Rocks Socks ');
$this->email->message('Hello World');


if (!
$this->email->send())
    
show_error($this->email->print_debugger());
else
    echo 
'Your e-mail has been sent!'

The important parts of the above code are the inclusion of the ssl:// protocol before the smtp hostname, and setting the newline variable to CRLF. The port value of 465 may also be important ( 25 doesnt work at least).

Everything is now working as expected here, hope this helps someone.

Also, I noticed that the documentation recommends using $this->email->initialize($config_array) for setting your mailing preferences however it does not take the nesecarry steps to enable authentication should smtp_user & smtp_pass be defined. The good news is that you can pass the exact same $config_array to your $this->load->library(); call like so:

$this->load->library('email'$config_array); 

This will do exactly the same as initialize($config_array) but will properly configure for authentication should be it required. Perhaps there is a reason for initalize()‘s behaviour but the documentation is misleading and doesnt mention $this->load->library(‘email’, $config_array); at all.


I havnt decided if I will use CodeIgnigter as part of my usual dev toolset, its certainly an interesting framework, but i’ve been impressed with both it and its community so far. So keep up the good work ;D