Jump to content
  • Checkout
  • Login
  • Get in touch

osCommerce

The e-commerce.

Automatic Trigger Email Campaigns with MailBeez Modules


MailBeez

Recommended Posts

This is the official Support Forum for http://addons.oscommerce.com/info/7425

 

Hi all,

 

am working with osCommerce sind 2003 and after a couple of ecommerce projects I wanted to be able to automize emails - for almost 5 years I was looking for a simple solution to build automatic email campaigns. Currently between jobs I was able to invest some time to develop MailBeez.

 

MailBeez is a modular system for the implementation of Automatic Aftersales Trigger Email Campaigns.

 

 

examples:

 

  • Customer satisfaction surveys after a defined number of days after sending
  • Review Reminder after a couple of weeks
  • Birthday and Season Greetings in connection with Coupon Codes
  • Service Emails for e.g. wearing parts, maintenance updates
  • Customer reactivation emails – make a personal offer e.g. 6 months after last order
  • Payment reminder of e.g. Cash in Advanced or Invoice payments

 

 

 

MailBeez supports the development of both Transactional and Recurring Trigger Email Campaigns.

 

Enjoy MailBeez and let me know what you think.

 

Cord

Link to comment
Share on other sites

  • 2 weeks later...

New MailBeez Modules are available:

 

MailBeez Module: Review Reminder

http://addons.oscommerce.com/info/7433

 

MailBeez Module: Share Review on Facebook

http://addons.oscommerce.com/info/7434

 

MailBeez Module: Winback Customer Reactivation

http://addons.oscommerce.com/info/7432

 

 

in progress:

 

* Recover Cart Sales

* X-Sell Cross Sell Emails

Link to comment
Share on other sites

I did have another thought, while talking over some ideas, perhaps mail beezs should be linked to the newsletter option value, in the customer accounts or ever create a secondary account option like email notifications? y/n.

Link to comment
Share on other sites

I did have another thought, while talking over some ideas, perhaps mail beezs should be linked to the newsletter option value, in the customer accounts or ever create a secondary account option like email notifications? y/n.

 

Hi Sublok,

 

In my sales region it is legally ok to send email related to a business-interaction w/o an additional agreement.

Therefore I have following approach implemented in my prototype system: Customers can "block" each module by clicking on a link "no emails like this" (one-click-blocking - no password).

Hope I will soon find some time to integrated this into MailBeez

 

Otherwise you can always use SQL join queries to check additional values, example could be a MailBeez Module which sends an update to all subscribers of "products_notifications" in case of e.g. the product gets a promotional price in "specials".

 

enjoy mailbeez!

Link to comment
Share on other sites

hi cord

I would like to expose here the conversation we had by mail.

I would like to make mailbeez more versatile, I mean that all kind of mail we send to the customers have the same look. So because the structure there are too many things to be modified. I would like to work on a line that these changes could be correctly adapted to this wonderful contribution. So for you Cord and the people interesting on contribute in this module, I would like to invite you to make your appointments and suggestions

 

regards,

Irene

Link to comment
Share on other sites

hi cord

I would like to expose here the conversation we had by mail.

I would like to make mailbeez more versatile, I mean that all kind of mail we send to the customers have the same look. So because the structure there are too many things to be modified. I would like to work on a line that these changes could be correctly adapted to this wonderful contribution. So for you Cord and the people interesting on contribute in this module, I would like to invite you to make your appointments and suggestions

 

regards,

Irene

 

hi irene,

 

I hope the way mailbeez is build makes it easy to adapt your emails to have a common look.

 

Common Look

in "mailhive/common/templates" you find a HTML-template which defines the common frame-template for all mailbeez-modules. Change this template to your common look.

 

specific content

In "mailhive/mailbeez/<mailbeezmodule>/email" you find the content-template for each mailbeez-module. Change the content of the emails you would like to send.

 

 

Any idea how to make it more versatile without adding complexity and still keep mailbeez modules easy to "plugin"?

 

regards

cord

Link to comment
Share on other sites

Updates:

 

MailBeez Version 1.2

 

Bugfixes:

  • support of SSL in admin
  • set new doctype in admin/mailbeez.php to avoid issues with CeeBox in MS IE

 

New MailBeez Module:

MailBeez Module: Contact Customers without purchase (no order)

