Jump to content
Pete

ProcessEmailToPage

Recommended Posts

Hi all

This module was sponsored by Jason as per this topic: http://processwire.com/talk/topic/3566-email-image-module-development/

It's quite similar to horst & ryan's EmailImage module, but supports multiple email addresses for sending emails to different parts of your site, also allowing you to select different templates. There is also a delimiter option whereby you can split up the email's content and have text appear in the body or sidebar etc.

Here's a video to show you what I mean.

The video may well be of interest to other module authors as I used some Ajax to push what can normally be done in the module config - hope you like it :)

There was the temptation to build on the EmailImage module with this one, but I already had code for my Helpdesk module (work in progress) that parsed emails using Flourishlib and wanted to use that code instead for this one.

EDIT: Also worth noting is that unlike the EmailImage module, this doesn't come with a pre-built gallery template for the front-end. This is intentional as you could pipe emails into any part of a site you like, so I couldn't make assumptions as to usage of the content.

You can download it via the modules directory.

  • Like 22

Share this post


Link to post
Share on other sites

Pete this is incredibly well done and beautifully put together–nice job! 

  • Like 1

Share this post


Link to post
Share on other sites

Pete, this looks fantastic (just watched the video).

Few questions popped on my mind while watching: why is parent page called category on module settings page? "Images" field name seems to be hardcoded? Does (or will it) support other attachments than images?

Again, brilliant work. Thanks Pete & Jason.

  • Like 1

Share this post


Link to post
Share on other sites

Thanks ryan!

And thanks again to Jason for letting my run with some ideas. I could just as easily completed this by making the admin enter comma separated values in a textarea field (the easy way to go) but I wanted to make input foolproof and the idea was already in my head.

And now some techy stuff:

I had some fun working out the ajax behind adding new rows and settling on saving the field data as a JSON string in the end (which is fine because nobody is going to set up dozens of email accounts!) but if there are any suggestions for improvement there then please let me know as it seems to me now that there are endless possibilities for "add another row" type setups in module configuration.

Before that I was trying to overcomplicate things and have the new rows save in the background as an array, but if I intercepted the page save, ran the ajax request and then use jQuery to finish submitting the form then it wouldn't save the other form data. I abandoned that idea completely (but left the function in the module file for reference). In the end, keeping it simple worked out better as running ajax upon saving the config page slowed the page save process down as it essentially sent two requests - converting the data to a json string and saving to a hidden field is instantaneous by comparison :D

To those not following all that, my eventual solution was to KISS :)

  • Like 3

Share this post


Link to post
Share on other sites

Antti - to answer your questions:

  1. This grated on me every time I wrote the word "category" and I should probably just change it to "parent page" as that's more in keeping with ProcessWire's terminology (to newcomers "Category" makes sense, but PW is all about enticing people to learn new things after all ;)). I'll change this in the next update.
  2. It is hardcoded to the images field for now. I realise this is a bit of a gamble that they haven't renamed/deleted this field, so should probably add an extra config option for this. The reason I didn't for now is that it then led me to thinking (as you have) about other file types and then I thought about allowing different fields for different templates and started to get a headache :D I should at least do the first part and allow the admin to select a different field, plus add more checks for attachment filetypes.

As a result of those two points, the next version really needs:

  • Rename "category" to "parent page" throughout
  • Allow admin to select image field
  • Add more checks for filetypes attached to emails
  • Add field for whitelist of email addresses
  • Maybe allow for other attachments (why not? It's simple enough ;))

Not sure when I might get around to these as there may be other stuff in the pipeline before then :)

  • Like 3

Share this post


Link to post
Share on other sites

Glad you guys like it, Pete did a phenomenal job and was great to work with. More modules to follow soon, standby! :-)

  • Like 5

Share this post


Link to post
Share on other sites

thanks for the module Jason & Pete!

I got a problem running the cron job via module hash though:

Error:     Exception: There was an error connecting to the server (in /[...]/site/modules/ProcessEmailToPage/flourishlib/fMailbox.php
line 981)

#0 /[...]/site/modules/ProcessEmailToPage/flourishlib/fMailbox.php(1227): fMailbox->connect()

#1 /[...]/site/modules/ProcessEmailToPage/ProcessEmailToPage.module(265): fMailbox->listMessages()

#2 /[...]/wire/core/Wire.php(293): ProcessEmailToPage->importFromEmail(Object(HookEvent))

