my email function is not working properly

PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!

Moderator: General Moderators

Post Reply
samiuddin
Forum Newbie
Posts: 1
Joined: Sat Dec 11, 2010 6:26 am

my email function is not working properly

Post by samiuddin »

When a user creates a new entry, it should send a mail to all other users that new entry has created. It is sending the mail but it is sending all
the user mails. for example i am having 5 users each user is suppose to get one mail, but they are getting 5 mails which i don't want.
I checked the code but i am unable to trace the bug.

Any help in this regard is appreciated.


Below is the code

Code: Select all

<?php
/**
 * LyftenBloggie 1.1.0 - Joomla! Blog Manager
 * @package LyftenBloggie 1.1.0
 * @copyright (C) 2009-2010 Lyften Designs
 * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
 * @link http://www.lyften.com/ Official website
 **/
 
// Disallow direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * LyftenBloggie Framework Settings class
 *
 * @static
 * @package	LyftenBloggie
 * @since	1.1.0
 **/
class BloggieEmail extends JObject
{
	var $_template;
	var $_db;
	var $_file;
		
	var $_values = array();
	var $_emails = array();

	/**
	 * Constructor
	 */
	function BloggieEmail()
	{
		parent::__construct();

		$this->_db = & JFactory::getDBO(); 
	}

	/**
	 * Returns a reference to a global Settings object, only creating it
	 * if it doesn't already exist.
	 *
	 * This method must be invoked as:
	 * 		$emailer = & BloggieEmail::getInstance();
	 *
	 * @access	public
	 * @return	BloggieEmail object.
	 */
	function &getInstance($sig = 'default')
	{
		static $instance;

		if (!isset($instance)) {
			$instance = array();
		}

		if (!isset($instance[$sig]))
		{
			$instance[$sig] = new BloggieEmail();
		}

		return $instance[$sig];
	}

	/**
	 * Template file name
	 *
	 * @param string $file
	 * @return 	void
	 **/
	public function setTemplate($file)
	{
		$file = str_replace('.tpl', '', $file);
		$this->_file = $file;
	}

	/**
	 * Push value, pattern assignment
	 *
	 * @param 	misc 	$value
	 * @param 	string 	$pattern
	 * @return 	void
	 **/
	public function assign($key, $value)
	{
		if(is_array($value))
		{
			foreach($value as $subkey=>$val)
			{
				if(is_string($val))
				{
					$this->_values[$key.'.'.$subkey] = $val;
				
				}
				
			}
		}else if(is_string($value))
		{
			$this->_values[$key] = $value;
			
		}
	}

	/**
	 * Method to determine to whom the email goes
	 *
	 * @return object
	 */
	function emailWho($entry_id = null)
	{
	
		//Emails from permissions
		$query = 'SELECT r.group'
			. ' FROM #__bloggies_groups AS r'
			. ' WHERE r.email_all = \'1\''
			. ' GROUP BY r.group';
		$this->_db->setQuery( $query );
		$groups = $this->_db->loadResultArray();
		$groups = implode( ',', $groups );

		$query = 'SELECT u.name, u.email, u.gid'
			. ' FROM #__users AS u'
			. ' WHERE u.gid IN ('. $groups .')';
		$this->_db->setQuery( $query );
		$emails = $this->_db->loadObjectList();

		//Email from entry
		if($entry_id)
		{
			//Set entry to template
			$this->setEntry($entry_id);

			//Lookup author email
			$query = 'SELECT u.name, u.email, u.gid'
				. ' FROM #__bloggies_entries AS e'
				. ' LEFT JOIN #__users AS u ON u.id = e.created_by'
				. ' WHERE e.id = \''.$entry_id.'\'';
			$this->_db->setQuery( $query );
			$users = $this->_db->loadObjectList();
			$emails = array_merge((array)$emails, (array)$users);
			
			
		}

		//Set them to the Object
		if(!empty($emails))
		{
			foreach($emails as $email)
			{
				//Get access group
				$accessGroups = BloggieAccess::getInstance($email->gid);

				//Ensure the user can get the email
				// if($accessGroups->get('emails.'.$this->_file) || $accessGroups->get('emails.receive_all'))
				if($accessGroups->get('emails.'.$this->_file) || $accessGroups->get('emails.receive_all'))
				
				{
					
					$this->_emails[$email->email] = $email->name;
					
					
				
				
				}
			
			}
				}
		
		unset($emails);
	return !empty($this->_emails);
	}