http://addons.oscommerce.com/info/7453

Link to comment
Share on other sites

I just installed ver 1.2 and I can't get by the install step in admin. The button is still there after I have clicked it. I can see the table in the db has been created and it has 7 columns inside.

Any ideas why it don't take me to the settings after clicking the install button?

 

Also, I see you have made the link as nonssl in admin:

. '<br><a href="' . tep_href_link(FILENAME_MAILBEEZ, '', 'NONSSL') . '">MailBeez</a><br>'

I'm running it as ssl. Any special reason for making it nonssl when all other admin links are ssl??

Link to comment
Share on other sites

hi MikeMike,

 

the installation should be one-click - have designed and tested it with osCommerce, Zencart, CRELoaded and xtcommerce.

 

I guess you are having some kind of configuration caching in your admin site or some modifications around the config-values.

 

If you can't pass the "install"-button, the following check fails and therefore shows the install-button:

 

if (defined('MAILBEEZ_MAILHIVE_STATUS')) {... } else { // install}

 

 

Please check:

1. can you find 'MAILBEEZ_MAILHIVE_STATUS' in you configuration-table?

2. is there any configuration-cache in your system?

 

if you have a config-cache please let me know what to call for a reset, I will then add it to mailbeez.

 

For a quick fix you have to add you config-reset-call like this:

 

if (function_exists('tep_reset_config_cache_block')) {

tep_reset_config_cache_block('includes/config-cache.php');

}

 

if (function_exists('updateConfiguration')) {

updateConfiguration();

}

 

 

SSL: no, there is no reason not to call it as SSL, can't remember why thers is "NONSSL" in the link...

Link to comment
Share on other sites

hi MikeMike,

 

the installation should be one-click - have designed and tested it with osCommerce, Zencart, CRELoaded and xtcommerce.

 

I guess you are having some kind of configuration caching in your admin site or some modifications around the config-values.

 

If you can't pass the "install"-button, the following check fails and therefore shows the install-button:

 

 

 

 

Please check:

1. can you find 'MAILBEEZ_MAILHIVE_STATUS' in you configuration-table?

2. is there any configuration-cache in your system?

 

if you have a config-cache please let me know what to call for a reset, I will then add it to mailbeez.

 

For a quick fix you have to add you config-reset-call like this:

 

 

 

 

SSL: no, there is no reason not to call it as SSL, can't remember why thers is "NONSSL" in the link...

 

 

Thanks!

I do have configuration cache installed. This is the add-on: http://addons.oscommerce.com/info/1862

 

I disabled it as described in the install instructions:

 

Removal

 

To disable this contribution, set the $config_cache_file variable to '' in admin/includes/configuration_cache_read.php and catalog/includes/configuration_cache_read.php.

 

and then I finally got to the settings instead of the install button. I guess I'll have to reset the cache before enabling it again, but I wasn't sure where to put your quick fix code...

Link to comment
Share on other sites

 

just check the contribution... not very elegant to work with an include instead of function-call :-o

 

Since admin/mailbeez.php is very similar to modules.php you need to do the same adjustments as described in the installation:

 

if (tep_not_null($action)) {

switch ($action) {

case 'save':

while (list($key, $value) = each($HTTP_POST_VARS['configuration'])) {

tep_db_query("update " . TABLE_CONFIGURATION . " set configuration_value = '" . $value . "' where configuration_key = '" . $key . "'");

}

 

// Configuration Cache modification start

require ('includes/configuration_cache.php');

// Configuration Cache modification end

 

tep_redirect(tep_href_link(FILENAME_MODULES, 'set=' . $set . '&module=' . $HTTP_GET_VARS['module']));

break;

case 'install'

 

All settings and options are stored in the configuration-system. So you need to add this to mailbeez.php otherwise your settings and changes in mailbeez are not saved.

Link to comment
Share on other sites

hi mailbeez

 

great job !

i´ve installed mailbeez in our testshop. started by hand - it works fine.

but if i set a cronjob (for example at http://www.cron-job.org)i get an error.

the response is too big to handle. the URL has mor than 1024 Bytes Data. execution canceled.

wow can i solve the problem.

 

the cronjob - calls the secure url - like this ... http://your-server.com/mailhive.php?57baa03dfcb9b8e33c2a6eb51c9a5147=run

 

greets from germany

 

andy

Link to comment
Share on other sites

the response is too big to handle. the URL has mor than 1024 Bytes Data. execution canceled.

 

looks like the cron-service doesn't like that mailhive.php generated output.

 

So I will need to build in a "silent mode"...

 

In the meantime you could do following workarounds:

  1. find another cronjobservice that supports output
  2. build a php page which uses curl to call the mailhive url

 

 

for 2. you could use something like minihive.php and call this through the cronjob

 

 

minihive.php (not tested)

<?php
   function getCurlContent($url) {
     $ch = curl_init();
     curl_setopt($ch, CURLOPT_URL, $url);
     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,  2);
     curl_setopt($ch, CURLOPT_USERAGENT, $this->user_agent);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
     curl_setopt($ch, CURLOPT_TIMEOUT, 30);
     $content = curl_exec ($ch);

     if (empty($content)) {
       print curl_error($ch);
     } else {
       $info = curl_getinfo($ch);
     }

     curl_close ($ch);
     return $content;
   }	

   $url = "http://yourserver.com(...)"; // mailhive-url to call
   $return = getCurlContent($url); // run the mailhive url request

   echo "ok"; // just a short output.

?>

 

german greetings from denmark ;-)

Link to comment
Share on other sites

Hi Mailbeez,

 

Congratulations for your great work !

I've a little problem : i just want to insert some php in the birthday mail and i do not know how to do.

I've read some stuff on the web but nothing can help me.

 

I've a php file with php and i want to call him in the tpl.

 

Thxs for help

 

Fharos

Link to comment
Share on other sites

hi fharos,

 

you need to do your php-stuff in the birthday.php file and assign the result to a new placeholder, e.g. like this:

 

function getAudience() {
(...)

 // do it here if it is common for all
 $fharosResult = fharosPHPCall();

 while ($item = mh_db_fetch_array($query)) {
   // mandatory fields:
   // - firstname
   // - lastname
   // - email_address
   // - customers-id


   // do it here if you want to personalize it
   $fharosResult = fharosPHPCall();

   $this->audience[$item['customers_id']] = array(
       'firstname' => $item['customers_firstname'],
       'lastname' => $item['customers_lastname'],
       'email_address' => $item['customers_email_address'],
       'customers_id' => $item['customers_id'],
       'date_of_birth' => $item['date_of_birth'],
       'fharos_cool_stuff' => $fharosResult // here you assign the content of the placeholder
       );
  }
 return $this->audience;
}

 

in the tpl file you can do the output like this:

 

...
look at this: [b]$fharos_cool_stuff[/b]
...

 

please let us know what smart things you are doing (a coupon-code?) - might be of interest for many others as well ;-)

Link to comment
Share on other sites

THXS,

 

I think i'm stupid (off course i'm french ;-) )

