EllisLab text mark
Advanced Search
1 of 3
1
   
Gmail SMTP using SSL/TLS
Posted: 09 July 2008 11:16 PM
Joined: 2008-07-09
6 posts

This post is no longer accurate for use with CodeIgniter2, thankfully biojazard has revised the code in his post later in this thread. I’d link you to it, but im apparently being punished for not being ‘active’.

To help lift any bad feelings towards my absence Id like to use several smileys to seperate this edit with the original post.

surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised surprised

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

 
Posted: 10 July 2008 12:08 PM   [ # 1 ]   [ Rating: 0 ]
Avatar
Joined: 2006-08-06
918 posts

superb first post!

thanks for your hard work and feedback, wrs.

the bug with with email class is noted here.

since you are sending email you might be interested in an imap_pop class i wrote… imap_pop class on the wiki

cheers. here’s hoping you stick around! grin

 Signature 

peeker email (imap/pop) | site_migrate | OOCalendar | PhotoBox2 | word_limiter

 
Posted: 19 July 2008 03:01 AM   [ # 2 ]   [ Rating: 0 ]
Joined: 2008-07-19
9 posts

wrs, i did it, but didn’t work.
Following the error of $this->email->print_debugger():

“The following SMTP error was encountered: 530-5.5.1 Authentication Required. Learn more at 530 5.5.1 http://mail.google.com/support/bin/answer.py?answer=14257 6sm2484862yxg.6”

Could you help me?

Tks

 
Posted: 22 July 2008 01:12 AM   [ # 3 ]   [ Rating: 0 ]
Joined: 2008-07-09
6 posts

Peri,

I rechecked the code I posted, all is working fine here. You told us the error message you received, but not what you did to receive it…

But i’m guessing you’ve fallen victim to the $this->email->initialize() bug I described above where, even if smtp_user and smtp_pass are set, SMTP authentication is not used.

If you are using the following code:

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

then consider changing it to:

$this->load->library('email'$config_array); 
 
Posted: 01 August 2008 07:13 PM   [ # 4 ]   [ Rating: 0 ]
Avatar
Joined: 2007-05-08
13 posts

Good job wrs, thank you for sharing it. It works perfectly.

 
Posted: 02 September 2008 02:50 AM   [ # 5 ]   [ Rating: 0 ]
Joined: 2007-09-16
30 posts

Thanks for this post. Working great.

I found that all I needed to do was to put the settings into the email.php config file (system/config/email.php), and use $this->email->set_newline(”\r\n”).

$config['protocol''smtp';
$config['smtp_host''ssl://smtp.googlemail.com';
$config['smtp_user''username@mygoogleappsdomain.com';
$config['smtp_pass''123xyz';
$config['smtp_port''465'
 
Posted: 02 September 2008 02:32 PM   [ # 6 ]   [ Rating: 0 ]
Joined: 2008-08-27
18 posts

Excellent! I was just wondering about this myself and here is the answer. Great post!

 Signature 

PHP Screencast Tutorials

 
Posted: 15 January 2009 07:25 AM   [ # 7 ]   [ Rating: 0 ]
Avatar
Joined: 2008-06-15
2 posts

Thanks for sharing this information. Great, helpful post!

 
Posted: 15 January 2009 10:07 AM   [ # 8 ]   [ Rating: 0 ]
Joined: 2009-01-07
17 posts

Thanks, your post was very helpfull, just what i was looking for.

I am testing and developing locally with an XAMPP installation and Code Ignite and wanted to be able to send emails from my machine using SMTP and my gmail account.

Your post allowed me to get this set up.

The other thing I needed to do was to enable OpenSSL in my XAMPP installation. Thanks to http://w3it.com/blog/?p=7

Open /apache/bin/php.ini file

Find the line with ;extension=php_openssl.dll and uncomment it by removing the semi-colon from the start of the line.

Restart Apache.

Hope that helps somebody

 
Posted: 24 February 2009 10:06 PM   [ # 9 ]   [ Rating: 0 ]
Avatar
Joined: 2008-01-25
289 posts

Great post.
Gawd I love CodeIgniter

 Signature 

http://PawshPal.com/ - Funny Dog Pictures

 
Posted: 07 April 2009 03:46 PM   [ # 10 ]   [ Rating: 0 ]
Joined: 2008-04-02
48 posts

Worked great and fixed my smtp problem!

Thanks!

 
Posted: 23 May 2009 10:44 AM   [ # 11 ]   [ Rating: 0 ]
Avatar
Joined: 2006-08-06
918 posts

my ISP just blocked port 25 outgoing so i had to figure out how to get around it.

i just implemented this google smtp set up and it is working great - even using google apps with my own domain.

i had one problem that is worth mentioning… i forgot to add the crucial line:

$this->email->set_newline("\r\n"); 

and it resulted in an 500 “Internal Server Error” page and php_wrapper.cgi message in the php error log. so i ended up going on a wild goose chase. eventually, i realized that i had left out the set_newline() call.

moral of the story: make sure you set_newline() as described by the OP.

 Signature 

peeker email (imap/pop) | site_migrate | OOCalendar | PhotoBox2 | word_limiter

 
Posted: 06 July 2009 06:56 PM   [ # 12 ]   [ Rating: 0 ]
Joined: 2009-06-15
13 posts

Looks so great, just one small thing… I put all the params into email.php and the page “hangs” forever, even though the timeout is set to 30 secs. no echo with debug either (i used to get it before making other mistakes). any idea what can be happening?
thanks in advance!!!

email.php

$config['protocol']='smtp';
$config['smtp_host']='ssl://smtp.googlemail.com';
$config['smtp_port']='465';
$config['smtp_timeout']='30';
$config['smtp_user']='my gmail';
$config['smtp_pass']='my gmail pass';
$config['charset']='utf-8';
$config['newline']='\r\n'

the controller

$this->load->library(array('form_validation','recaptcha','email'));
[...]

$this
->email->from('suport@domain.com','tralalala');
$this->email->to($this->input->post('email'));
$this->email->subject('testing');
$this->email->message('live! damn it...');
$this->email->send();
echo 
$this->email->print_debugger(); 
 
Posted: 06 July 2009 09:35 PM   [ # 13 ]   [ Rating: 0 ]
Avatar
Joined: 2006-08-06
918 posts

you need to use double-quotes on your

$config['newline']="\r\n"

- single quotes do not work.

 Signature 

peeker email (imap/pop) | site_migrate | OOCalendar | PhotoBox2 | word_limiter

 
Posted: 07 July 2009 02:03 AM   [ # 14 ]   [ Rating: 0 ]
Joined: 2009-06-15
13 posts

So simple… thank you!!!  LOL

 
Posted: 07 July 2009 11:06 AM   [ # 15 ]   [ Rating: 0 ]
Avatar
Joined: 2006-08-06
918 posts

you are welcome! and thank YOU for *posting code* so the problem was immediately apparent. i wish other people asking questions in these forums were as proactive! grin

 Signature 

peeker email (imap/pop) | site_migrate | OOCalendar | PhotoBox2 | word_limiter

 
1 of 3
1