#3 /[...]/wire/core/Wire.php(229): Wire->runHooks('render', Array)

#4 /[...]/wire/modules/Process/ProcessPageView.module(97): Wire->__call('render', Array)

#5 /[...]/wire/modules/Process/ProcessPageView.module(97): Page->render()

#6 [internal function]: Pro
 

... guess the email/host settings aren't right

the email account is set up for the same domain the actual website is on.

any ideas what I could have missed?

thanks a lot, cheers

Share this post


Link to post
Share on other sites

I'd probably need to see your configuration for the module, as well as exactly what you've put as the link in CRON - you can PM me a screenshot of the config if you like.

  • Like 1

Share this post


Link to post
Share on other sites

Thanks for this amazing Module Pete!

I have a site but don't have an email server/service running on the domain where a site is.

Am I being thick by assuming I can setup say a Gmail address and use the IMAP or POP instructions for accessing that Gmail in your Modules fields and it should work, or am I missing something basic (I've assumed the fields Password, Type, Host, Port Number mean the Module is going to go and read emails from an email server, such as Gmail)?

I went with the above assumptions but got errors but rather than bore you with detail I thought I'd ask the above first.

Thanks in advance for any comments ^_^

Share this post


Link to post
Share on other sites

Hi Alan

It should work with a Gmail account, though I've not tried yet - all mine have rather too much mail in to give it a go without consuming vast amounts of server memory :D

Share this post


Link to post
Share on other sites

;) I *know* what you're saying there Pete about Gmail!

Good to know it should work.

One question before I go back and try again, does the Module look for unread Emails, act on those, mark them as read and hence not post the same thing twice on successive cron runs, or is there some other mechanism that manages this?

Share this post


Link to post
Share on other sites

It will read in anything from the mailbox and delete the emails once it's done, so be careful with that!

Share this post


Link to post
Share on other sites

Excellent, understood, thanks Pete!

Share this post


Link to post
Share on other sites

I can confirm that it does work with Gmail. Configuring Gmail took a tad more tinkering than my POP3 account. I think this was the information I used a couple months back when checking it out -

Incoming Mail (POP3) Server - requires SSL: pop.gmail.com
Use SSL: Yes
Port: 995

Share this post


Link to post
Share on other sites

Hmm. I am not getting IMAP or POP to work, with POP I am getting when I run the CRON

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator to inform of the time the error occurred and of anything you might have done that may have caused the error.

More information about this error may be available in the server error log. 

I *think* it may be that the webserver in question has no email access or server (so I think for instance that the usual ports for POP are closed in the firewall).

Maybe this means I just can't use this Module (sad).

Share this post


Link to post
Share on other sites

Pete, have you tried (or had any problems) with Flourish incorrectly converting non-standard ASCII characters in your emails? I was enjoying their Mailbox classes for something else up until I had this problem, then checked their GitHub issues page and was a lot more skeptical. I'll be checking out Zend's classes now to see if it works any better, but was curious with your own results in using this.

Dealing with mail and all the different variations on what should be a strict format is kind of a pain. :)

== EDIT ==

Nevermind. I just noticed that in my super-quick test page to see how Flourish would work I did not set up the proper PHP settings for UTF-8 rendering (header and meta). It would be worth noting that a site (or page) layout using the Flourish library must be rendered in UTF-8 due to how it was developed. I feel silly, but am glad that I was mistaken. I may still look at Zend, but only if Flourish doesn't handle all of my use-cases properly.

Share this post


Link to post
Share on other sites

Brendon - was going to say I hadn't noticed any issues but glad it's not an issue anyway.

When testing I'd used webmail like Gmail, as well as self-hosted webmail RoundCube and finally Outlook. I've not tried every combination of email program though as there are too many variations as you say.

In an ideal world, someone would invent "Email 2.0" to fix non-standard formats and banish spam forever somehow, but until then we're stuck with non-standard programs all doing slightly different things ;)

  • Like 1

Share this post


Link to post
Share on other sites

Hi

I've been installing this great module, and it does appear to be mostly working; except for an issue.

The subject line parses ok and forms the title of the new page, but anything after that doesn't seem to process. I've tried just general text and using the delimiter ==blog==, but anything other than the title doesn't seem to appear in the new pages?

Share this post


Link to post
Share on other sites

Can you post an example of the body of the email please?