It doesn't work.

 

I'm a beginner in php development.

 

I've a php file named : coupon_dob.php placed in : catalog/mailhive/mailbeez/email

This file contain a little part of code like this :

<?php

           $jour = date('j');
           $mois = date('m');

           //

if ($jour == 22 && $mois == 06) 
{
$dob = "France will not win the Fifa World Cup......."; 
}
else
{
$dob = "Off course not !";
}
?>

 

And my birthday.php file contains this :

<?php
/*
 MailBeez Automatic Trigger Email Campaigns
 http://www.mailbeez.com

 Copyright (c) 2010 MailBeez

inspired and in parts based on
 Copyright (c) 2003 osCommerce

 Released under the GNU General Public License
*/


// make path work from admin
 require_once(DIR_FS_CATALOG. 'mailhive/common/classes/mailbeez.php');	

// could be in language-file
// just easier to define it in the mailbee
define('MAILBEEZ_BIRTHDAY_TEXT_TITLE', 'Birthday Greetings');
define('MAILBEEZ_BIRTHDAY_TEXT_DESCRIPTION', 'Be nice and remember the Birthday of your customers - this MailBeez Module sends birthday greetings.');	

 class birthday extends mailbeez {
	// class constructor
   function birthday() {
		// call constructor
		mailbeez::mailbeez(); 

		// set some stuff:	
     $this->code = 'birthday';
		$this->module = 'birthday';
		$this->version = '1.1'; // float value
		$this->iteration = date('Y'); // year
     $this->title = MAILBEEZ_BIRTHDAY_TEXT_TITLE;
     $this->description = MAILBEEZ_BIRTHDAY_TEXT_DESCRIPTION;
     $this->sort_order = MAILBEEZ_BIRTHDAY_SORT_ORDER;
     $this->enabled = ((MAILBEEZ_BIRTHDAY_STATUS == 'True') ? true : false);
		$this->sender = MAILBEEZ_BIRTHDAY_SENDER;
		$this->sender_name = MAILBEEZ_BIRTHDAY_SENDER_NAME;
		$this->status_key = 'MAILBEEZ_BIRTHDAY_STATUS';


		$this->documentation_key = $this->module; // leave empty if no documentation available
		// $this->documentation_root = 'http:://yoursite.com/' // modify documentation root if necessary

		$this->htmlBodyTemplateResource = 'body_html.tpl'; // located in folder of this module
		$this->txtBodyTemplateResource = 'body_txt.tpl'; // located in folder of this module			
		$this->subjectTemplateResource = 'subject.tpl'; // located in folder of this module

		$this->audience = array();
		$this->additionalFields = array('customers_id' => '007','date_of_birth' => '31.01.'); // list of additional fields to show in listing with testvalues
		// list of additional fields to show in listing with testvalues used for Test-Mail

}

// class methods
	function getAudience() {
		global $languages_id;

     $query_raw = "select c.customers_firstname, c.customers_lastname, 
													c.customers_id, c.customers_email_address, c.customers_dob, date_format(c.customers_dob, '%d.%m.') as date_of_birth
										      from " . TABLE_CUSTOMERS . " c
										      where date_format(c.customers_dob,'%m%d') < ( date_format(now(),'%m%d')+ " . MAILBEEZ_BIRTHDAY_BEFORE_DAYS . ") and
														date_format(c.customers_dob,'%m%d') > ( date_format(now(),'%m%d')- ". MAILBEEZ_BIRTHDAY_PASSED_DAYS_SKIP . ")";		

		$query = mh_db_query($query_raw);

		// for early check
		$mb_chk = new mailbeez_mailer($this);						

		while ($item = mh_db_fetch_array($query)) {
		// mandatory fields:
		// - firstname
		// - lastname
		// - email_address
		// - customers-id -> block

		// other keys are replaced while sending: $<key>

			// early check to avoid processing when email was already sent
			$chk_result = $mb_chk->check($this->module, $this->iteration, $item['customers_id']);
			if ($chk_result != false) {
				// this iteration for this customer was already sent -> skip
				continue;
			}

			$this->audience[$item['customers_id']] = array('firstname' => $item['customers_firstname'],
																										 'lastname' => $item['customers_lastname'],
		                                                 'email_address' => $item['customers_email_address'],
																										 'customers_id' => $item['customers_id'],
																										 'date_of_birth' => $item['date_of_birth']
																										 );
		}
		return $this->audience;
	}


	// installation methods

   function keys() {
     return array('MAILBEEZ_BIRTHDAY_STATUS', 'MAILBEEZ_BIRTHDAY_BEFORE_DAYS', 'MAILBEEZ_BIRTHDAY_PASSED_DAYS_SKIP', 'MAILBEEZ_BIRTHDAY_SENDER', 'MAILBEEZ_BIRTHDAY_SENDER_NAME', 'MAILBEEZ_BIRTHDAY_SORT_ORDER');
   }

   function install() {
		mh_insert_config_value(array('configuration_title' => 'Send birthday reminder', 
																 'configuration_key' => 'MAILBEEZ_BIRTHDAY_STATUS', 
																 'configuration_value' => 'False', 
																 'configuration_description' => 'Do you want to send  birthday emails?', 
																 'set_function' => 'mh_cfg_select_option(array(\'True\', \'False\'), '
																 ));

		mh_insert_config_value(array('configuration_title' => 'Set days before', 
																 'configuration_key' => 'MAILBEEZ_BIRTHDAY_BEFORE_DAYS', 
																 'configuration_value' => '1', 
																 'configuration_description' => 'number of days before birthday sending the emails', 
																 'set_function' => ''
																 ));

		mh_insert_config_value(array('configuration_title' => 'Set days to skip after', 
																 'configuration_key' => 'MAILBEEZ_BIRTHDAY_PASSED_DAYS_SKIP', 
																 'configuration_value' => '2', 
																 'configuration_description' => 'number of days after which do skip the birthday email (in case cron job failed)', 
																 'set_function' => ''
																 ));

		mh_insert_config_value(array('configuration_title' => 'sender email', 
																 'configuration_key' => 'MAILBEEZ_BIRTHDAY_SENDER', 
																 'configuration_value' => STORE_OWNER_EMAIL_ADDRESS, 
																 'configuration_description' => 'sender email', 
																 'set_function' => ''
																 ));

		mh_insert_config_value(array('configuration_title' => 'sender name', 
																 'configuration_key' => 'MAILBEEZ_BIRTHDAY_SENDER_NAME', 
																 'configuration_value' => STORE_NAME, 
																 'configuration_description' => 'sender email', 
																 'set_function' => ''
																 ));


		mh_insert_config_value(array('configuration_title' => 'Sort order of display.', 
																 'configuration_key' => 'MAILBEEZ_BIRTHDAY_SORT_ORDER', 
																 'configuration_value' => '20', 
																 'configuration_description' => 'Sort order of display. Lowest is displayed first.', 
																 'set_function' => ''
																 ));
   }
 }
