Help Portal

Documentation & Support

We have prepared a list of terms and their definitions to make you familiar with Oempro:


The power user who has full control over users. There can be only one administrator on a single Oempro installation.


Client(s) can be created by users. These client accounts are useful for providing real-time campaign statistics and reports to the campaign owner. Let’s say, if user has sent a campaign on behalf of a customer, user can provide access to the customer and provide real-time statistics.

Custom Field

Oempro gives you opportunity to store different kind of information for your subscribers such as age, address or any other information. Users can create unlimited custom fields for each subscriber list


According to Wikipedia, opt-in is a term used when someone is given the option to receive “bulk” e-mail, that is, e-mail that is sent to many people at the same time. Typically, this is some sort of mailing list, newsletter, or advertising. Obtaining permission before sending e-mail is critical because without it, the e-mail is Unsolicited Bulk Email, better known as spam.

Subscriber List

Subscriber lists store your subscribers (contacts). Each list may have different settings and preferences such as opt-in type, auto responders, custom fields, etc.


User(s) can create subscriber lists, import email addresses, send campaigns and track results. User accounts can be created by administrator or they can sign-up to the system

Suppression List

A Suppression List is a list of suppressed e-mail addresses used by e-mail senders to comply with the CAN-SPAM Act of 2003. CAN-SPAM requires that senders of commercial emails provide a functioning opt-out mechanism by which email recipients can unsubscribe their email address from future email messages.

If you can not find the term you are looking for here, just post it to the comments below and we will add it to the list.

Oempro is a leading PHP based Enterprise Grade Email Marketing solution – which can be used by small and medium sized companies as well the ESP (Email Service Provider) edition can be used for large providers wanting to start their own Email Marketing Services business.

Oempro also provides a robust api which can be used to perform many backend functions to create users, campaigns, mailing lists etc. The next topic is the installation plan and we will create a check list and take a look at the pre-requisites required for the Oempro installation.

Installation Plan

These steps should be followed to install Oempro on your server:

  1. Check server settings
  2. Download the Oempro package from the client area
  3. Download the license key from the client area (license.dat)
  4. Unzip the Oempro package
  5. Upload Oempro files to your server
  6. Setup directory and file permissions
  7. Prepare the MySQL database
  8. Run the web based installation utility

System Requirements

We have tried our best to make Oempro work on all kinds of platforms. We have listed out the default settings required for Oempro installation to function properly. If your server meets the following requirements (most of them are default settings), Oempro will run on your server:

Server Side Requirements

Linux/Unix, Windows or Mac OS X

Web Server
Apache, Microsoft IIS or any similar web server

PHP Version
PHP v5.1 or above with Ioncube Loaders

PHP Extensions
imap extension — for POP3 bounce processing
curl extension — for remote content fetching

PHP Settings
safe_mode — should be turned OFF
magic_quotes_gpc — should be turned OFF
register_globals — should be turned OFF

MySQL v4.11 or above (v5 or higher suggested)
CRON/Scheduled Tasks

In order to allow Oempro to handle the email delivery, auto responders and bounce handling for you, you will need to setup cron jobs (default) or scheduled tasks in Windows (default)

Client Side Requirements

Web Browser
Firefox 2+, Safari 3+, Internet Explorer 7+

In order to allow Oempro to handle the email delivery, auto responders and bounce handling for you, you will need to setup cron jobs (default) or scheduled tasks in Windows (default)

Check Server Settings

Be sure that your server meets the listed server requirements.

If you are not sure about your server settings, feel free to get in touch with our support team. Please visit the client area and click Open Support Ticket link on the left menu.

If some components are missing or there’s an incompatibility with your server settings, you may contact your server administrator and request assistance.

Download The Oempro Package From The Client Area

After your purchase gets completed, you will receive an order confirmation email from us. This email contains link to your client area and username/password information to login.

Once you are logged into the client area, you can download your purchased products with a single click.

If you have forgotten (or don’t know) your client area login information, simply click Forgot Password link on the client area login screen and enter the email address you have submitted while purchasing.

Here’s a screen shot of the client area welcome page which allows you to download purchased products with a single-click:

Unzip The Oempro Package

All packages are available for download in ZIP format in the client area. You will need unzip application to unzip the downloaded package.

Most recent operating systems (Mac OS X, Windows, Linux, etc.) comes with a built-in unzip tool.

  • Create a directory on your computer and move the downloaded ZIP file inside this directory
  • Unzip the ZIP package inside the directory

Upload Oempro Files To Your Server