Theoretically, if you have a field called "blog" then anything in the email before ==blog== will be posted to the "body" field, and anything after ==blog== to the blog field.

Share this post


Link to post
Share on other sites

Cheers Pete

It looks like this:

























Subject:   Title goes in this field From:   ###@####web.com Date:   Sun, October 20, 2013 12:24 am To:   ###@####web.com Priority:   Normal
Options: 



body goes in this field==blog==blog text goes in this field

and yet, every time, the title get successfully posted into the new page but anything else just seems to get ignored

Share this post


Link to post
Share on other sites

As long as there are fields called "body" and "blog" in the template these posts are being sent to I'm not sure what the issue might be. Does it definitely use the right template when creating the pages?

Does it do anything if you remove the ==blog== delimiter? Theoretically that should post all content to the body field.

Share this post


Link to post
Share on other sites

Yes, I've tried it without ==blog== written in also hoping it would just write the the body field but nothing. It's very odd, it successfully brings the title across. And as the title is coming across it would make sense that the connection to the mail server is successful. The mail server is on a separate box but connection appears to succeed.

I did have the module stored in the root of the modules directory, but since then I've uninstalled the module, moved the files to /site/modules/ProcessEmailToPage and reinstalled.

Is there anything else I can try as I really like the idea of the module.

Share this post


Link to post
Share on other sites

thanks for the module Jason & Pete!

I got a problem running the cron job via module hash though:

Error:     Exception: There was an error connecting to the server (in /[...]/site/modules/ProcessEmailToPage/flourishlib/fMailbox.php
line 981)
...
 
...

fenton, what was the problem in your case. Have the same here.

greetings,

martin

Share this post


Link to post
Share on other sites

fenton, what was the problem in your case. Have the same here.

greetings,

martin