?>

When i sending my birthday mail, i want to insert the $dob value (it will be a 5 items code) in this mail in order to offer a reduction to my client

 

Your method is quiet to difficult for me ! lol

And don't forget i'm french ........ ;-)

Link to comment
Share on other sites

try this:

(try to read and understand before copy&paste&complain ;-) )

 

 

<?php
// make it a function
function fharos_is_cool() {
 global $language; // you might need to define some globals
 $jour = date('j');
 $mois = date('m');
 if ($jour == 22 && $mois == 06) {
  $dob = "France will not win the Fifa World Cup......."; 
 } else {
  $dob = "Off course not !";
 }
 return $dob;
}
?>

 

 

<?php
/*
 MailBeez Automatic Trigger Email Campaigns
 (...)
*/

// include fharos file
require_once(DIR_FS_CATALOG. 'mailhive/mailbeez/email/coupon_dob.php' );

(...) // no changes

$this->audience[$item['customers_id']] = array('firstname' => $item['customers_firstname'],
'lastname' => $item['customers_lastname'],
'email_address' => $item['customers_email_address'],
'customers_id' => $item['customers_id'],
'date_of_birth' => $item['date_of_birth'],
'dob' => fharos_is_cool() // call the function, added to have field $dob to use in tpl.
);
(...)
?>

 

