Recommended Posts

ProcessWire DropboxAPI on GitHub:


This module is a wrapper for Kunal Varma's Dropbox PHP SDK

It was created to perform a specific function for a client, ie upload PDF files on a PW website to a specific Dropbox account folder.

The PDF files, created using @Wanze's excellent PagesToPdf module using the WirePDF functions, are generated from Formbuilder forms completed by front-end site visitors.  Works a treat!

There's more that could be done to allow ProcessWire to take advantage of all the features of the SDK, eg downloads, multiple Dropbox accounts, etc. You are welcome to request changes and/or fork the GitHub project to extend the feature set.


System requirements

  • PHP 5.6.4 or greater
  • Composer
  • The PHP mbstring extension

General information

This module enables you to access a single Dropbox ( account to upload files from a ProcessWire website.

All kudos to ( for the PHP API.

First steps

  • Visit ( and read the documentation.
  • Log into Dropbox and create a new application. It's recommended to limit ProcessWire App access to a specified folder
  • Make a note of the App key, the App secret and the name of the Dropbox folder


  • Download the zip file into your site/modules folder then expand the zip file.
  • Next, login to ProcessWire > go to Modules > click "Refresh". You should see a note that a new module was found. Install the DropboxAPI module.
  • Configure the module with your App key, App secret and your Call Back URL

You need to generate a Dropbox access token to enable your site to communicate with the nominated Dropbox account. Dropbox will generate a token for you or you can create a page for the front end of your ProcessWire site with a template to submit the token request to Dropbox, eg:

    <?php namespace ProcessWire;
    $drop = $modules->get('DropboxAPI');
    if ($input->get->code && $input->get->state) {
        $code = $sanitizer->text($input->get->code);
        $state = $sanitizer->text($input->get->state);
        //Fetch the AccessToken
        $accessToken = $drop->getAccessToken($code, $state);
        echo "Copy/paste this code into the module configuration: " .  $accessToken;
    } else {
        echo  "<p><a href='" . $drop->getAuthURL() . "'>Log in with Dropbox</a></p>";

Once you have entered the token in the module configuration, you can unpublish this page.


Read the dropbox-php-sdk documentation!

An example template for sending a file to a Dropbox App folder from ProcessWire:

    <?php namespace ProcessWire;
    use Kunnu\Dropbox\Dropbox;
    use Kunnu\Dropbox\DropboxApp;
    use Kunnu\Dropbox\DropboxFile;
    // send pdf to Dropbox
    $drop = $modules->get('DropboxAPI');
    $app = new DropboxApp($drop->app_key, $drop->app_secret, $drop->authorization_code);
    if ($app) {
        //Configure Dropbox service
        $dropbox = new Dropbox($app);
        $dropboxFile = new DropboxFile('/path/to/myfilename.pdf');
        $file = $dropbox->upload($dropboxFile, "/myfilename.pdf", ['autorename' => true]);
        //Uploaded File meta data
        if ($file) {
            $success = $file->getName() . " uploaded to Dropbox";



  • Like 13

Share this post

Link to post
Share on other sites

Thanks for sharing this module, @psy! Will definitely give this a try soon.

Just one observation at this point: only Process modules should have the Process prefix in their name, and since this isn't a Process module (i.e. it doesn't extend Process), I'd suggest considering another name for clarity. Perhaps just dropping the Process prefix? :)

  • Like 3

Share this post

Link to post
Share on other sites


Thanks for the tip. Was a bit confused about naming conventions. The module doesn't render anything so not Markup, and to me, it was a 'process', although granted, not a PW process. 

Done. Let me know if there are any problems relating to the name change.

  • Like 3

Share this post

Link to post
Share on other sites

At this point my best suggestions would be DropboxAPI, just plain Dropbox, or perhaps DropboxUpload... though that last one only if you are sure that you'll never add anything other than upload support for it :)

Share this post

Link to post
Share on other sites
3 minutes ago, teppo said:

At this point my best suggestions would be DropboxAPI, just plain Dropbox, or perhaps DropboxUpload... though that last one only if you are sure that you'll never add anything other than upload support for it :)

Changed it to DropboxAPI :)



  • Like 2

Share this post

Link to post
Share on other sites


By default the Dropbox App is in Development mode and allows only one user - you. When you apply for a token you may get a Dropbox notification saying you need more users. Simply go back into your Dropbox App configuration and click on the button to the right of this setting. You'll automatically be granted 500 development users.

Should you need more than 500 users, you'll need to apply to Dropbox for Production status for your App and totally outside the scope of this ProcessWire Dropbox API module.

  • Like 3

Share this post

Link to post
Share on other sites


Great module. Two requests:

  • Could the token step be incorperated into the admin settings or a required Process module?
  • I've been thinking for ages to whether it was possible to view the contents of a folder from dropbox on your site and create public links to files - use case: upload your resources to this folder in dropbox and they'll automatically appear on the site?


  • Like 1

Share this post

Link to post
Share on other sites


Thanks Ben

  • The token request could be on the admin side BUT the Dropbox call back URL must be a publicly viewable page to receive the token. I chose to put both the request and response on the same page and then unpublish the page once I'd received the token.
  • According to the documentation, the answer is yes. The PW module really does little more than authenticate the user and allow you to create the $dropbox object (as in example above for sending a file). Add all the appropriate "use" namespace statements in your template and you'll have full access to the API, including the ability to List Folder Contents
  • Like 3

Share this post

Link to post
Share on other sites


On 14/08/2017 at 0:43 AM, benbyf said:

I've been thinking for ages to whether it was possible to view the contents of a folder from dropbox on your site and create public links to files - use case: upload your resources to this folder in dropbox and they'll automatically appear on the site?

Tested and confirmed you can do this. Simple example (no paging although that's possible too):

<?php namespace ProcessWire;

use Kunnu\Dropbox\Dropbox;
use Kunnu\Dropbox\DropboxApp;
use Kunnu\Dropbox\DropboxFile;

$drop = $modules->get('DropboxAPI');
//Configure Dropbox Application
$app = new DropboxApp($drop->app_key, $drop->app_secret, $drop->authorization_code);
//Configure Dropbox service
$dropbox = new Dropbox($app);
$listFolderContents = $dropbox->listFolder(""); //root folder is the folder you nominated in the Dropbox App config. Refer doco
$items = $listFolderContents->getItems();
    <?php foreach ($items as $item) : ?>
    <?php endforeach; ?>

As for download links, you could use the Dropbox Chooser or create your own with javascript.


  • Like 2

Share this post

Link to post
Share on other sites

Hi sorry not big PHP dev (mainly front end) and none of the module makes sense to me (lots of namespaces). getting errors like this: Class 'Kunnu\Dropbox\DropboxApp' not found in /srv/users/serverpilot/apps/fabricacapital/public/site/templates/dropbox.php:8 on the public pages implementing either of teh code demos above. Any help would be ace!

Also I mamanged to get a app code directly in the dropbox developer portal, so no need for the token generating step above.

Share this post

Link to post
Share on other sites

Hi @benbyf

Yeah, the namespace stuff did my head in too! Adding them at the top of the page template under <?php namespace ProcessWire; was the only way I could get it to work. Once they're there, and the PW module is loaded, it's a matter of following the dropbox-api-sdk documentation to the letter.

Ooops! Just realised the GitHub version of the module has an error. Will upload fix.

Share this post

Link to post
Share on other sites

soooo confused about this module, how did you get it to work?!

e.g. /vendor/ and autoload.php folder/files don't exist in the repo.

Share this post

Link to post
Share on other sites

Did you do the upgrade to DropboxAPI.module ? The original version in GitHub looked for the wrong path to the autoload.php of the SDK files. This is what it should be:

require_once dirname(__FILE__) . '/dropbox-php-sdk/vendor/autoload.php';

From what I can gather from the error you mentioned, the SDK files aren't being loaded. The updated code should fix that.

Share this post

Link to post
Share on other sites

yep, updated. But like i mentioned there is simply no file called autoload in the repo... let allow a folder called vendor

Share this post

Link to post
Share on other sites

@benbyf are you using composer? Or manually downloading the packages?

vendor directory and autoload.php is created when you require a package with composer. 

  • Like 1

Share this post

Link to post
Share on other sites

Think I know what's going on, starting with my limited knowledge of github. Trying to work it out...

Share this post

Link to post
Share on other sites
10 minutes ago, abdus said:

@benbyf are you using composer? Or manually downloading the packages?

vendor directory and autoload.php is created when you require a package with composer. 

Good point, not needed to use composer with Processwire yet, so didnt reach for it this time. I'm guess thats the problem then? Also no mention in teh installation notes either but might because i dont know what to look for maybe?

Am i right in saying using composer also makes a module incompatible with the PW admin module installer?

Share this post

Link to post
Share on other sites

WORKED!!!!! WHHHHOOOOPPPP. Thank you! Obvioulsy a bit of a n00b still for "proper" dev stuff. any good articles about composer best practises?


  • Like 1

Share this post

Link to post
Share on other sites

Just in case its useful for anyone, this is my function for creating a folder list with public links to files:

<?php namespace ProcessWire;
use Kunnu\Dropbox\Dropbox;
use Kunnu\Dropbox\DropboxApp;
use Kunnu\Dropbox\DropboxFile;

$drop = $modules->get('DropboxAPI');
//Configure Dropbox Application
$app = new DropboxApp($drop->app_key, $drop->app_secret, $drop->authorization_code);
//Configure Dropbox service
$dropbox = new Dropbox($app);

// get folder from user
$folder_path = "";
$folder_path = $user->folder;

// get items from dropbox folder
$listFolderContents = $dropbox->listFolder($folder_path); //root folder is the folder you nominated in the Dropbox App config. Refer doco
$items = $listFolderContents->getItems();

function listItems($items, $dropbox, $depth = 0){

    $out = "<ul class='depth-{$depth}'>";

    foreach ($items as $item){

        // get file name
        $name = $item->getName();

        // getPathLower
        $path = $item->getpathLower();
        $thumbPath = "no thumb";
        $thumbHasExt = strpos($path, '.');

        // file
        if($thumbHasExt && $path){

            $file = $dropbox->getTemporaryLink($path);
            $link = $file->getLink();
            $ext = substr($path, $thumbHasExt+1);
			// fontawesome file name icons
            $icon = "fa-file-o";
            switch ($ext) {
                case 'png':
                case 'jpg':
                case 'gif':
                case 'psd':
                case 'tiff':
                    $icon = 'fa-file-image-o';
                case 'pdf':
                    $icon = 'fa-file-pdf-o';
                case 'mp3':
                case 'wav':
                    $icon = 'fa-file-audio-o';
                case 'mov':
                case 'mp4':
                case 'm4a':
                    $icon = 'fa-file-video-o';
                case 'doc':
                case 'docx':
                    $icon = 'fa-file-word-o';
                case 'xls':
                case 'xlsx':
                    $icon = 'fa-file-excel-o';
                case 'ppt':
                case 'pptx':
                    $icon = 'fa-file-powerpoint-o';
                case 'zip':
                case 'rar':
                    $icon = 'fa-file-archive-o';

            $out .= "<li><span class='{$icon} fa'></span><a title='click to download' href='{$link}'>{$name} {$ext}</a></li>";

        // folder

            $out .= "<li><span class='fa-folder-open-o fa'></span>{$name}";

            $listSubFolderContents = $dropbox->listFolder($path);
            $items = $listSubFolderContents->getItems();

            // get list of files in subfolder
            $out .= listItems($items, $dropbox, $depth);

            $out .= "</li>";
    $out .= "</ul>";

    return $out;
// get depth 0 folder items
$out = listItems($items, $dropbox, $depth);


  • Like 3

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By JohnK
      When I was building a little commercial Processwire website for a family member, I started looking into caching with WireCache and somehow had troubles to find a satisfying solution to organize the caches and their expirations. My site had a few parts that updated in a regular manner while other parts should be refreshed whenever the current page - or e.g. for the menu: any page - was saved. I wanted to create a cache of the whole page's html which should expire whenever any of its parts expired. This would be simple if you could set multiple expire values for one cache. Unfortunately, you can only set one. So I started to build a solution to my problem which uses the WireCache and creates a dependency tree for every cache. And since I haven't yet implemented a Processwire module and this little class might be useful for other websites, too, I thought I'd try to make a module out of it. This is it.
      Please have a look, and feel free to leave a comment. This is my first module, so any suggestions are welcome. I am not even sure if my approach makes much sense for performance reasons. I'm happy to hear your opinions!
      Thanks a lot!
    • By kongondo
      Process Sites Manager
      ProcessWire supports multiple site setups using various methods. One of the more common approaches is running multiple sites from the same core installation with each site maintaining its own database (aka option #1). This approach requires the site admin to initially install ProcessWire in a temporary directory for each new site. The directory then needs to be renamed as site-xxx, where ‘xxx’ is any name you want to use to differentiate the installation from other sites, before it is moved to the webroot. For instance, site-mysite, site-another, site-whatever. In addition, the /wire/index.config.php file must be copied/moved to the webroot. Each time a site is added, the index.config.php has to be edited to add ‘domain’ => ‘site-directory’ key=>value pairs for the site. This process can become a bit tedious. This module aims to automate the whole process.
      The module is based off the official ProcessWire installer. Creating a site is as simple as completing and submitting a single form! The module will:
      Install a ProcessWire site in your named directory, applying chmod values as specified
      Move the directory to your webroot
      Update/Create a Superuser account as per the submitted form, including setting the desired admin theme and colour
      Update sites.json (used by index.config.php to get array of installed sites)
      Please note that this module is not a multiple sites solution! It is just a helper class for those using option #1. Your multi-sites solution will still be delivered by ProcessWire core. The only difference is index.config.php is slightly different from the one that ships with ProcessWire.
      This module works as expected. However, it needs a bit more testing in different environments. In light of this, it is labelled as alpha and should not be used in a production environment.
      Download from GitHub: Sites Manager
      Install unlimited number of sites in one ProcessWire install
      Choose an Admin Theme to auto-install along with the site installation
      Install and maintain site profiles for reuse to create other sites
      Client and server-side validation of site creation form
      Edit uploaded profiles (e.g., replace profile file)
      Lock installed sites and profiles to prevent editing
      Bulk delete site profiles, installed site directories and/or databases (confirmation required for latter two)
      View important site details (admin login, chmod, etc)
      Links to installed sites home and admin pages
      Timezones auto-complete/-suggest
      Installations’ domains/sub-domains must exist before installing the site. This is needed in order to update/save the Superuser account for the new site. For instance, if creating a site with the subdomain (with directory site-blog), that subdomain must be active. For local development, if using Apache, for instance, a virtual host directive for must have been set up prior to the installation. For remote/live sites, the subdomain must have been set up at your Domain Name Registrar.
      Site Profiles
      You will need to prepare site profiles for use with the module. Example site profiles ship with ProcessWire. These include ‘site-default’, ‘site-classic’, ‘site-blank’, etc. The module only accepts zip files. Each of these folders needs to be compressed into a zip file, for instance ‘’, ‘’, etc. Please note that the other content you get with ProcessWire downloads are not required. These include the wire folder and .gitignore, index.php, etc files. Do not include any of these in the ‘’.
      You are not limited to using the site profiles that ship with ProcessWire. You can create and use your own custom profiles as long as they are structured according to the format ProcessWire expects (@see site-default that ships with ProcessWire as an example).
      Install the module like any other. It will create required templates, fields and pages (hidden in admin under Multi Sites). The install will also copy two files to your webroot; sites.json and index.config.php. If any identical module components (field, templates, files, etc) are found in your system, the module will not install but will instead error out with a relevant message.
      Module Files
      The two file sites.json and index.config.php should not be removed from your webroot if you are using this module. The former should remain writable at all times. The index.config.php is a modified version of the one that ships with ProcessWire. Rather than editing the file directly with new entries for installed sites, it fetches the information about multi-sites sites that ProcessWire needs to serve directly from the site.json contents which it converts to an array before passing off to ProcessWire. We haven’t done any real-world testing (yet) but have not observed any noticeable delays in serving the multi-sites sites in this manner.
      The module will be useful in both development and production (@see note above! When ready) environments.
      For development work, there are times when you need to quickly put up a temporary site to test something, debug an install or create a mock website to present draft ideas to a client, etc. This module allows you to do all these, and more, easily and quickly.
      For live sites, the module can be a time saver, allowing you to install and manage (very limited feature-set at present) your sites from one dashboard.
      Site Profiles
      The first thing to do after installing the module is to upload at least one site profile. In the Upload page, complete the ‘upload a site profile form’. Give the profile upload a title, optionally a description (good reminder about what the profile features), ProcessWire compatibility and of course the profile zip file itself. Profile uploads are saved as hidden pages in the admin. This enables reuse of the profile, so that you don’t have to upload it over and over every time you need to install a site.
      Uploaded profiles are listed under the page Profiles. Head over there to see a list of available profiles. Using this page, you can edit individual profiles, e.g. change the title or replace the profile zip file. You can also lock/unlock or delete profiles. You are now ready to create sites.
      Create/Install Sites
      Head over to the Create page. This is where the automation really happens. Complete the form as required. Most of the inputs/fields should be familiar if you’ve ever installed ProcessWire. All fields, except for Description and HTTP Host Names, must be completed. It is recommended to complete these as well. Each field is accompanied by an explanation about what what it does (straight off the ProcessWire install you are used to). One bonus you get is you are able to select both an Admin Theme and Colour Theme to install! If you like AdminThemeReno in Blue, for instance, you can have that installed for you. Another bonus is the Default Timezone field. It uses auto-complete so that you don’t have to type the whole timezone name. Please note that, unlike in the official installer, profile previews are not (currently?) available.
      When you are happy with your settings click save to start the install. Please note that due to the additional client-side validation, if any of the checks fail, the errors to correct will be displayed in a modal and the form will not be submitted. Checks include mismatched Superuser passwords, empty required fields, invalid emails, short admin login URL/name, etc.
      If all went well, the site should install! Please note that currently (and a tad annoyingly!), the install will abort (sometimes half-way), if it hits an error. This has nothing to do with the official ProcessWire install but the checks we have put in the module code, currently. Hopefully, with feedback from the community, we can change how the module deals with errors. Most errors, if they appear, will be related to the file system...cannot write to file blah blah, etc.
      If you clicked on the button Save & View Sites, you should, momentarily (it may take a while depending on your system), see your new site on the page Installed. Otherwise, navigate to that page.
      On this page you see a list of installed sites and information about them. To view your site, click on the link in Domain. The site opens in a new tab. To head straight to the admin, click on the link in Admin Login. Log in with the Superuser credentials you supplied on the ‘create site form’. Voilà! Your new site’s admin with the theme and colours your selected applied for the Superuser!
      On the Installed sites page, you can lock/unlock the installed sites records (the pages). You can also bulk delete the sites’ directories (the site-mydomain directories in webroot) and/or their databases. A dialog appears asking you to confirm these latter two actions. Be careful with these! They are useful for erasing temporary test sites but you need to double check your intended action. It is therefore advisable to lock sites to prevent unintended erasure.
      Deleting a site’s directory and/or database also deletes its associated page record. This means you won’t be able to view it in the Installed page.
      Use this to make a clean getaway before uninstalling the module. The page will also allow you to specify whether you wish to delete the sites.json and index.config.php files from your webroot.
      Only Superusers can use the module.
      ProcessWire 2.7 - 3.x compatible
      Currently using ProcessWire 2.7 installer (install.php)
      Potential race condition when sites.json is being updated on a new site install vs. index.config.php accessing the json file?
      Not tested with sub-directory installs (for instance localhost/pw/my-site-here/)
      Currently not doing the extra/experimental database stuff (database charset and engine)
      Future Possibilities
      Install specified modules along with the ProcessWire install
      Create installation profiles and/or allow JSON/CSV install configurations (useful for repetitive values, e.g. where Superuser email doesn’t change)
      Profile previews?
      @ryan: for the ProcessWire installer
      @abdus: for the index.config.php reading from JSON idea
      @swampmusic: for the challenge
      Please help test and report any issues. Feature suggestions are also welcome. Comments on anything from UX to technical stuff to make this as robust as possible are appreciated.
      Video Demo
      Quick Demo (excuse the video quality please )

    • By Robin S
      Some introduction...
      This module is experimental and there are probably bugs - so treat it as alpha and don't use it on production websites.
      I started on this module because there have been quite a few requests for "fake" or "invisible" parent functionality and I was curious about what is possible given that the idea sort of goes against the PW page structure philosophy. I'm not sure that I will use this module myself, just because I don't really see a long list of pages under Home (or anywhere else) as untidy or cluttered. I would tend to use Lister Pro when I want to see some set of pages as a self-contained group. But maybe others will find it useful.
      At the moment this module does not manipulate the breadcrumb menu in admin. So when you are editing or adding a virtual child the real location of the page is revealed in the breadcrumb menu. That's because I don't see the point in trying to comprehensively fool users about the real location of pages - I think it's better that they have some understanding of where the pages really are. But I'm open to feedback on this and it is possible to alter the breadcrumbs if there's a consensus that it would be better that way.
      Virtual Parents
      Allows pages in Page List to be grouped under a virtual parent.
      This module manipulates the page list and the flyout tree menu to make it appear that one or more pages are children of another page when in fact they are siblings of that page.
      Why would you do that instead of actually putting the child pages inside the parent? Mainly if you want to avoid adding the parent name as part of the URL. For example, suppose you have some pages that you want to be accessed at URLs directly off the site root: But in the page list you want them to be appear under a parent for the sake of visual grouping or to declutter the page list under Home.
      Example of how the page structure actually is

      Example of how the page structure appears with Virtual Parents activated

      How it works
      This module identifies the virtual parents and virtual children by way of template. You define a single template as the virtual parent template and one or more templates as the virtual child templates. Anytime pages using the child template(s) are siblings of a page using the parent template, those child pages will appear as children of the virtual parent in the page list and tree menu.
      You will want to create dedicated templates for identifying virtual parents and virtual children and reserve them just for use with this module.
      Adjusts both page list and tree flyout menu to show the virtual parent/child structure, including the count of child pages. Works everywhere page list is used: Page List Select / Page List Select Multiple (and therefore CKEditor link dialog). Intercepts the "Add page" process in admin, so that when an attempt is made to add a child to a virtual parent, the child is added where it belongs (the next level up) and the template selection is limited to virtual child templates. Intercepts moving and sorting pages in the page list, to ensure only virtual children may be moved/sorted under the virtual parent. Superusers have a toggle switch at the bottom of the page list to easily disable/enable Virtual Parents in order to get a view of what the real page structure is. Usage
      Install the Virtual Parents module.
      In the module config, enter pairs of parent/child template names in the form virtual_parent_template=virtual_child_template. If needed you can specify multiple pipe-separated child templates: virtual_parent_template=child_template_1|child_template_2. One pair of template names per line.
      There is a checkbox in the module config to toggle Virtual Pages on and off, but it's more convenient to use this from the page list.
      It's important to keep in mind the real location of the virtual child pages. This module is only concerned with adjusting the appearance of page list and tree menu for the sake of visual grouping and tidiness. In all other respects the virtual children are not children of the virtual parent at all.
      It's recommended to select an icon for the virtual parent template (Advanced tab) so virtual parents are marked out in the page list as being different from normal parent pages.
      Do not place real children under a virtual parent. There is some protection against this when moving pages in the page list, but when it comes to changing a page's parent via the Settings tab the only protection is common sense.
    • By horst
      Wire Mail SMTP

      An extension to the new WireMail base class that uses SMTP-transport

      This module integrates EmailMessage, SMTP and SASL php-libraries from Manuel Lemos into ProcessWire. I use this continously evolved libraries for about 10 years now and there was never a reason or occasion not to do so. I use it nearly every day in my office for automated composing and sending personalized messages with attachments, requests for Disposition Notifications, etc. Also I have used it for sending personalized Bulkmails many times.

      The WireMailSmtp module extends the new email-related WireMail base class introduced in ProcessWire 2.4.1 (while this writing, the dev-branch only).
      Here are Ryans announcement.

      Current Version 0.2.7
      get it from the Modules Directory Install and Configure

      Download the module into your site/modules/ directory and install it.

      In the config page you fill in settings for the SMTP server and optionaly the (default) sender, like email address, name and signature.
      You can test the smtp settings directly there. If it says "SUCCESS! SMTP settings appear to work correctly." you are ready to start using it in templates, modules or bootstrap scripts.

      Usage Examples
      The simplest way to use it:
      $numSent = wireMail($to, $from, $subject, $textBody); $numSent = wireMail($to, '', $subject, $textBody); // or with a default sender emailaddress on config page This will send a plain text message to each recipient.
      You may also use the object oriented style:
      $mail = wireMail(); // calling an empty wireMail() returns a wireMail object $mail->to($toEmail, $toName); $mail->from = $yourEmailaddress; // if you don't have set a default sender in config // or if you want to override that $mail->subject($subject); $mail->body($textBody); $numSent = $mail->send(); Or chained, like everywhere in ProcessWire:
      $mail = wireMail(); $numSent = $mail->to($toEmail)->subject($subject)->body($textBody)->send(); Additionaly to the basics there are more options available with WireMailSmtp. The main difference compared to the WireMail BaseClass is the sendSingle option. With it you can set only one To-Recipient but additional CC-Recipients.
      $mail = wireMail(); $mail->sendSingle(true)->to($toEmail, $toName)->cc(array('', '', '')); $numSent = $mail->subject($subject)->body($textBody)->send(); The same as function call with options array:
      $options = array( 'sendSingle' => true, 'cc' => array('', '', '') ); $numSent = wireMail($to, '', $subject, $textBody, $options); There are methods to your disposal to check if you have the right WireMail-Class and if the SMTP-settings are working:
      $mail = wireMail(); if($mail->className != 'WireMailSmtp') { // Uups, wrong WireMail-Class: do something to inform the user and quit echo "<p>Couldn't get the right WireMail-Module (WireMailSmtp). found: {$mail->className}</p>"; return; } if(!$mail->testConnection()) { // Connection not working: echo "<p>Couldn't connect to the SMTP server. Please check the {$mail->className} modules config settings!</p>"; return; } Following are a ...

      List of all options and features

      testConnection () - returns true on success, false on failures

      sendSingle ( true | false ) - default is false

      sendBulk ( true | false ) - default is false, Set this to true if you have lots of recipients (50+)

      to ($recipients) - one emailaddress or array with multiple emailaddresses

      cc ($recipients) - only available with mode sendSingle, one emailaddress or array with multiple emailaddresses

      bcc ($recipients) - one emailaddress or array with multiple emailaddresses

      from = '' - emailaddress, can be set in module config (called Sender Emailaddress) but it can be overwritten here

      fromName = 'Name Surname' - optional, can be set in module config (called Sender Name) but it can be overwritten here

      priority (3) - 1 = Highest | 2 = High | 3 = Normal | 4 = Low | 5 = Lowest

      dispositionNotification () or notification () - request a Disposition Notification

      subject ($subject) - subject of the message

      body ($textBody) - use this one alone to create and send plainText emailmessages

      bodyHTML ($htmlBody) - use this to create a Multipart Alternative Emailmessage (containing a HTML-Part and a Plaintext-Part as fallback)

      addSignature ( true | false ) - the default-behave is selectable in config screen, this can be overridden here
      (only available if a signature is defined in the config screen)

      attachment ($filename, $alternativeBasename = "") - add attachment file, optionally alternative basename

      send () - send the message(s) and return number of successful sent messages

      getResult () - returns a dump (array) with all recipients (to, cc, bcc) and settings you have selected with the message, the message subject and body, and lists of successfull addresses and failed addresses,

      logActivity ($logmessage) - you may log success if you want

      logError ($logmessage) - you may log warnings, too. - Errors are logged automaticaly
      useSentLog (true | false) - intended for usage with e.g. third party newsletter modules - tells the send() method to make usage of the sentLog-methods - the following three sentLog methods are hookable, e.g. if you don't want log into files you may provide your own storage, or add additional functionality here

      sentLogReset ()  - starts a new LogSession - Best usage would be interactively once when setting up a new Newsletter

      sentLogGet ()  - is called automaticly within the send() method - returns an array containing all previously used emailaddresses

      sentLogAdd ($emailaddress)  - is called automaticly within the send() method
    • By ukyo
      Call ProcessWire API Functions Inside STRING
      Github Repo
      Current status : BETA
      Each called method must return string value !
      I added all functions, but not tested all. I focused page(), page()->render and field properties (label, description and notes). I also tested some basic pages() api calls.
      Your API calls must start with { and must end with }. For use multiple arguments inside functions, separate arguments with ~ char.
      NOTE If you pass directly arguments to api {page(title)}, this call will check for requestedApiCall()->get(arguments).
      processString(string, page, language); Get page title <?php $str = "You are here : {page:title}"; echo processString($str); ?> Get page children render result <?php $str = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.<hr>{page:render:children}"; echo processString($str); ?> Get homepage title <?php $str = "You can visit our <a hre='{pages(1):url}'>{pages:get(1):title}</a>"; echo processString($str); ?> Get title field label, description or notes <?php $str = "Our title field properties are : label: {label(title)} - description: {description(title)} - notes: {notes(title)}"; echo processString($str); ?> Multiple examples <?php $str = " <ul class='uk-list uk-list-striped'> <li><b>01: GET FIELD LABEL</b> <code>&#123;label(title)&#125;</code> <b>RESULT :</b> <code>{label(title)}</code></li> <li><b>02: GET FIELD LABEL WITH PREFIX</b> <code>&#123;label(title~=> )&#125;</code> <b>RESULT :</b> <code>{label(title~=> )}</code></li> <li><b>03: GET FIELD LABEL WITH SUFFIX</b> <code>&#123;label(title~~ <=)&#125;</code> <b>RESULT :</b> <code>{label(title~~ <=)}</code></li> <li><b>04: GET FIELD DESCRIPTION</b> <code>&#123;description(title)&#125;</code> <b>RESULT :</b> <code>{description(title)}</code><br> <li><b>05: GET FIELD DESCRIPTION WITH PREFIX</b> <code>&#123;description(title~=> )&#125;</code> <b>RESULT :</b> <code>{description(title~=> )}</code></li> <li><b>06: GET FIELD DESCRIPTION WITH SUFFIX</b> <code>&#123;description(title~~ <=)&#125;</code> <b>RESULT :</b> <code>{description(title~~ <=)}</code></li> <li><b>07: GET FIELD NOTES</b> <code>&#123;notes(title)&#125;</code> <b>RESULT :</b> <code>{notes(title)}</code><br> <li><b>08: GET FIELD NOTES WITH PREFIX</b> <code>&#123;notes(title~=> )&#125;</code> <b>RESULT :</b> <code>{notes(title~=> )}</code></li> <li><b>09: GET FIELD NOTES WITH SUFFIX</b> <code>&#123;notes(title~~ <=)&#125;</code> <b>RESULT :</b> <code>{notes(title~~ <=)}</code></li> <li><b>10: GET PAGE TITLE</b> <code>&#123;page(title)&#125;</code> <b>RESULT :</b> <code>{page(title)}</code></li> <li><b>11: GET PAGE TITLE</b> <code>&#123;page:title&#125;</code> <b>RESULT :</b> <code>{page:title}</code></li> <li><b>12: GET PAGE RENDER TITLE</b> <code>&#123;page:render:title&#125;</code> <b>RESULT :</b> <code>{page:render:title}</code></li> <li><b>12: GET HOMEPAGE TITLE</b> <code>&#123;pages:get(template=home):title&#125;</code> <b>RESULT :</b> <code>{pages:get(template=home):title}</code></li> <li><b>13: GET HOMEPAGE TEMPLATE ID</b> <code>&#123;pages:get(template=home):template:id&#125;</code> <b>RESULT :</b> <code>{pages:get(template=home):template:id}</code></li> </ul> "; echo processString($str); ?>