<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JonnyReeves.co.uk &#187; cakephp user activate email</title>
	<atom:link href="http://www.jonnyreeves.co.uk/tag/cakephp-user-activate-email/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jonnyreeves.co.uk</link>
	<description>Actionscript, Flash, PHP and stuff</description>
	<lastBuildDate>Mon, 19 Jul 2010 15:36:14 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CakePHP &#8211; Activating User Account via Email</title>
		<link>http://www.jonnyreeves.co.uk/2008/06/cakephp-activating-user-account-via-email/</link>
		<comments>http://www.jonnyreeves.co.uk/2008/06/cakephp-activating-user-account-via-email/#comments</comments>
		<pubDate>Tue, 03 Jun 2008 21:11:20 +0000</pubDate>
		<dc:creator>Jonny</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[cakephp user activate email]]></category>

		<guid isPermaLink="false">http://www.jonnyreeves.co.uk/?p=42</guid>
		<description><![CDATA[Continuing on from my User Registration with the AuthComponent post I&#8217;m going to cover how to activate user account&#8217;s via email.  Before we get down to the code lets look at a simple use case first.
Activating User Accounts Via Email Use Case
Goal: To confirm that users are registering with a valid email address, force [...]]]></description>
			<content:encoded><![CDATA[<p>Continuing on from my <a href="http://www.jonnyreeves.co.uk/2008/05/user-registration-with-cakephp-12-and-auth-component/">User Registration with the AuthComponent post</a> I&#8217;m going to cover how to activate user account&#8217;s via email.  Before we get down to the code lets look at a simple use case first.</p>
<p><strong>Activating User Accounts Via Email Use Case</strong><br />
<em>Goal</em>: To confirm that users are registering with a valid email address, force them to activate their account before they can log in.</p>
<ol>
<li>User registers for an account, all validations passes and $User->save() has been called</li>
<li>At this point we flag that the user&#8217;s account is pending activation.  An email gets sent to the email address the user registered with.  The email contains a unique activation link</li>
<li>The user recieves the activation email and clicks the activation link</li>
<li>The system (your website) handles the incoming link, checks that the activation link is correct (the hash matches) and marks the user&#8217;s account as &#8220;active&#8221; &#8211; the user can now log in!</li>
<ul>
<li><em>Alternative Path:</em> The activation link is rejected by the system (it&#8217;s invalid / wasn&#8217;t copied correctly) &#8211; we present some helpful information to the user.
	</ull>
</ol>
<p><strong>Time for Some Code!</strong><br />
Okay, let&#8217;s start simple &#8211; the basic User Table we created in the previous article needs to be expanded to include an &#8220;active&#8221; flag (boolean) to indicate if the user&#8217;s account has been activated yet:</p>
<div class="dean_ch" style="white-space: nowrap; overflow: scroll;">
<span class="co1">&#8211; Table structure for table `users`</span><br />
<span class="kw1">CREATE TABLE</span> IF <span class="kw3">NOT</span> <span class="kw1">EXISTS</span> `users` <span class="br0">&#40;</span><br />
&nbsp; `id` <span class="kw2">INT</span><span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw3">NOT NULL</span> <span class="kw3">AUTO_INCREMENT</span>,<br />
&nbsp; `username` <span class="kw2">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">20</span><span class="br0">&#41;</span> <span class="kw3">NOT NULL</span>,<br />
&nbsp; `password` <span class="kw2">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">50</span><span class="br0">&#41;</span> <span class="kw3">NOT NULL</span>,<br />
&nbsp; `email` <span class="kw2">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> <span class="kw3">NOT NULL</span>,<br />
&nbsp; `active` <span class="kw2">TINYINT</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="kw3">NOT NULL</span> <span class="kw3">DEFAULT</span> <span class="st0">&#8216;0&#8242;</span>,<br />
&nbsp; `created` <span class="kw2">DATETIME</span> <span class="kw3">NOT NULL</span>,<br />
&nbsp; `modified` <span class="kw2">DATETIME</span> <span class="kw3">NOT NULL</span>,<br />
&nbsp; <span class="kw1">PRIMARY KEY</span> &nbsp;<span class="br0">&#40;</span>`id`<span class="br0">&#41;</span><br />
<span class="br0">&#41;</span> ENGINE=<span class="kw1">INNODB</span> &nbsp;<span class="kw3">DEFAULT</span> <span class="kw3">CHARSET</span>=latin1;<br />
&nbsp;</div>
<p>Okay, let&#8217;s go ahead and hook this into our Users Controller&#8217;s login() action to stop &#8220;un-activated&#8221; users from loging in (after all, that is the <b>primary goal</b> of performing this work).</p>
<div class="dean_ch" style="white-space: nowrap; overflow: scroll;">
<span class="kw2">&lt;?php</span><br />
<span class="co1">// Note: not all logic is show!</span><br />
uses<span class="br0">&#40;</span>’sanitize’<span class="br0">&#41;</span>;<br />
<span class="kw2">class</span> UsersController <span class="kw2">extends</span> AppController<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> <span class="re0">$name</span> = ‘Users’;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> <span class="re0">$components</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>‘Auth’<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span> login<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Check for incoming login request.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">data</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Use the AuthComponent&#8217;s login action</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">Auth</span>-&gt;<span class="me1">login</span><span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">data</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Retrieve user data</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$results</span> = <span class="re0">$this</span>-&gt;<span class="me1">User</span>-&gt;<span class="me1">find</span><span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&#8216;User.username&#8217;</span> =&gt; <span class="re0">$this</span>-&gt;<span class="me1">data</span><span class="br0">&#91;</span><span class="st0">&#8216;User&#8217;</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#8216;username&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>, <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&#8216;User.active&#8217;</span><span class="br0">&#41;</span>, <span class="kw2">null</span>, <span class="kw2">false</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Check to see if the User&#8217;s account isn&#8217;t active</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$results</span><span class="br0">&#91;</span><span class="st0">&#8216;User&#8217;</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#8216;active&#8217;</span><span class="br0">&#93;</span> == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Uh Oh!</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">Session</span>-&gt;<span class="me1">setFlash</span><span class="br0">&#40;</span><span class="st0">&#8216;Your account has not been activated yet!&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">Auth</span>-&gt;<span class="me1">logout</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">redirect</span><span class="br0">&#40;</span><span class="st0">&#8216;/users/login&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Cool, user is active, redirect post login</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">redirect</span><span class="br0">&#40;</span><span class="st0">&#8216;/&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="kw2">?&gt;</span></div>
<p>With this login check in place, we now need to sort out sending out the email which will actually &#8220;activate&#8221; the user&#8217;s account for them.  Before we start with the controller actions, let&#8217;s defined some custom logic in the Model.  As a quick side note, I work to the principle of <a href="http://www.littlehart.net/atthekeyboard/2007/04/27/fat-models-skinny-controllers/">skinny controllers, fat models</a> (and so should you).  What this means, in a nutshell &#8211; is that any logic which relates to a Model (in our case, generating the Confirmation Link) should be done in the Model &#8211; so let&#8217;s do that now.</p>
<div class="dean_ch" style="white-space: nowrap; overflow: scroll;">
<span class="kw2">&lt;?php</span><br />
<span class="co2"># /app/models/user.php </span><br />
<span class="co2"># please note that validation logic is not shown</span><br />
<span class="kw2">Class</span> User <span class="kw2">extends</span> AppModel<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> <span class="re0">$name</span> = ‘User’;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Creates an activation hash for the current user.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @param Void<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp; @return String activation hash.<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span> getActivationHash<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!<a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">id</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <a href="http://www.php.net/substr"><span class="kw3">substr</span></a><span class="br0">&#40;</span>Security::<span class="me2">hash</span><span class="br0">&#40;</span>Configure::<span class="me2">read</span><span class="br0">&#40;</span><span class="st0">&#8216;Security.salt&#8217;</span><span class="br0">&#41;</span> . <span class="re0">$this</span>-&gt;<span class="me1">field</span><span class="br0">&#40;</span><span class="st0">&#8216;created&#8217;</span><span class="br0">&#41;</span> . <a href="http://www.php.net/date"><span class="kw3">date</span></a><span class="br0">&#40;</span><span class="st0">&#8216;Ymd&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, <span class="nu0">0</span>, <span class="nu0">8</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="kw2">?&gt;</span></div>
<p>So, incase you didn&#8217;t gather, we can grab a unique Activation Hash for any given user by calling $User->getActivationHash() from inside the controller.  Let&#8217;s just break down what we are doing in the getActivationHash funciton and the reason why we&#8217;re doing it.</p>
<p>When we send the email to the user, we are going to send them a link which they can click on to activate their account.  If we don&#8217;t create unique activation links then users would be able to &#8220;guess&#8221; or craft activation links for other users, for example, if we didn&#8217;t use an activation hash our links may look like this: http://mysite.com/user/activate/jreeves/ &#8211; Hmm, well I know that my username is jreeves, so I could guess pretty easily that /users/activate/dchang is going to active someone elses&#8217; account&#8230; not great.</p>
<p>So, what is getActivationHash doing?  Basically, it&#8217;s taking the datetime of when the user created their account (this will be unique for each user), adding in the Day-Month-Year value (so that activation links only last for 24 hours) and combining the whole shebang with the Security.salt value from CakePHP&#8217;s core.ini and Hashing it (with either MD5 or SHA-1 depending on your Cake&#8217;s settings).  In case you are wondering, this process is called <a href="http://en.wikipedia.org/wiki/Salt_(cryptography)">salting</a> and it makes any unique value (such as a password, or MD5 hash), almost impossible to guess.</p>
<p>Okay, enough talk, let&#8217;s hook this into the register action so that this email gets sent out.</p>
<div class="dean_ch" style="white-space: nowrap; overflow: scroll;">
<span class="kw2">&lt;?php</span><br />
<span class="co2"># /controllers/users_controller.php</span><br />
<span class="co2"># please note that not all code is shown&#8230;</span><br />
uses<span class="br0">&#40;</span><span class="st0">&#8217;sanitize&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="kw2">class</span> UsersController <span class="kw2">extends</span> AppController <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> <span class="re0">$name</span> = <span class="st0">&#8216;Users&#8217;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Include the Email Component so we can send some out :)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> <span class="re0">$components</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&#8216;Email&#8217;</span>, <span class="st0">&#8216;Auth&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Allow users to access the following action when not logged in&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span> beforeFilter<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">Auth</span>-&gt;<span class="me1">allow</span><span class="br0">&#40;</span><span class="st0">&#8216;register&#8217;</span>, <span class="st0">&#8216;thanks&#8217;</span>, <span class="st0">&#8216;confirm&#8217;</span>, <span class="st0">&#8216;logout&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">Auth</span>-&gt;<span class="me1">autoRedirect</span> = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Allows a user to sign up for a new account</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span> register<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!<a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">data</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// See my previous post if this is forgien to you</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">data</span><span class="br0">&#91;</span><span class="st0">&#8216;User&#8217;</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#8216;password&#8217;</span><span class="br0">&#93;</span> = <span class="re0">$this</span>-&gt;<span class="me1">Auth</span>-&gt;<span class="me1">password</span><span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">data</span><span class="br0">&#91;</span><span class="st0">&#8216;User&#8217;</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#8216;passwrd&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">User</span>-&gt;<span class="me1">data</span> = Sanitize::<span class="me2">clean</span><span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">data</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Successfully created account &#8211; send activation email&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">User</span>-&gt;<span class="me1">save</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;__sendActivationEmail<span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">User</span>-&gt;<span class="me1">getLastInsertID</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// this view is not show / listed &#8211; use your imagination and inform</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// users that an activation email has been sent out to them.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">redirect</span><span class="br0">&#40;</span><span class="st0">&#8216;/users/thanks&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Failed, clear password field</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">data</span><span class="br0">&#91;</span><span class="st0">&#8216;User&#8217;</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#8216;passwrd&#8217;</span><span class="br0">&#93;</span> = <span class="kw2">null</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Send out an activation email to the user.id specified by $user_id<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &nbsp;@param Int $user_id User to send activation email to<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* &nbsp;@return Boolean indicates success<br />
&nbsp; &nbsp; &nbsp; &nbsp; */</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span> __sendActivationEmail<span class="br0">&#40;</span><span class="re0">$user_id</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$user</span> = <span class="re0">$this</span>-&gt;<span class="me1">User</span>-&gt;<span class="me1">find</span><span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&#8216;User.id&#8217;</span> =&gt; <span class="re0">$user_id</span><span class="br0">&#41;</span>, <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&#8216;User.email&#8217;</span>, <span class="st0">&#8216;User.username&#8217;</span><span class="br0">&#41;</span>, <span class="kw2">null</span>, <span class="kw2">false</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$user</span> === <span class="kw2">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; debug<span class="br0">&#40;</span><span class="kw2">__METHOD__</span>.<span class="st0">&quot; failed to retrieve User data for user.id: {$user_id}&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Set data for the &quot;view&quot; of the Email</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">set</span><span class="br0">&#40;</span><span class="st0">&#8216;activate_url&#8217;</span>, <span class="st0">&#8216;http://&#8217;</span> . env<span class="br0">&#40;</span><span class="st0">&#8216;SERVER_NAME&#8217;</span><span class="br0">&#41;</span> . <span class="st0">&#8216;/users/activate/&#8217;</span> . <span class="re0">$user</span><span class="br0">&#91;</span><span class="st0">&#8216;User&#8217;</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#8216;id&#8217;</span><span class="br0">&#93;</span> . <span class="st0">&#8216;/&#8217;</span> . <span class="re0">$this</span>-&gt;<span class="me1">User</span>-&gt;<span class="me1">getActivationHash</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">set</span><span class="br0">&#40;</span><span class="st0">&#8216;username&#8217;</span>, <span class="re0">$this</span>-&gt;<span class="me1">data</span><span class="br0">&#91;</span><span class="st0">&#8216;User&#8217;</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#8216;username&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">Email</span>-&gt;<span class="me1">to</span> = <span class="re0">$user</span><span class="br0">&#91;</span><span class="st0">&#8216;User&#8217;</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#8216;email&#8217;</span><span class="br0">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">Email</span>-&gt;<span class="me1">subject</span> = env<span class="br0">&#40;</span><span class="st0">&#8216;SERVER_NAME&#8217;</span><span class="br0">&#41;</span> . <span class="st0">&#8216; &#8211; Please confirm your email address&#8217;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">Email</span>-&gt;<span class="me1">from</span> = <span class="st0">&#8216;noreply@&#8217;</span> . env<span class="br0">&#40;</span><span class="st0">&#8216;SERVER_NAME&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">Email</span>-&gt;<span class="me1">template</span> = <span class="st0">&#8216;user_confirm&#8217;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">Email</span>-&gt;<span class="me1">sendAs</span> = <span class="st0">&#8216;text&#8217;</span>; &nbsp; <span class="co1">// you probably want to use both :)&nbsp; &nbsp; </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$this</span>-&gt;<span class="me1">Email</span>-&gt;<span class="me1">send</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="kw2">?&gt;</span></div>
<p>Okay, now we&#8217;re cooking &#8211; time to create the Email &#8220;views&#8221; which will be sent out with the emails &#8211; in case you are not familiar with the EmailComponent then now would be a good time to <a href="http://book.cakephp.org/view/176/email">refer to the CookBook</a>.  So, let&#8217;s create the plain text email template which will contain the activation link set above:</p>
<div class="dean_ch" style="white-space: nowrap; overflow: scroll;">
<span class="kw2">&lt;?php</span><br />
<span class="co2"># /app/views/elements/email/text/user_confirm.ctp</span><br />
<span class="kw2">?&gt;</span><br />
Hey there <span class="kw2">&lt;?</span>= <span class="re0">$username</span> <span class="kw2">?&gt;</span>, we will have you up and running in no <a href="http://www.php.net/time"><span class="kw3">time</span></a>, but first we just need you to confirm your user account by clicking the <a href="http://www.php.net/link"><span class="kw3">link</span></a> below:</p>
<p><span class="kw2">&lt;?</span>= <span class="re0">$activate_url</span> <span class="kw2">?&gt;</span></p>
<p>&nbsp;</p></div>
<p>Phew!  The end is in sight, just one more controller action to hook up (and probably the most important one) &#8211; /users/activate &#8211; I&#8217;m sure you can figure out what this is going to do.</p>
<div class="dean_ch" style="white-space: nowrap; overflow: scroll;">
<span class="kw2">&lt;?php</span><br />
<span class="co2"># /controllers/user_controller.php</span><br />
<span class="co2"># note that only the activate function is shown&#8230;</span></p>
<p><span class="coMULTI">/**<br />
&nbsp;* Activates a user account from an incoming link<br />
&nbsp;*<br />
&nbsp;* &nbsp;@param Int $user_id User.id to activate<br />
&nbsp;* &nbsp;@param String $in_hash Incoming Activation Hash from the email<br />
*/</span><br />
<span class="kw2">function</span> activate<span class="br0">&#40;</span><span class="re0">$user_id</span> = <span class="kw2">null</span>, <span class="re0">$in_hash</span> = <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">User</span>-&gt;<span class="me1">id</span> = <span class="re0">$id</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">User</span>-&gt;<span class="me1">exists</span><span class="br0">&#40;</span><span class="br0">&#41;</span> &amp;&amp; <span class="br0">&#40;</span><span class="re0">$in_hash</span> == <span class="re0">$this</span>-&gt;<span class="me1">User</span>-&gt;<span class="me1">getActivationHash</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Update the active flag in the database</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">User</span>-&gt;<span class="me1">saveField</span><span class="br0">&#40;</span><span class="st0">&#8216;active&#8217;</span>, <span class="nu0">1</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Let the user know they can now log in!</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">Session</span>-&gt;<span class="me1">setFlash</span><span class="br0">&#40;</span><span class="st0">&#8216;Your account has been activated, please log in below&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">redirect</span><span class="br0">&#40;</span><span class="st0">&#8216;login&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Activation failed, render &#8216;/views/user/activate.ctp&#8217; which should tell the user.</span><br />
<span class="br0">&#125;</span><br />
<span class="kw2">?&gt;</span></div>
<p>And there we have it, now when your users register they have to confirm their user accounts via Email &#8211; job done!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jonnyreeves.co.uk/2008/06/cakephp-activating-user-account-via-email/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
	</channel>
</rss>