hope this helps, otherwise you first need to understand more about programming

Link to comment
Share on other sites

Thxs mailbeez,

 

I better understand the system with you now.

Unfortunately, even using it, it does not work.

 

$dob is appearing in the mail like this : "$dob" !!

 

I put my code below.

function getAudience() {
		global $languages_id;

     $query_raw = "select c.customers_firstname, c.customers_lastname, 
													c.customers_id, c.customers_email_address, c.customers_dob, date_format(c.customers_dob, '%d.%m.') as date_of_birth
										      from " . TABLE_CUSTOMERS . " c
										      where date_format(c.customers_dob,'%m%d') < ( date_format(now(),'%m%d')+ " . MAILBEEZ_BIRTHDAY_BEFORE_DAYS . ") and
														date_format(c.customers_dob,'%m%d') > ( date_format(now(),'%m%d')- ". MAILBEEZ_BIRTHDAY_PASSED_DAYS_SKIP . ")";		

		$query = mh_db_query($query_raw);

		// for early check
		$mb_chk = new mailbeez_mailer($this);						

		while ($item = mh_db_fetch_array($query)) {
		// mandatory fields:
		// - firstname
		// - lastname
		// - email_address
		// - customers-id -> block

		// other keys are replaced while sending: $<key>

			// early check to avoid processing when email was already sent
			$chk_result = $mb_chk->check($this->module, $this->iteration, $item['customers_id']);
			if ($chk_result != false) {
				// this iteration for this customer was already sent -> skip
				continue;
			}

			$this->audience[$item['customers_id']] = array('firstname' => $item['customers_firstname'],
																										 'lastname' => $item['customers_lastname'],
		                                                 'email_address' => $item['customers_email_address'],
																										 'customers_id' => $item['customers_id'],
																										 'date_of_birth' => $item['date_of_birth'],
																										 'dob' => fharos_is_cool()
																										 );
		}
		return $this->audience;
	}

 