Now, you need to decide where to install Oempro on your web site. It can be one of the following:

  • sub-directory (
  • root directory (
  • sub-domain (

Once you decide the location, open your FTP client and upload all Oempro files and directories to the location on your server. This process may take a while depending on your internet connection speed.

Upload the license.dat to your [install_path]/data directory.

Setup Directory And File Permissions

Once upload process is completed, you will need to change file and directory permissions for the following:

[install_path]/data (including all directories and files inside this directory)
This can be done via your FTP client by setting up directory and file permissions to 0777. If you prefer SSH, just execute the following command on your SSH Terminal:

chmod -R 0777 /path/to/oempro/data

Prepare The MySQL Database

Oempro needs a MySQL database to store its data such as users, campaigns and subscribers. You can either use your existing MySQL database or create a dedicated MySQL database for Oempro on your server.

Oempro database tables are prefixed with “oempro_”. Therefore, there will be no chance to conflict with any other existing table in your database.

Oempro is not compatible with STRICT_MODE MySQL configuration. This option is disabled by default on MySQL servers but it might have been enabled for your server. If it is enabled, simply contact your server administrator or edit MySQL configuration file to remove STRICT_MODE from sql_mode parameter in MySQL configuration file

Run The Web Based Installation Utility

Point your web browser to

It’s assumed that Oempro is being installed on address. Please change it according to your own uploaded directory and URL.

Following screen shots show the installation progress. It will take only a minute if you have configured your server properly before installation:

Installation Options

Fields Explained
Application Path
Type the path where Oempro is uploaded – the full path must be entered. Be sure that there’s no ending slash. Example: /home/octeth/www/oempro
Application URL
Type the URL of your Oempro. Be sure that there’s no ending slash. Example:
MySQL Host
Type in the host name (or IP address) of your MySQL server if it is different than “localhost”
MySQL Username
Type in the username which is used to access MySQL Database
MySQL Password
Type in the password for the MySQL username you entered
MySQL Database
Type in the name of the MySQL Database you are going to use for Oempro
Type in the name of the person who will be administrating the whole system
Email Address
Type in the valid Email address
Type in the preferred administrative username
Type in the preferred password for the administrative username

Once the installation is over you will see the installation completed screen as shown in the below screenshot. Please make sure that you remove the install directory once the installation is completed.

Friendly URL’s

Friendly URLs allow you and your users to use Oempro with nice and clean URLs. By default, Oempro admin and user area URLs are like below: or

When you enable friendly URL’s the links will look like: or

To enable this you will need to follow the steps below.

  • Make sure that you have URL rewriting enabled within your Apache. [if its not talk to your hosting provider]
  • Set HTACCESS_ENABLED configuration option to TRUE in /oempro_path/data/ file.
  • Rename htaccess file to .htaccess in oempro_path/app/ directory.

​Scheduled Tasks Setup

CRON Jobs (Scheduled Tasks in Windows) are used to trigger certain commands periodically. Oempro uses cron jobs extensively to automate some processes such as email sending, auto responder sending and list synchronization.

This guide will describe how to setup both CRON (in *nix/Mac OS X/Linux) and Scheduled Tasks (in Windows) step by step.

Oempro comes with 4 main cron modules.

  1. General processes
  2. Email campaign send engine
  3. Auto responder send engine
  4. List synchronization

If you are going to use the pop3 method for bounce, spam complaints and email request processing you will also have to add bounce, spam and request processing modules to the cron as well.

  • Bounce handling (POP3 method)
  • SPAM complaint handling (POP3 method)
  • Email request handling (POP3 method)

Each periodical process in Oempro has been separated into different CRON job commands to maximize the performance and avoid the waiting time until one process gets completed.

Oempro CRON and email piping methods (described in the next chapter) are located under [installation_path]/oempro/cli/ directory:


The above screen shows that there are many files under “cli” directory. We will explain each file later on in this chapter.

Setting up cron jobs vary based on your operating system. In this guide, we will explain how to set cron jobs for Linux and Windows operating systems. Please contact your hosting provider to learn more about how to set it on your own hosting environment.

How To Setup CRON Jobs? (*nix, Mac OS X, Linux)

There are two methods for setting up CRONs in Oempro. You need to select the appropriate method based on your server configuration:

  • Command line CRON modules
    This method needs SSH/Telnet access to your server and execute
  • Regular CRON modules
    This method is easier to setup and more compatible with wide range of server (and hosting) types

Command Line CRON Modules
Command line compatible cron jobs are located under [oempro directory]/cli/. These CRON modules must be executed with the PHP interpreter on your server:

Type the following command to edit the existing CRON jobs.

$ crontab –e

Add the following new CRON jobs:

* * * * * php -d safe_mode=off -f /path/to/oempro/cli/send.php >/dev/null
* * * * * php -d safe_mode=off -f /path/to/oempro/cli/sync.php >/dev/null
* * * * * php -d safe_mode=off -f /path/to/oempro/cli/transactional_send.php >/dev/null
* * * * * php -d safe_mode=off -f /path/to/oempro/cli/general.php >/dev/null

Now Save the file and crontab should report – Installing New Crontab

Regular CRON Modules
Web browser compatible cron jobs are located under [oempro_directory]/cli/ and they start with “web_” and “pop3_” prefix:

  • web_send.php
  • web_sync.php
  • web_transactional_send.php
  • web_general.php
  • pop3_bounce.php
  • pop3_fbl.php
  • pop3_requests.php

These CRON jobs must be executed with a web browser (Firefox, Internet Explorer, Safari, etc.) or a command line based browser such as (wget or curl). We suggest using these modules if you are unable to execute command line compatible CRON jobs. They are less affected by your web server configuration and limits.

In order to setup these cron jobs on your web server, login to your server via telnet or SSH and follow these steps:

  1. pe the following command to edit the existing CRON jobs.crontab –e
  2. Add the following new CRON jobs:* * * * * curl -s >/dev/null
    * * * * * curl -s >/dev/null
    * * * * * curl -s >/dev/null
    * * * * * curl -s >/dev/null
    * * * * * curl -s >/dev/null
    * * * * * curl -s >/dev/null
    * * * * * curl -s >/dev/null
  3. Now Save the file and crontab should report – Installing New Crontab

That’s it – you are done with the CRON setup and the server will execute the three jobs every minute.

How To Setup Scheduled Tasks? (Windows)

The following procedure explains how to setup scheduled tasks for Oempro scheduled tasks in Microsoft Windows operating system.

The scheduled tasks that we will setup will execute the wget command to load Oempro scheduled task modules. The wget command is not available in the default installation of Windows operating system. Therefore, you will need to download wget application and install it before setting up scheduled tasks in Windows.

Downloading and Installing wget

  1. Go to and download wget application for Microsoft Windows
  2. Copy all DLL files to your C:\WINDOWS\system32 directory
  3. Copy wget.exe file to C:\WINDOWS\ directory

There are several wget binaries for Windows. You can select another one by making a search on Google:

Setting Up Scheduled Tasks

  1. Open the Start Menu and click on Control Panel
  2. From the Control Panel, open up Scheduled Tasks
  3. Right click in space
  4. Select New, followed by Scheduled Task
  5. We will name the task as “Oempro Send Engine”
  6. The command we want the scheduled task to run is:
    C:\WINDOWS\wget.exe -q -O NUL
  7. Ensure that the Enabled box is checked
  8. Switch to Schedule tab
  9. Schedule the task to run every minute
  10. Save the task

Repeat this process for the following scheduled tasks:


What Happens If There’s No CRON Support On The Server?

If you don’t have CRON support on your server or don’t know how to set it, you can use an online service to execute your cron jobs.

Oempro v4.8.0 introduces Docker Container support. Docker Container support makes Oempro installation quick and straightforward. Also it makes Oempro scalable under heavy load.

To get started with Oempro v4.8.0 installation, make sure that you have your MySQL server is ready. You will need an empty database and username/password for accessing the database.

We recommend Ubuntu 18.04 LTS Linux distribution for hosting Docker Containers and Oempro installation. You can get a fresh Ubuntu 18.04 LTS server on Amazon AWS, Google Cloud, Digital Ocean, Linode, or on any other hosting company quickly.

Once your Ubuntu 18.04 LTS server is ready, login to your server with SSH and switch to the “root” user.

Upload your Oempro v4.8.0 zip file to the server and copy it to the /opt/ directory.


$ apt update

Install required packages:

$ apt install -y software-properties-common apt-utils iputils-ping telnet git unzip zip openssl vim wget debconf-utils cron supervisor mysql-client

As described on, install Docker Composer. Download the latest stable version of Docker Composer by running this command: 

$ sudo curl -L "$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Set the package executable:

$ chmod +x /usr/local/bin/docker-compose

Test the version. It should be 1.24 or higher:

$ docker-compose --version

Change directory to “/opt”:

$ cd /opt/

Create a new directory:

$ mkdir oempro

Move the zip file to the oempro directory:

$ mv oempro/

Unzip the package:

$ unzip

Change directory permissions:

$ chmod -R 0777 data

Execute the following command to run Oempro containers. 

$ docker-compose up -d

The first time you execute this command, it may take some time to build and run Oempro.

Once Oempro containers are up and running, open your web browser, and type the domain (or IP address) of your server.

The Oempro installation page will be displayed. Please follow on-screen instructions to complete the installation.

For any questions, do not hesitate to contact us via

Upgrade Guide

In order to upgrade your old Oempro version to the latest Oempro v4 version, you need to have Oempro v4.0.0 or higher installed. Unfortunately, Oempro v3, Oempro v2 and Oempro v1 versions can not be upgraded to the latest Oempro version.

Data migration tool for Oempro v3 is currently not available. The only way to move email addresses from v3 to the latest version is to export and then import into Oempro v4 installation.


Please take backup of your Oempro directory and database before upgrading to the new version

Manual Upgrade Instructions

Follow these easy steps to complete your upgrade:

  • Backup your Oempro directory on the server
  • Backup your Oempro database on the server
  • Download the latest Oempro version from your client area
  • Unzip and upload all latest version Oempro files to your Oempro directory on the server
  • Run the upgrade tool which can be found at

Important Note:
If you are using Panic’s Transmit FTP client on Mac OS X, be sure to select “MERGE” instead of “REPLACE”. “REPLACE” option will delete all of the existing files from your Oempro directory before it uploads the new ones and this will cause your configuration files and data files to be deleted you previously had.

You can upgrade if you have at least Oempro v4.0.0 or higher version.


If you are upgrading from an older version than v4.0.3, follow these additional steps:

  • Login to your client area
  • Download license.dat file again from “Downloads” section
  • Upload license.dat file to oempro/data/ directory
  • Run install utility which can be found at

Once installation utility is executed, it will detect the upgrade and redirect you to the upgrade utility. Upgrade utility is a one-step process which will upgrade your old Oempro database and also perform required changes in the file system. Once upgrade is completed, you will get a success screen.

Do not forget to delete the **install directory** after upgrading to the latest version.

Setting up your first mailing list

Oempro offers an easy way to create and manage mailing lists. In this chapter we will take a look at creating your first mailing list.

Before we proceed to create our first mailing list we need to understand two key concepts.

Key Concepts

Single Opt-in Mailing List

  • Email addresses on a (single) opt-in list are not confirmed.
  • Anybody can submit anybody’s address to the list, and it will be there until it is unsubscribed

Double Opt-in Mailing List

  • On a double opt-in list, all email addresses must be confirmed before they are added.
  • A request for confirmation is sent to the submitted address and the address owner must take necessary action to confirm that he/she is the owner of the email address, the address is working and he/she indeed wants to subscribe.
  • Most often, the confirmation action is as simple as replying to the confirmation request or clicking on a link.

We strongly recommend that whenever you are creating a mailing list – use double opt-in list, this will save you a big hassle with managing the unwanted subscribers.

Creating a new mailing list

  • To create a new mailing list click on the “Lists” tab.
  • On the right side click the button “Create New List”

This will bring up the list creation wizard

  • Enter the name of your list
  • Select the subscription type [whether you want to have single or double opt-in mailing list or not – for this example we have selected double opt-in]
  • You can tick the option to hide the mailing list from subscriber area
  • Now click on the “Create List and Edit confirmation email”

Now that we have configured the basic list options – we must create the opt-in confirmation emails. These confirmation emails will be activated and sent to the user who is subscribing to our double opt-in mailing list.

Oempro allows you to configure your opt-in confirmation emails using 4 different methods, please remember that in any of the method used to create the necessary confirmation emails must include opt-in confirm and opt-in reject links. These links will allow the subscriber to confirm or reject the subscription.

From Scratch
This option will allow you to compose your email using an HTML editor. You can also paste your own HTML code and create an opt-in confirmation email.

Template Gallery
This option allows you to select a built in template for creating an opt-in confirmation email. Oempro offers a wide variety of templates which can be used to create stunning confirmation emails.

Copy from another list
If you have already created a nicely formatted confirmation email for another list within your account then you can easily copy the same using this option, this method can help you reduce the time in creating a new set of confirmation email(s).

Fetch URL
You can use this to fetch a URL which will have a formatted content for the confirmation email. Please be sure that this content will have to have the opt-in confirmation and opt-in reject links within the content.

For this example we will be using the first option “From Scratch”.

Once you select this option you will be provided a screen which can allow you to define the settings of your email such as Sender Name, Sender Email address, Reply to name and Reply to email address.

  • Enter the sender name
  • Enter the sender email address
  • You can tick the last option to keep the same reply-top information or un-check the option to add a different reply-to information

Now we need to go to the content part of the confirmation email by hitting the “Next” button.

Content Settings
You can choose the “Embed images to email content” option to embed any images within your content to the email. This will increase the email size although all the images will be seen by the end-user even if the email client is set to hide all the images.

Content Type
You can set the content type as html, text or both.

Define the subject line of your confirmation email.

Please add the content as shown in the example below.

If you wish to send some other document or attachment with your email you can do so by adding your attachments using this tool.

Now we need to review our confirmation email by hitting the “Next” button.

Example HTML content for your confirmation email

Dear Subscriber

This is to inform you that your email address %Subscriber:EmailAddress% has been added to our mailing list.

I order to confirm your subscription please click on the below link. %Link:Confirm%

In case if you think that someone else subscribed your email id or you subscribed to our mailing list by mistake – you can reject the subscription by clicking on the Subscription Reject Link below.


Thanks and best regards XYZ Corporation

When you are done with the content part of the confirmation you need to go to the next step where you can review your email. The last step will allow you to preview your confirmation by sending a preview email or on browsers. It will also allow you to get the detailed content and spam analysis.

This is the final step to finalize your confirmation email and save it.

After you are satisfied with the preview you can save it by click on the “Next” button.


This topic will cover everything related to the data segmentation from your mailing lists. Learn how relevancy drives response and the various different ways you can split up your email lists to ensure you hit the target more often.

Segmentation of your address database is widely regarded as a proven way to improve responses and results.

  • To create and manage segments go to “Lists”
  • Click on the mailing list you wish to create segments for
  • Now click on the “Segments” link under the List Options

  • After you click “Create Segment” link you should see the above screen.
  • Enter the name of your segment [example: Subscribers having gmail addresses]
  • Select whether the all rules you create should match or any one of them
  • The segment rules is the most important part. You can create a rule based on subscribers information or based on subscribers activity such as opening emails, clicking on the links etc.

You can add multiple rules to the segment such as the person should have email id and should be between 18-25 age group.

For this user manual we will use the rule for users. Once we populate the necessary fields and also add the rule where in the subscribers email id contains we have to click on the “create segment” button. This will create a segment with the options we selected.

The screenshot above shows us our newly created segment which consists 3 subscribers having email ids.

Custom Fields

This topic will cover everything related to the Custom fields. For effective email marketing custom fields play a very important part. This can help you not only to personalize the content of your newsletter but also can help you gather vital and important information about your subscribers.

There are two types of custom fields offered by Oempro * Local custom fields [added specifically for a particular list] * Global custom fields [added globally and available for all the lists]

Please be aware that global custom fields once added can not be changed to local custom fields.

  • To add a new custom field go to the “Lists” tab
  • Select the mailing list you wish to add new custom fields to.

  • Click on the “Custom Fields” link as highlighted in the above screen from the List Options
  • Click on the “Create new custom field” tab.

Every custom field has a unique numeric id associated to it – this numeric ID will help you at the time when you want to personalize your email newsletter content.

Name of your custom field

You can select the field type you want to use – this will determine the html form element type and can also limit the data that can be saved under this field.

You can use the following types of the fields.

  • Single Line
  • Paragraph text
  • Multiple Choice
  • Drop Down
  • Checkboxes
  • Date Field
  • Time Field
  • Hidden Field

Default Value
In some of the field types you can define the default value for the field so that it will be displayed to the user.

Validation can help you validate the input and ensure that the user is not entering or populating the random value.

You can either disable the validation for the field or choose from 6 validation methods built into Oempro.

  1. Numbers
  2. Letters
  3. Numbers and Letters
  4. Email Address
  5. URL
  6. Custom

You can also define the field visibility – whether the field is available for the subscribers under thier subscriber area or it is only visible by the List Admin.

Make this field mandatory
Use this option to make the field mandatory to fill in.

Force unique value entry
Tick this option to force a unique value entry, unless the field is populated by the end user with a unique value it will not allow the user to go further.

Make this custom field available across all your lists
Using this option you can make the custom field globally available for all your lists.

Please be aware that global custom fields once added can not be changed to local custom fields.

List Settings

In the previous topics we went through the steps for creating new mailing list, the creation process is simple although the mailing lists have their own intricate settings which can be fine tuned to achieve greater capabilities and sophistication.

Oempro allows you to configure your mailing lists in a highly sophisticated manner with the subscription behaviors, un-subscription behaviors, web services integration and other related options.

List Name
You can update your list name to any other name which is suitable for the list

Subscription Type
You can make the list single opt-in or double opt-in by selecting the correct option from the drop down menu.

Edit Confirmation Emails
You can hit this button and edit the confirmation email in case your subscription type is double opt-in.

Delete Confirmation Email
If you have already created a confirmation email and want to create another one from scratch, delete existing confirmation by clicking on this button and then use “Create Confirmation Email” button to create a new one.

Hide the List
Use this option to hide the list under the subscriber area.

Send Notifications
Use this option to send notifications of the subscriptions and unsubscriptions

Subscription Behaviors
You can activate several behaviors when the subscription event occurs. The behaviors are listed below.

  • Subscribe him/her to a specific list
    If you enable this option you can subscribe the subscriber to a specific list of your choice.
  • Unsubscribe him/her from a specific list
    If you enable this option you can unsubscribe the subscriber from some previous mailing list he/she is subscribed to already.
  • Display my own confirmation pending page
    You can choose this option to display your own subscription confirmation pending page.
  • Display my own subscription confirmed page
    You can choose this option to display your own subscription confirmed page when the subscriber clicks on the confirmation link.
  • Display my own subscription error page
    You can choose this option to display your own subscription error page.

Unsubscription Behavior

  • Subscribe him/her to a specific list
    Choose this option to subscribe the subscriber to a specific list after he unsubscribes from the current list.
  • Unsubscribe him/her from a specific list
    choose this option to unsubscribe the subscriber from other lists when he processes the unsubscription for this particular list
  • Unsubscribe him/her from all lists
    Use this option to unsubscribe the subscriber from all the lists across your account when the unsubscription behavior happens.
  • Add unsubscribed email addresses into suppression list
    You can choose this option to add the unsubscribed email to the suppress list
  • Add unsubscribed email addresses into global suppression list
    You can choose this option to add the subscribed email to the global suppression list – global suppression list will ensure that no further communication is sent to the unsubscribed email.
  • Display my own unsubscription confirmed page
    you can choose this option to display your own customized unsubscription confirmation page.
  • Display my own unsubscription error page
    choose this option to display your own customized unsubscription error page.

Web Services integration
Oempro provides you an easy to use web service integration method to pass on the subscription and un-subscription data to the url you specify. This way you can keep your own database synchronized with the subscriber lists under your Oempro account.

  • New Service URL
    Define the web services url which must start with http:// or https://
  • Event Type
    You can select the event type – there are two types of events happening – subscription or unsubscription.

Request by Email Settings
If you are using the subscription and unsubscription through emails [i.e. subscribers can send an email with a designated subject line either to subscribe to a mailing list or unsubscribe from a mailing list to a particular email id provided by Oempro

  • Email Address
    Specify the email address which will be bound to the mailing list
  • Subscription Command
    Enter the command to trigger subscription. Example: subscribe, The subscriber will have to use “subscribe” as their subject line without double quotes.
  • Un-Subscription Command
    Enter the command to trigger unsubscription. Example: unsubscribe
    The subscriber will have to use “unsubscribe” as their subject line without double quotes.

About Oempro

In order to get more information about the installed oempro version, database and file integrity you need to navigate through Settings > About after logging on to admin area.

Software Information
This tab provides detailed information about the oempro version, license information and the copyright information.

System Information
This gives you an overview of whether your server is compatible with oempro or not and whether there are any issues with the php, apache or any other required modules for oempro which are necessary for the smooth functioning of the software.

Database Check
This tab will allow you to get more information on the database and also allow you to run the functions such as optimizing tables, repair tables and even export the database.

File Integrity
This can help you run the integrity test on the application files – if at all there are files which have changed for some reason this procedure can allow you check it out.

User Interface

Oempro user interface is an intuitive and well designed interface keeping the user experience in mind. Oempro’s user area interface is built from ground up to address the requirements of today’s Next Generation, Natural User Interfaces!

You will realize the advantages of this when you start using the application. Every campaign, list and subscriber has their own overview pages with detailed reports and statistics. All actions can be performed through this overview pages.

To better understand the different areas of the User Interface, please refer to the diagram below:

The user interface is divided into four parts

  1. Main navigation and settings functions
    The main navigation has four tabs – Overview, Campaigns, Lists and Subscribers. These can be seen in the above screen shot. These tabs will help you navigate through different parts of the Oempro user interface. These four main tabs are the core functions of Oempro system.
  2. Quick Access Functions and quick help
    On several screens across Oempro interface you will find quick help available to you on the right hand side of the user interface. The dashboard of the system will also have a quick access menu which will allow you to basically create a campaign or create a new mailing list from the dashboard screen itself.
  3. Overview of the system
    The overview of the system will give you the statistical data pertaining to the overall system activity along with the recent campaigns.

    The recent campaigns section will also give you the details about the email opens, link clicks, unsubscriptions etc. next to the campaign.

  4. Settings, Search & Log Out
    The 4th section will help you fine tune your account settings, search the resources across your system and log out button for logging out.

Subscriber Interface

Oempro subscriber interface is for the subscribers who wants to manage their subscription options if they are allowed to.

The subscriber area is accessible only if the end user clicks on the subscriber login link from within the campaign. When they click this link they are provided a screen allowing them to manage the mailing list options as shown below.

The subscriber interface is divided into three parts

  1. Main navigation (Lists)
    The main navigation has only one tab called “Lists” and after you click on the login link you land into your subscriber area with the Lists Browser infront of you as shown in the above screen.
  2. Logout
    This button can log you out of the system.
  3. List Browser
    This shows all the lists you are subscribed to – click on each one of them and you will be able to unsubscribe or save your preferences.

Admin Interface

Oempro’s admin interface will help you control all the aspects of your email marketing system. The interface is divided into several areas and each area will have several different functions. These functions can help you configure your system easily and manage the resources such as user groups, users etc. effectively.

To better understand the different areas of the Admin Interface, please refer to the diagram below:

The admin interface is divided into five parts

  1. Main navigation
    The main navigation has three tabs – Overview, Users, Payment Reports. These can be seen in the above screen shot. These tabs will help you navigate through different parts of the Oempro’s Admin Interface. Overview tab is the landing page where you are redirected after logging into your admin area – this will give you the system overview and quick statistical data.
  2. Settings, Logout & Search
    Using the right hand side navigation you will be able to modify and fine tune the settings of your Oempro backend. You can use the search functionality to search the resources within your Oempro, and use the Logout button to log out of the system.
  3. Quick Access
    Quick Access menu will help you perform three functions such as Creating new user account, Creating a new user group and Creating a new email template.
  4. Statistical Dashboard
    This section will give you the quick statistical data for overall system. You will be able to track Delivery forecast, Delivery history, active users, online users, bounces, spam complaints and the list of campaigns waiting for approval.
  5. License & Updates
    This area shows you the license key and the version information. If there is an update for oempro it will automatically notify you with the details.

Oempro Plugin Development

We have recently published a step-by-step plugin development article on our blog. Click here to learn how to develop an Oempro plugin.


Oempro is a powerful, feature packed list management and email marketing software for both your own needs as well as for providing email marketing service to your customers. But we are not big fans of making software even more complicated by adding several new features in every version release. Instead, we prefer to keep Oempro stable with a base feature set and provide additional features to anyone interested in those features only. Any Oempro owner can extend functionalities of Oempro by adding new plugins to their Oempro installations.

Oempro has a powerful and highly extendable plugin engine which lets you to add any kind of new feature set (or change the work-flow of existing features). You are almost limitless on plugins you can develop for Oempro. However, we are aware that this is not a one-man show. To encourage developers just like you, we do our best to prepare you a detailed plugin development manual, sharing every single step, every single plugin development techniques in this manual.

This manual is updated frequently based on developer feedback, recently added new hooks, etc. Please bookmark this page and check it frequently for the most up-to-date information.

We are looking forward to hear from you about your suggestions which will help us to make the plugin system even more flexible. If you think that you have a great idea for the plugin system, or if you think that you need new hooks or menu items (explained later in this manual), just get in touch with us, by email or from our Facebook developers group.

The Plugin Developers Community

Come and join us, let’s improve the plugin engine of Oempro together and let us help you develop amazing Oempro plugins.

The mail list

Subscribe to our developer mail list to get notified about the most recent updates on Oempro plugin ecosystem. We will be sending you status update emails time to time about;

  • new plugin hooks
  • new plugin engine features
  • the most recent plugin development techniques

You can always opt-out from our mail list by clicking the unsubscription link inside our emails.

The Facebook group

Come and join our Facebook Oempro Plugin Developers Group:

We discuss building awesome Oempro plugins and special techniques with developers.

Getting started

Oempro is written in PHP language with MySQL database backend. The plugin engine of Oempro is based on classes. Basically, an Oempro plugin consists of at least one class. Based on the plugin project you are working on, it may contain several files, but you can even write a simple plugin with a small PHP class.

To help you get started faster, we prepared a boilerplate and framework plugin for you. You can take this plugin as an example and start coding your own Oempro plugin. Until you get used to how plugins work in Oempro, this example plugin will be very helpful and a good starting point for you. It contains several examples like adding a menu item to the user interface, registering a hook to a listener, etc.

The plugin boilerplate and framework

We host the boilerplate plugin framework on Github, which can be accessed anytime. Here’s the direct link to the Github project page:

Feel free to fork it, improve it and push it. We are excited to make it even more feature packed for you.

This boilerplate example plugin includes many features that will give you an idea about how things work in plugin system, such as;

  • enabling, disabling plugins
  • initiating plugin database tables on enable
  • loading the plugin
  • authentication and privilege system
  • model-view-controller approach
  • adding menu items to the Oempro user interface
  • adding new screens to the Oempro user interface
  • events
  • and more…

Installing the boilerplate framework

Simply visit Github project page and clone it to /plugins/ directory inside Oempro directory on your server. Once it’s cloned, be sure that you have cloned it to the following directory:


Once the “plugin_framework” directory is created and example plugin project is cloned to this directory, you are ready to give it a try. Now, login to your Oempro administrator area and click “Settings” link. Then click “Plugins” link on the left menu. You should see the “Plugin Framework” on the list as “disabled”:

Now, click “Enable” next to Plugin Framework. Once the plugin is enabled, it will add example menu items to;

  • Administrator settings left side menu
  • Administrator top menu (drop down menu)
  • User area top menu

You can play with the plugin framework.

Let’s dig into the source code and learn how those menu items, screens and all other functionalities are done.

Plugin directory structure

First, let’s check the directory structure of a plugin. Simply, go into the /plugins/ directory inside Oempro. You will see directories which belongs to different plugins. Go into “plugin_framework” plugin directory.

Each plugin in Oempro has its own directory under /plugins/ directory. Don’t forget to prefix your plugin(s) with a unique code. For example, we use “oct” as prefix on our plugins.

In order to create a basic plugin, you only need to create the plugin directory and then place the .php file inside which has the same name as the plugin directory. For example;


In order to keep your plugin files organized, we have grouped similar files under sub-directories (something like categorization).

Plugin Directory Structure
If your plugin contains any PHP scripts which needs to be executed in CLI group them under this directory
This is the directory which should contain CSS files for the plugin user interfaces (views)
Group images inside this directory
JavaScript files (such as jQuery or your user interface JavaScripts) should be stored in this directory
Your plugin language files (at least the default language file) should be stored inside this directory
All third party classes functions and other included PHP files should be put into this directory
Models are classes which interact with your Oempro database
This directory contains user interface files (views)

In addition to these directories, there are some files inside the “plugin_framework” directory.

Plugin Files
This is the main plugin file. The name of this file should be the same with the plugin directory. Otherwise your plugin will not be recognized in Oempro
This is optional. You can write your plugin code inside the main plugin file (plugin_framework.php in this example) or you can split the code to the main.php. This is very useful if you are going to encrypt your plugin PHP scripts with Ioncube.

In order to start building your own plugin, simply follow these easy steps:

  1. Decide a name for your plugin. Example: My Plugin
  2. Decide a plugin code for your plugin. Example: my_plugin (it should be lowercase with no spaces. Alphanumeric characters and underscore)
  3. Clone the “/plugins/plugin_framework” directory and rename it to your own code. Example: /plugins/my_plugin
  4. Rename the plugin_framework.php file to my_plugin.php inside your plugin directory
  5. Edit main.php and change the name of the class to “my_plugin”

Once you edit the main.php file, you will notice that every single class property and method are well-commented.

Default plugin methods

Below, you can find the list of plugin methods which will be executed by Oempro on certain conditions. When using these methods in your plugin, replace “yyy” with your plugin code (ex: enable_my_plugin(), disable_my_plugin(), load_my_plugin())

In the future, we are considering to make these default functions much easy to implement, such as removing the plugin code from function names. However, we will retain the backward compatibility.

Default plugin methods
Never use the constructor. Plugin class is called statically therefore object is not constructed.
This method will be called when the Oempro administrator clicks “Enable” link next to the plugin in “Settings > Plugin”. Use this method to setup plugin options create plugin database tables etc.
This method will be called when the Oempro administrator clicks “Disable” link next to the plugin in “Settings > Plugin”. Use this method to remove plugin related data files database tables and plugin options.
This method will be called every time an Oempro page is loaded/accessed if the plugin is enabled. In this method you will usually set the language register hooks menu items etc.

Simply edit main.php file inside plugin_framework plugin and you will find some useful examples for each method.

Don’t forget to replace “yyy” with your own plugin code.

Basic MVC approach in Oempro plugins

It’s up to you how to develop an Oempro plugin. However, MVC is the best approach to keep your application organized and easy-to-maintain (and expand) in the future.

In the plugin framework example, you will find example MVC approach. Simply edit the “main.php” and take a look at controller methods (methods with “ui_” prefix), view files (files under “templates” directory) and models (files under “models” directory.

Plugin features

Below, you will find detailed descriptions and examples for specific approaches when developing an Oempro plugin.

Adding a new menu item

If you are developing a plugin which has user interface, then you will probably need to place menu items to admin and/or user area to let your users access your plugin.

In your plugin loader method (load_yourplugincode), you need to define menu item function, just like setting up hooks. For an example, edit plugin_framework ‘s main.php file and search for:

parent::RegisterMenuHook(self::$PluginCode, 'set_menu_items');

As it can be seen on the above example, Oempro will get the list of menu items from “set_menu_items” method in your plugin class. Search for “set_menu_items” method in plugin_framework class:

In the “set_menu_items” method, you will see an array including locations and menu items:

$ArrayMenuItems[] = array(
'MenuLocation' => 'Admin.Settings',
'MenuID' => 'Plugin Framework',
'MenuLink' => Core::InterfaceAppURL() . '/' . self::$PluginCode . '/admin_settings/',
'MenuTitle' => self::$ArrayLanguage['Screen']['0001']
Menu item array
This is the menu container on the user interface. For a list of available menu item locations take a look at “Menu item locations” reference in the article.
Give a unique ID to your menu item. It will be a good approach to prefix the ID with your plugin code.

This is the link where user will be redirect upon he clicks to the menu item you inserted.  For linking to a controller in your plugin  simply use the following structure:

Core::InterfaceAppURL() . '/' . self::$PluginCode . '/controller_name/'
This is the title which will be shown to the user. You can set it as a string or get the name from the language file of your plugin or Oempro.

Adding a new API command

With Oempro 4.7, it became very easy to add new API commands to Oempro’s core API. In your plugin loader method (load_yourplugincode), you need to register the API command name and its properties. For example:

parent::RegisterAPIHook('MyApi.Get', self::$PluginCode, array('user'));

What this does is to register a new API command (MyApi.Get) to Oempro’s core API which is accesible through only USER authentication. Here is the RegisterAPIHook function signature and its details:

parent::RegisterAPIHook($commandName (String), $pluginCode (String), $allowedAccountTypes (Array));
$commandName (String)
This is the name of your new API command. Your plugin users will run your new API command with this name.
$pluginCode (String)
This is your plugin code
$allowedAccountTypes (Array)
Which account types may use this new API command? This array answers the question. You can pass multiple account types. Possible values are “user” “admin” “subscriber” and “client”.

After registering your new API command, you need add a method for this API command to your plugin class. The name of the method must be in the following format (assuming your new API command is “MyApi.Get”):

public function api_myapi_get($parameters = array())

All dots are replaced with an underscore, all lowercase and prefixed with “api_”. $paramters array contains all the parameters sent to the API command, it is an associative array. Within this method you must return an array with the following structure:

array("Success" => true, "ErrorCode" => 0);

Depending on your conditions, you can return FALSE as success and an error code. Also you can add as many as new keys to this array. But be sure that you return an array with a “Success” and “ErrorCode” keys. Here is an example (assuming your new API command is “MyApi.Get”):

public function api_myapi_get($parameters) {
return array(
"Success" => true,
"ErrorCode" => 0,
"hello" => 'world!'

And here is full basic example:

class octapitest extends Plugins {
public function load_octapitest() {
parent::RegisterAPIHook('MyApi.Get', 'octapitest', array('user'));

public function api_myapi_get($parameters) {
return array(‘Success’ => true, ‘ErrorCode’ => 0, ‘hello’ => ‘world!’);

Plugin hooks: Actions and Filters

Hooks are “triggers”. At certain points during the Oempro application execution, you can trigger your plugin methods to perform specific processes. For example, just before starting to send an email campaign, you can perform a final check on the email content and stop the email campaign delivery. Or you can monitor user logins and block an IP address if suspected situation is detected, such as too many failed login attempts.

There are two hook types in Oempro:

Hook types explained
Filter Hooks
Filter hooks are used to perform an operation for the passed-in parameters and return them in the same order. In this way you can manipulate the system variables. For example you can add a prefix to the email campaign subject.
Action Hooks
Action hooks may pass-in parameters but it will not accept them from your plugin method. Action hooks can be used to control the process or perform “internal” operations. For example you can cancel an email campaign delivery or log user logins to your plugin database table.

You can hook to a filter hook just like in the example below:

parent::RegisterHook('Filter', 'UserGroup.Update.FieldValidator', self::$PluginCode, 'usergroup_update_fieldvalidator', 10, 1);

In the example above, we hooked to “UserGroup.Update.FieldValidator” filter hook which gets triggered whenever admin submits the user group form in admin area. “usergroup_update_fieldvalidator” method inside your plugin class will be executed.

“10″ represents the priority. Just leave it as “10″ for now, this is a parameter which will be used in the future.

“1″ means the number of parameters accepted by your plugin hook method

parent::RegisterHook('Action|Filter', 'HookListener', self::$PluginCode, 'YourPluginMethod', 10, NumberOfParameters);

For a list of available filter hooks, please take a look at “Filter hook listeners” section on this manual.

Your plugin hook method should be similar to the one written below as an example:

public function usergroup_update_fieldvalidator($ArrayFormRules)
$ArrayFormRules[] = array(
'field' => 'PluginFramework[DeliveryLimit]',
'label' => self::$ArrayLanguage['Screen']['0003'],
'rules' => 'required|numeric',
return array($ArrayFormRules);

As you can see above, we hooked to “UserGroup.Update.FieldValidator” filter hook. This filter hook sends and received one parameter. We received it in our plugin hook method, performed the appropriate action and then returned it in the same order in an array (take a look at the return).

Hook registrations must be set in “load” method of your plugin class. Otherwise, they may not be registered correctly.

Action hooks are just the same as filter hooks with one difference. They do not return the passed-in parameters. Action hooks are ideal for “internal” processing, such as activity logging, stopping an email campaign, sending a notification email to the admin.

Multi Language Support

In order to make your plugin “multi-language” ready, first check the example in plugin framework script. To make your script ready, follow these steps:

  1. Create “languages” directory inside your plugin directory
  2. Create “en” language directory (or any other ISO 2-letter language code) inside “languages” directory
  3. Inside “en” directory, create info.txt file. The contents should be similar to:
Language Code: EN
Language Name: English
  1. Create “” file inside “en” directory. If you have created a different ISO 2-letter language code, the file name should be the same.
  2. The contents of file should be similar to;
$ArrayPlugInLanguageStrings = array();
$ArrayPlugInLanguageStrings['Screen']['0001'] = 'My Plugin';
$ArrayPlugInLanguageStrings['Screen']['0002'] = 'Example text';
  1. You can set unlimited amount of language strings in this language file. Just make the array keys unique.

Okay, your language file is ready. Now, let’s load it in your plugin. In your plugin loader method (load_xxx() where xxx represents your plugin code), add the following code:

$Language = Database::$Interface->GetOption(self::$PluginCode . '_Language');
if (count($Language) == 0) {
Database::$Interface->SaveOption(self::$PluginCode . '_Language', 'en');
$Language = 'en';
} else {
$Language = $Language[0]['OptionValue'];

$ArrayPlugInLanguageStrings = array();
if (file_exists(PLUGIN_PATH . self::$PluginCode . ‘/languages/’ . strtolower($Language) . ‘/’ . strtolower($Language) . ‘.inc.php’) == true) {
include_once(PLUGIN_PATH . self::$PluginCode . ‘/languages/’ . strtolower($Language) . ‘/’ . strtolower($Language) . ‘.inc.php’);
} else {
include_once(PLUGIN_PATH . self::$PluginCode . ‘/languages/en/’);

self::$ArrayLanguage = $ArrayPlugInLanguageStrings;

Now, the correct language pack will be loaded during your plugin loading process. You can use the loaded language strings in your plugin methods and view files just like the below example:

Using Oempro’s language strings;


Using your plugin’s language strings;


MVC approach

You are free to design your plugin code in anyway you want. However, we do believe that designing your plugin with a MVC (Model-View-Controller) approach will make it easier to maintain in the future. To help you get started with MVC approach, we have developed a basic but highly effective MVC backend for you. You can examine the plugin framework source code to have a better idea on this topic.


Controllers are methods which get executed whenever a user interface of your plugin is accessed by the user. Controllers perform specific actions such as event handling (save settings, send email, etc.) and loads the view (user interface). Inside controllers, no database queries should be included. Controller method names should start with “ui_” prefix, otherwise they will not be able to executed through the Oempro user interface.


Model files store methods which perform database related processes, such saving account profile, creating a new email, etc.


Views are user interface files. No event handling and database operations should be done in view files.

Plugin updates and new version releases

Currently, Oempro’s upgrade system is not compatible with plugins. Therefore, once you have an update for your plugin, simply change the $PluginVersion to the most recent version and re-submit to the plugin store.

Licensing and protection

Currently, we are able to license-protect and encrypt our plugins. Unfortunately, this licensing engine is currently not available for third party developers. We have plans to make it available for third party developers so that you can both protect the source code of your plugin and sell it to other Oempro owners and bind it to specific Oempro licenses.

We are working on a powerful and robust plugin licensing engine, once it becomes ready for deployment, we will invite all Oempro plugin developers to give it a try.

If the plugin you have developed is going to be distributed through our Plugin Store, then we will be happy to implement our own licensing engine to your plugin during the distribution process. Please contact us for more information.

Plugin source code encryption

If you want, you can encrypt the source code of your plugin with Ioncube. The only thing that you should be careful is, the main plugin file shouldn’t be encrypted. That’s why we recommend you to include main.php file inside the plugin file and keep it simple. Except the plugin file, all other PHP files can be encrypted inside your plugin.

If the plugin you have developed is going to be distributed through our Plugin Store, then we will be happy to encrypt your plugin source code (ioncube) before distributing it. Please contact us for more information.

Oempro Plugin Store

In order to make plugin distribution easy across ten thousands of Oempro owners, we have prepared a central plugin distribution place on our website: Oempro Plugin Store.

You will be able to submit your plugins to our Plugin Store and have opportunity to promote/distribute your plugin to thousands of Oempro users. In order to be sure that each plugin in our Plugin Store complies with our terms and conditions (such as privacy and security), we will be testing every single submitted plugin.

Octeth Plugin Store terms and guidelines will be announced in the coming weeks on our website. Please stay tuned.


This chapter contains useful information about available menu item locations, hooks and other stuff which you will need when developing your plugin.

Menu item locations

These are available “menu item” locations where you can add your own menu items. Such as a new settings link, or list options.

Menu item locationNotes
Admin.SettingsAdds a menu item to the left-side menu of the admin settings section
Admin.TopMenuAdds a menu item to the top menu of the admin area
Admin.TopDropMenuAdds a menu item to the drop down menu on the top menu
Admin.TopRightMenuAdds a menu item to the top right menu in admin area
User.List.OptionsAdds a menu item to subscriber list options
User.SettingsAdds a menu item to the user settings section
User.TopMenuAdds a menu item to the top menu of the user area
User.TopDropMenuAdds a menu item to the drop down menu on top menu of user area
Campaign.Navigation.ReportsAdds a menu item to campaign reports screen
Campaign.Navigation.ReportOptionsAdds a menu item to campaign report options drop down menu
Campaign.Navigation.OptionsAdds a menu item to campaign options menu
User.Settings.IntegrationsAdds a menu item to user settings integrations section (v4.6.4+)
User.Overview.QuickAccessAdds a menu item to user area overview page (to the right side) (v4.6.4+)

Form item locations

These are available “form item” locations where you can add new form elements, such as adding a new user group limit.

Form item locationNotes
FormItem.AddTo.Admin.UserGroupLimitsFormAdds new form items to user group create and edit “Limits” tab

Action hook listeners

“Action hooks” will be triggered during a certain process. You can execute a specific code in your plugin. For example, when an email campaign is sent, you can execute your plugin method and inform the administrator by email. Action hooks can not effect the process.

Hook listenerParameters and notes
Cron.BounceNo input parameters
Cron.ExecuterNo input parameters
Cron.FBLNo input parameters
Cron.GeneralNo input parameters
Cron.BounceNo input parameters
Cron.FBLNo input parameters
Cron.RequestsNo input parameters
Cron.RequestsNo input parameters
Cron.SendEngineNo input parameters
Cron.SyncNo input parameters
Cron.TransactionalSendNo input parameters
Cron.GeneralNo input parameters
Cron.SendEngineNo input parameters
Extras.Mailgun.Event.PreNo input parameters
Extras.Mailgun.Event.PostNo input parameters
Extras.Mailjet.Event.PreNo input parameters
Extras.Mailjet.Event.PostNo input parameters
Extras.Sendgrid.Event.PreNo input parameters
Extras.Sendgrid.Event.PostNo input parameters
Email.Send.Stop‘Campaign’ constant
UI.Campaigns.BrowseNo input parameters
User.Login.ValidationErrorNo input parameters (v4.6.4+)
User.Login.InvalidUser$ErrorCode (v4.6.4+)
Client.Login.ValidationErrorNo input parameters (v4.6.4+)
Client.Login.InvalidUser$ErrorCode (v4.6.4+)
Admin.Login.ValidationErrorNo input parameters (v4.6.4+)
Admin.Login.InvalidUser$ErrorCode (v4.6.4+)

Filter hook listeners

“Filter hooks” are just the same as action hooks with one difference. Any variables passed into the filter hook are received back in the same order. For example, during the email sending process, if a filter hook exists and $Subject, $HTMLBody, $PlainBody parameters are passed in, your plugin method which is hooked into that listener should return these three parameters in the same order. In this way, you can change the process. For example, you can remove specific words from the email content or you can pause the email campaign.

Hook listenerParameters and notes
$CampaignID (v4.6.4+)


DATA_PATHData directory path
DATA_URLData directory URL
LIBRARY_PATHLibrary directory path
PLUGIN_PATHPlugin directory path
PLUGIN_URLPlugin directory URL
MD5_SALTSalt for encryption
TIME_ZONE_LISTTime zone list separated by |||
LANGUAGELanguage set in the system
GEO_LOCATION_DATA_PATHPath to the IP location database file
APP_PATHOempro installation path
LICENSE_KEYOempro license key
HTACCESS_ENABLEDUser friendly URL enabled (true/false)
DEMO_MODE_ENABLEDWhether demo mode is enabled or not
OEMPRO_PASSWORD_SALTSalt for encryption

Global methods

Global methodDescription
InterfaceAppURL($Return = false)The Oempro url. Based on the htaccess pretty url status, it points to the front-end system directly
InterfaceInstallationURL($Return = false)Oempro’s installation url. No matter if pretty url is enabled or not, it points to Oempro’s root folder

Using the Oempro API inside your plugins

Oempro’s powerful API is also available in your plugins. This allows you to use powerful features without re-writing all those algorithms again.

In order to enable API access in your plugin, first load the API object in your plugin. You can load the API object in “loader” method or in the method where you need to use the API:


Once API object is loaded, you are ready to access the API. Here’s an example for Subscriber.Optin API call:

$XML = API::call(array(
'format' => 'json',
'command' => 'subscriber.optin',
'parameters'=> array(
'listid' => $ArraySubscriberList['ListID'],
'subscriberid' => $ArrayParameters['SubscriberID'],
'mode' => $ArrayParameters['Mode']

Oempro Backup Instructions

There are times when things can go wrong and your server may have issues which can destroy your database or website.

It is always better that you keep the backup of your database and application files.

Backing up the application files

  1. To backup your Oempro installation files go to your FTP of the website
  2. Download all the application files found under the /your_installation_path/oempro directory.

Backing up your mysql database

There are two ways to backup your mysql database

  1. You can backup the database using phpmyadmin
  2. You can use the shell command to back it up.

Backing up the database using phpmyadmin

  1. Go to your phpmyadmin
  2. Select the database for your Oempro
  3. Click on the “Export” button.
  4. Select the format as “SQL”
  5. Make sure that you select the database structure along with the data for the full backup
  6. Click on the “Go” button to export and save the database file.

Backing up the database using shell command

  1. Login to your server with SSH
  2. Run the command “mysqldump -u [Username] -p [password] [databasename] > [backup_oempro.sql]” – replace the username, password and database with your own username,password and database.

Restoring your application files

To restore your application files follow the steps below.

  1. Upload all the files which were backed up to your oempro folder
  2. Check the under /oempro/data directory and verify all the path’s and database details and modify them accordingly to match the new setup or your server.

Restoring your Database

To restore your database you can use the sql backup using phpmyadmin or using command line.

  1. To restore it with the help of phpmyadmin go to the phpmyadmin interface
  2. Select the database
  3. Click on import tab
  4. Select the backed up sql file and import the same.

In order to restore your database using the command line method follow the steps below

  1. Login to your ssh server
  2. Execute the command “mysql – u [username] -p [password] [database] < backup_oempro.sql”

    After restoring the backup please go to the web url and check whether everything is working fine or not.

Moving Oempro from one server to another

It is possible that you may want to test the water before actually moving your Oempro to a production level server and in similar scenario you will require to move your test installation to a production level server.

We have listed the steps to achieve this.

  1. Backup your Oempro directory and database in case of a problem
  2. Move your Oempro directory to the new location
  3. Set directory and file permissions to 777 for /data/*
  4. Edit /data/ and update settings based on new server parameters
  5. Move your Oempro database to the new location
  6. Login to admin area
  7. Check settings
  8. Remove Oempro installation directory and database from the old server
  9. Login to your client area at
  10. Delete the Oempro license you have generated for your old domain
  11. Create a new license for the new domain
  12. Download it from the client area
  13. Upload license.dat file to /data/ directory
  14. That’s all. Once these steps are completed, your Oempro will be ready to run on your new server.

That’s all. Once these steps are completed, your Oempro will be ready to run on your new server.​

Setting up a CentOS server on Linode or DigitalOcean for Oempro


Oempro is the most popular email marketing and email service provider software. With Oempro, you can build your very own email marketing service just like Sendloop or Mailchimp. Today, starting up a web startup is easy and costs you a few hundred dollars. We thought that it should be just the same for building your very own ESP. In this article, we will explain you how to build an application server on Linode or DigitalOcean to host Oempro for your email service provider business.

Linode and DigitalOcean are two proven, cost-effective and highly powerful Linux Virtual Server companies. Using such a service provider helps you to scale your costs based on your business details. They both provide you API access. In this way, you can scale your server capabilities based on your needs and keep your infrastructure costs down.

Get a server

In this chapter, we will explain you how to get a CentOS server on Linode and DigitalOcean Linux Virtual Server companies.

Getting a server on Linode

  1. Visit website
  2. If you have a Linode account already, simply login to your account management area
  3. If you don’t have a Linode account, scroll down and choose the appropriate plan for your needs
  4. Once you have created your account, on the server build screen, select “CentOS 6.4″ build, set a root password
  5. In a minute, your server will be up and ready to setup. Simply boot it by clicking “Boot” button on the server main screen.
  6. Once your server is online, login to your server with ssh root credentials.

Okay, your server is now ready for setting it up.

Getting a server on DigitalOcean

  1. Visit website
  2. If you have an existing account, simply login to your DigitalOcean account
  3. If you don’t have an account, submit the signup form
  4. Once you login to your account area, click “Create Droplet” button on top right
  5. Set a hostname, choose specs and location of your virtual server
  6. For Linux distribution, choose CentOS 6.4 or higher 64bit build
  7. Create your droplet (droplet is the alias of virtual server in DigitalOcean world)
  8. In a minute, your server will be up and ready for setting it up
  9. You will receive your root password to your account email address

Okay, your server is now ready. Let’s set it up.

Setting up CentOS server

Okay, you have created your server on Linode or DigitalOcean. The next step is to setup server components such as Apache web server, MySQL database server, PHP and PHP extensions.

Setup hostname

Before digging into details, let’s set a hostname for your server. This will be a unique identifier for your server. As an example, we will set “” hostname:

$ echo "" >> /etc/sysconfig/network
$ hostname ""

Setup server timezone

This is important. Let’s setup the correct timezone based on your needs. As an example, we will be setting up London’s timezone:

$ ln -sf /usr/share/zoneinfo/Europe/London /etc/localtime

Update installed packages

Before starting to install packages, let’s update existing ones to the most recent versions:

$ yum -y -v update

wget installation

In order to perform specific operations, we need wget to be installed and available:

$ yum install -y wget

Atomic repository setup

To enhance available packages, we will be adding Atomic repository:

$ wget -q -O - | sh

Install required packages

We will be installing several packages such as development tools, PHP, memcahced, PHP extensions, MySQL and many others. Some of them are not required by Oempro but we will install them for future use:

$ yum -y -v groupinstall "Development Tools"
$ yum -y -v install fontconfig freetype* nc memcached php php-mysql php-apc mod_php php-cli php-pecl-memcached zlib-devel libmemcached-devel php-pear php-gd httpd git php-ioncube-loader iotop mysql mysql-server phpmyadmin telnet lftp ntpdate php-imap apc php-xml php-bcmath python-setuptools python-devel mod_ssl openssl-devel ruby rubygems redis rubygems

Installing all packages may take a while, sit back and relax 😉

Setup auto-run of specific modules on boot

We will make sure that Apache and MySQL starts automatically whenever your server is rebooted:

$ chkconfig httpd on
$ chkconfig mysqld on

Setup cron for time sync

We don’t want our server date/time to be incorrect. So, let’s sync it. We will simply add a cron job to “root” user cron job list:

$ crontab -e

Now switch to “edit” mode by hitting “i” key. Paste the following command:

47 23 * * * /usr/sbin/ntpdate -b -s

Hit “Esc” key (to disable edit mode) and then save your cron job by typing “:wq”

You will be returned back to command line with a similar message:

no crontab for root - using an empty one
crontab: installing new crontab

Update RubyGems

We are not using Ruby on Oempro, but let’s make it ready to use and keep it up-to-date:

$ gem update --system

Install Composer

Composer is a package repository for PHP. Composer is not being used in Oempro but it may change in the future. Let’s make it ready to be used:

$ mkdir /root/tmp
$ cd /root/tmp
$ curl -sS | php
$ mv composer.phar /usr/local/bin/composer

Start services

Let’s start web server and MySQL database server:

$ /etc/init.d/httpd restart
$ /etc/init.d/mysqld restart

Initial MySQL server setup

Simply run the “/usr/bin/mysql_secure_installation” app to execute the wizard:

$ /usr/bin/mysql_secure_installation

The wizard will ask you some questions such as;

  • root password
  • remove anonymous users (yes)
  • disallow root login remotely (yes)
  • remove test databases and users (yes)
  • reload privileges now (yes)

phpMyAdmin setup

We will use phpMyAdmin to administrate our MySQL server. But first, we need to authorize access to it remotely:

$ cd /etc/httpd/conf.d/
$ vi phpMyAdmin.conf

Now search for “Allow from” and add your computer IP address to the list so that you can access phpMyAdmin from your computer. Here’s an example:

Allow from => Allow from

Save and exit from the editor. Then reload Apache configuration:

$ /etc/init.d/httpd reload

Create MySQL database

Now, we will be creating a MySQL user and database for Oempro.

Simply open a web browser and access phpMyAdmin on your server:


Web browser will ask you to enter username/password. Type “root” for the username and type the password you have set on “Initial Mysql server setup” chapter

On the phpMyAdmin main screen, you can create the Oempro database easily. Simply enter the name of database (ex: oempro) and choose collation (ex: utf8_unicode_ci)

Once the database is created, phpMyAdmin will redirect you to the database screen. On the top menu, click “Privileges” link and then click “Add a new user” link.

Enter the name, password and host for the new user. Do NOT check any global privileges unless you are sure what you are doing.

Once the user is created, phpMyAdmin will redirect you to the database privileges for the new user. Make sure that all privileges are checked and click “Go” button.

Now, your user and database is created. Simply click “Privileges” link on the top menu again and then click “reload the privileges” link on the bottom of the page. This will make sure that new MySQL user credentials are updated.

Installing Oempro

Your server is now setup and ready to proceed with Oempro installation. You will simply install Oempro to /var/www/html directory. Simply proceed with Oempro Installation help article to make Oempro ready-to-run.

What about mail server?

Sending mass emails from a virtual server is not a good approach, you will simply have very poor inbox delivery rate and probably the hosting provider will warn you when you exceed a certain amount of delivery volume. If you are fully experienced on setting up MTA, handling IP reputation and all other complex stuff, you can build a mail server on a fully dedicated server. If you don’t know what the MTA world is or if you don’t have time to spend on MTA management, then we strongly recommend you to send emails through a third party professional service such as;

and many others…

Optional but nice to have

This article explains how to setup a CentOS server for Oempro and other web apps. In addition to instructions written here, you can setup virtual hosts for your different domains (or apps), use memcached for PHP sessions , fine tune MySQL for higher performance, iptables firewall setup for secured access, etc.

Any suggestions or ideas to add to this article? Let us know below.

Resetting user passwords

If you are upgrading from v4.5.x or older versions, the new password mechanism in v4.6.0 release will affect your users and they will not be able to login unless they reset your password.

However, asking your users to reset their passwords can be a real headache. To simply this process, we included a script in Oempro package which will scan all user accounts, reset their passwords and email them new passwords.

To run this script, simply login to the server which hosts Oempro via SSH or telnet. After logging in, go into the Oempro directory. You will see “extras” directory. Go into “extras” directory.

In “oempro/extras” directory, there’s a file named as “prfau.php”. Edit this file and comment the “exit” line on the top of the code. Then run this PHP script on your command line:

$ php ./prfau.php

This script will scan all your users, change their passwords with randomly generated passwords and email them their new passwords.

IMPORTANT! Once this script is executed, it will scan all user accounts and change their passwords with randomly generated passwords. Before running this script, be sure that you want to change user passwords.

Oempro Version Change Log

  • v4.8.0
    released on 2nd Dec 2019
  • v4.7.0
    released on 29th May 2014
  • v4.6.4
    released on 31st March 2014
  • v4.6.3
    released on 4th March 2014
  • v4.6.2
    released on 10th February 2014
  • v4.6.1
    released on 9th January 2014
  • v4.6.0
    released on 25th November 2013
  • v4.5.3
    released on 30th October 2012
  • v4.5.2
    released on 1st October 2012
  • v4.5.1
    released on 29th August 2012
  • v4.5.0
    released on 28th August 2012
  • v4.4.1
    released on 28th June 2012
  • v4.4.0
    released on 7th May 2012
  • v4.3.5
    released on 22nd Feb 2012
  • v4.3.4
    released on 24th Nov 2011
  • v4.3.3
    released on 31st Jul 2011
  • v4.3.2
    released on 15th Jun 2011
  • v4.3.1
    released on 30th May 2011
  • v4.3.0
    released on 20th May 2011
  • v4.2.4
    released on 15th Mar 2011
  • v4.2.3
    released on 17th Jan 2010
  • v4.2.2
    released on 28th Dec 2010
  • v4.2.1
    released on 14th Dec 2010
  • v4.2.0
    released on 5th Dec 2010
  • v4.1.19
    released on 27th Nov 2010
  • v4.1.18
    released on 4th Nov 2010
  • v4.1.17
    released on 5th Jul 2010
  • v4.1.16
    released on 2nd Jun 2010
  • v4.1.15
    released on 18th May 2010
  • v4.1.14
    released on 4th May 2010
  • v4.1.13
    released on 26th April 2010
  • v4.0.6
    released on 1st July 2009
  • v4.0.5
    released on 6th May 2009
  • v4.0.4
    released on 9th April 2009
  • v4.0.3
    released on 23rd January 2009
  • v4.0.2
    released on 16th December 2008
  • v4.0.1
    released on 5th December 2008
  • v4.0.0
    released on 21st November 2008

Can't find what you're looking for?