got ist. secure wasn`t recognised, changed port to 143 and works fine.

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 joshua
      This module is (yet another) way for implementing a cookie management solution.
      Of course there are several other possibilities:
      - https://processwire.com/talk/topic/22920-klaro-cookie-consent-manager/
      - https://github.com/webmanufaktur/CookieManagementBanner
      - https://github.com/johannesdachsel/cookiemonster
      - https://www.oiljs.org/
      - ... and so on ...
      In this module you can configure which kind of cookie categories you want to manage:

      You can also enable the support for respecting the Do-Not-Track (DNT) header to don't annoy users, who already decided for all their browsing experience.
      Currently there are four possible cookie groups:
      - Necessary (always enabled)
      - Statistics
      - Marketing
      - External Media
      All groups can be renamed, so feel free to use other cookie group names. I just haven't found a way to implement a "repeater like" field as configurable module field ...
      When you want to load specific scripts ( like Google Analytics, Google Maps, ...) only after the user's content to this specific category of cookies, just use the following script syntax:
      <script type="optin" data-type="text/javascript" data-category="statistics" data-src="/path/to/your/statistic/script.js"></script> <script type="optin" data-type="text/javascript" data-category="marketing" data-src="/path/to/your/mareketing/script.js"></script> <script type="optin" data-type="text/javascript" data-category="external_media" data-src="/path/to/your/external-media/script.js"></script> <script type="optin" data-type="text/javascript" data-category="marketing">console.log("Inline scripts are also working!");</script> The type has to be "optin" to get recognized by PrivacyWire, the data-attributes are giving hints, how the script shall be loaded, if the data-category is within the cookie consents of the user. These scripts are loaded asynchronously after the user made the decision.
      If you want to give the users the possibility to change their consent, you can use the following Textformatter:
      [[privacywire-choose-cookies]] It's planned to add also other Textformatters to opt-out of specific cookie groups or delete the whole consent cookie.
      You can also add a custom link to output the banner again with a link / button with following class:
      <a href="#" class="privacywire-show-options">Show Cookie Options</a> <button class="privacywire-show-options">Show Cookie Options</button> This module is still in development, but we already use it on several production websites.
      You find it here: PrivacyWire Git Repo
      Download as .zip
      I would love to hear your feedback 🙂
      CHANGELOG
      0.0.5 Multi-language support included completely (also in TextFormatter). Added possibility to async load other assets (e.g. <img type="optin" data-category="marketing" data-src="https://via.placeholder.com/300x300">) 0.0.4 Added possibility to add an imprint link to the banner 0.0.3 Multi-language support for module config (still in development) 0.0.2 First release 0.0.1 Early development
    • By MoritzLost
      This is a new module that provides a simple solution to clearing all your cache layers at once, and an extensible interface to perform various cache-related actions.
      The simple motivation behind this module was that I was tired of manually clearing caches in several places after deploying a change on a live site. The basic purpose of this module is a simple Clear all caches link in the Setup menu which clears out all caches, no matter where they hide. You can customize what exactly the module does through it's configuration menu:
      Expire or delete all cache entries in the database, or selectively clear caches by namespace ($cache API) Clear the the template render cache. Clear out specific folders inside your site's cache directory (/site/assets/cache) Refresh version strings for static assets to bust client-side browser caches (this requires some setup, see the full documentation for details). This is the basic function of the module. However, you can also add different cache management action through the API and execute them through the module's interface. For this advanced usage, the module provides:
      An interface to see all available cache actions and execute them. A system log and logging output on the module page to see verify what the module is doing. A CacheControlTools class with utility functions to clear out different caches. An API to add cache actions, execute them programmatically and even modify the default action. Permission management, allowing you granular control over which user roles can execute which actions. The complete documentation can be found in the module's README.
      Beta release
      Note that I consider this a Beta release. Since the module is relatively aggressive in deleting some caches, I would advise you to install in on a test environment before using it on a live site.
      Let me know if you're getting any errors, have trouble using the module or if you have suggestions for improvement!
      In particular, can someone let me know if this module causes any problems with the ProCache module? I don't own or use it, so I can't check. As far as I can tell, ProCache uses a folder inside the cache directory to cache static pages, so my module should be able to clear the ProCache site cache as well, I'd appreciate it if someone can test that for me.
      Future plans
      If there is some interest in this, I plan to expand this to a more general cache management solution. I particular, I would like to add additional cache actions. Some ideas that came to mind:
      Warming up the template render cache for publicly accessible pages. Removing all active user sessions. Let me know if you have more suggestions!
      Links
      https://github.com/MoritzLost/ProcessCacheControl ProcessCacheControl in the Module directory

    • By David Karich
      Admin Page Tree Multiple Sorting
      ClassName: ProcessPageListMultipleSorting
      Extend the ordinary sort of children of a template in the admin page tree with multiple properties. For each template, you can define your own rule. Write each template (template-name) in a row, followed by a colon and then the additional field names for sorting.
      Example: All children of the template "blog" to be sorted in descending order according to the date of creation, then descending by modification date, and then by title. Type:
      blog: -created, -modified, title  Installation
      Copy the files for this module to /site/modules/ProcessPageListMultipleSorting/ In admin: Modules > Check for new modules. Install Module "Admin Page Tree Multible Sorting". Alternative in ProcessWire 2.4+
      Login to ProcessWire backend and go to Modules Click tab "New" and enter Module Class Name: "ProcessPageListMultipleSorting" Click "Download and Install"   Compatibility   I have currently tested the module only under PW 2.6+, but think that it works on older versions too. Maybe someone can give a feedback.     Download   PW-Repo: http://modules.processwire.com/modules/process-page-list-multiple-sorting/ GitHub: https://github.com/FlipZoomMedia/Processwire-ProcessPageListMultipleSorting     I hope someone can use the module. Have fun and best regards, David
    • By dimitrios
      Hello,
      this module can publish content of a Processwire page on a Facebook page, triggered by saving the Processwire page.
      To set it up, configure the module with a Facebook app ID, secret and a Page ID. Following is additional configuration on Facebook for developers:
      Minimum Required Facebook App configuration:
      on Settings -> Basics, provide the App Domains, provide the Site URL, on Settings -> Advanced, set the API version (has been tested up to v3.3), add Product: Facebook Login, on Facebook Login -> Settings, set Client OAuth Login: Yes, set Web OAuth Login: Yes, set Enforce HTTPS: Yes, add "https://www.example.com/processwire/page/" to field Valid OAuth Redirect URIs. This module is configurable as follows:
      Templates: posts can take place only for pages with the defined templates. On/Off switch: specify a checkbox field that will not allow the post if checked. Specify a message and/or an image for the post.
      Usage
      edit the desired PW page and save; it will post right after the initial Facebook log in and permission granting. After that, an access token is kept.
       
      Download
      PW module directory: http://modules.processwire.com/modules/auto-fb-post/ Github: https://github.com/kastrind/AutoFbPost   Note: Facebook SDK for PHP is utilized.


×
×
  • Create New...