After I lower my arms!

Thxs a lot for the help

 

Fharos

Link to comment
Share on other sites

Thank you Mailbeez for this amazing and easy to use software.

 

is there a way to send to a customer with country code x email template 1

and send all other customer [excluding country code x] template 2?

i've seen this option in zen-cart module autoresponder+

 

have a nice weekend :)

Link to comment
Share on other sites

is there a way to send to a customer with country code x email template 1

and send all other customer [excluding country code x] template 2?

i've seen this option in zen-cart module autoresponder+

hi b_funtomas,

 

yes, it is possible and would currently be done in the mailbeez-module (there might be a future version with a more generic way of doing it). Similar e.g. the "reviee" module you can have a number of subtemplates and use the depending on the country code

 

1. assign subtemplates in the class-contructor of your MailBeez Email Module (e.g. "birthday.php")

$this->htmlCC_1 = 'cc_1_html.tpl'; // located in folder of this module
$this->txtCC_1 = 'cc_1_txt.tpl';

$this->htmlCC_2 = 'cc_2_html.tpl';
$this->txtCC_2 = 'cc_2_txt.tpl';

(...) // assign a subtemplate for each country-code, the .tpl files need to in the <module>/email/ folder

 

now you need to modifiy the SQL-query in getAudience() that you are able to use the country-code (joining table address-book)

 

(am to lazy to do it .... you might take it from autoresponder+ ?)

 

2. do stuff in getAudience();

// load subtemplates
$htmlCC_1 = $this->loadResource($this->pathToMailbeez . $this->module. '/email/' . $this->htmlCC_1);
$txtCC_1 = $this->loadResource($this->pathToMailbeez . $this->module. '/email/' . $this->txtCC_1);
$htmlCC_2 = $this->loadResource($this->pathToMailbeez . $this->module. '/email/' . $this->htmlCC_2);
$txtCC_2 = $this->loadResource($this->pathToMailbeez . $this->module. '/email/' . $this->txtCC_2);

(...) for each CC

(keep the code)

(modify your SQL query to get the countrycode for each customer)

// loop through the customers
while ($item = mh_db_fetch_array($query)) {
// mandatory fields:
// - firstname
// - lastname
// - email_address
// - customers-id -> block

// other keys are replaced while sending: $<key>

// assign the vars you would like to use in the CC subtemplate (e.g. "$firstname")
$subTemplateVars = array('firstname' => $item['customers_firstname'],
                         'lastname' => $item['customers_lastname']
);

// switch to the right subtemplate based on the customers country code
if ($item['customers_countrycode'] == 1) {
	$customers_cc_html = $htmlCC_1;
	$customers_cc_txt = $txtCC_1;
} elseif ($item['customers_countrycode'] == 2) {
	$customers_cc_html = $htmlCC_2;
	$customers_cc_txt = $txtCC_2;
}

 // replace vars in subtemplate
$htmlCCOut = $this->replace_variables($customers_cc_html, $subTemplateVars);
$txtLCCOut = $this->replace_variables($customers_cc_txt, $subTemplateVars);


 $this->audience[$item['customers_id']] = array('firstname' => $item['customers_firstname'],
					 'lastname' => $item['customers_lastname'],
					 'email_address' => $item['customers_email_address'],
					 'customers_id' => $item['customers_id'],
					 'cc_html' => $htmlCCOut, // assign the personalized, localized message
					 'cc_text' => $txtLCCOut
					);

}

your body_html.tpl could look like this

$cc_html

 

and your cc_1_html.tpl like this:

Dear $firstname $lastname,

you have country code 1


 

so the localized content is moved into a subtemplate.

 

Might not be the most elegant way of doing it, but that is how you can do it today.

Link to comment
Share on other sites

Hi Mailbeez !

 

I finally managed to put up my voucher system. Thanks to your explanation with fantomas. Thank you very much.

 

However, I have another question now : is there a way to place a monitoring of these emails?

Know who purchased ?

 

Advance thank you

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...