	/**
	 * Method to set entry to the template
	 *
	 * @return object
	 */
	function setEntry($entry_id = null)
	{
		if(!$entry_id) return;

		$query = 'SELECT e.title,'
			. ' CASE WHEN CHAR_LENGTH(e.alias) THEN CONCAT_WS(":", e.id, e.alias) ELSE e.id END as slug,'
			. ' CASE WHEN CHAR_LENGTH(c.slug) THEN c.slug ELSE 0 END as catslug'
			. ' FROM #__bloggies_entries AS e'
			. ' LEFT JOIN #__bloggies_categories AS c ON c.id = e.catid'
			. ' WHERE e.id = '.$entry_id
			;
		$this->_db->setQuery($query);
		$entry = $this->_db->loadAssoc();
		$entry['url'] = JRoute::_(JURI::base().'index.php?option=com_lyftenbloggie&view=entry&category='.$entry['catslug'].'&id='. $entry['slug']);
		unset($entry['slug']);
		unset($entry['catslug']);

		//assign entry to template
		$this->assign('entry', $entry);
	}

	/**
	 * Method to create a Joomla Mailer
	 *
	 * @return object
	 */
	function createMailObj($subject)
	{
		global $mainframe;

		//Load Joomla Mailer
		jimport('joomla.mail.mail');

		$mail	=& JFactory::getMailer();
		
		//Add Sender
		$mail->FromName	= $mainframe->getCfg('fromname');
		$mail->From		= $mainframe->getCfg('mailfrom');

		$mail->setSubject($subject);

		return $mail;
	}

	/**
	 * Method to send email
	 *
	 * @return boolean
	 */
	function sendMail($subject)
	{
		//Create Mailer
		$mailer = $this->createMailObj($subject);

		// Check if mail address is valid.
		$regexp	= "^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,4})$";

		//Send each email separately
		foreach ($this->_emails as $email=>$user)
		
		{
			if(!empty($email) && eregi($regexp, $email))
			{
				
                $mailer->AddAddress($email);
				
				$this->assign('receiver.name', $user);
                
				//set body and send
				if($body = $this->output())
				{
					$mailer->setBody($body);
					$mailer->Send();
					
				}
			
			
			}
		
		}
			return true;
	}

	/**
	 * Get output from template
	 *
	 * @return string
	 **/
	public function output()
	{
		if (!file_exists(BLOGGIE_ADMIN_PATH.DS.'framework'.DS.'emails'.DS.$this->_file.'.tpl')) return;

		$output = file_get_contents(BLOGGIE_ADMIN_PATH.DS.'framework'.DS.'emails'.DS.$this->_file.'.tpl');
	 
		foreach ($this->_values as $key => $value)
		{
			$tagToReplace = '{'.$key.'}';
			$output = str_replace($tagToReplace, $value, $output);
		}
	 
		return $output;
	}
}
?>
Last edited by Benjamin on Sat Dec 11, 2010 9:59 am, edited 1 time in total.
Reason: Added [syntax=php] tags.
User avatar
social_experiment
DevNet Master
Posts: 2793
Joined: Sun Feb 15, 2009 11:08 am
Location: .za

Re: my email function is not working properly

Post by social_experiment »

samiuddin wrote:I checked the code but i am unable to trace the bug
Isn't it possible that this script was designed to mail multiple people at once? Look at the emailWho() function, that's probably where the action happens. Also, try contacting the author of the script.
“Don’t worry if it doesn’t work right. If everything did, you’d be out of a job.” - Mosher’s Law of Software Engineering
Post Reply