Tidbits on Eudora mail


Just a small article to gather infos about the venerable Eudora e-mail client whose development Qualcomm ended around 2006 at version (for Windows).

Writing a plug-in

It appears that the last version of the EMS (Extended Messaging Services) SDK is 4a4 from February 1998 and can be found on a few sites including this one:


A plug-in can be used to modify the contents of an e-mail, either as it's being downloaded or displayed.

Hello, World!

source file


? Bufftype.h and .cpp

? encoding.h and .cpp

? file1847.h and .cpp

? mimetype.h and .cpp

? Rfc1847.h and .cpp

? Rfc822.h and .cpp





#include "resource.h" // Resource IDs for dialogs and icons

#include "myplugin.h" // DLL


#include <stdio.h>

#include <malloc.h> // malloc, free

#include <string.h> // strdup

#include <istream.h> // ifstream class

#include <fstream.h> // ofstream class


#include "mimetype.h"

#include "encoding.h"

#include "rfc822.h"


? NEEDED? #include <windows.h>

#include "ems-win.h" // The EMS API


static const int kPluginID = 13; // Unique ID of this plugin

static const char FAR*kPluginDescription = "Pseudo-Squish Sample Plugin, v2.0";

static const unsigned long kPluginIconID = IDI_MAIN;


static const int kTransmissionPseudoSquish  = 1; // Each translator needs a

static const int kArrivalPseudoSquish       = 2; // unique ID within the plugin


static const int kNumTrans       = 2; // How many translators in this plugin


extern CPseudoSqDLL theDLL; // (pseudosq.cpp : CPseudoSqDLL theDLL("Squish.DLL");)


int DoTransmissionPseudoSquish(ifstream& inFile, ofstream& outFile, emsProgress progress, emsMIMEtypeP FAR* out_mime);


/* Out: Plugin Version */

extern "C" long WINAPI ems_plugin_version(short FAR* apiVersion)



        *apiVersion = EMS_VERSION;

        return (EMSR_OK);




(from the SDK's FAQ.txt)

Q: Does the API support non-Microsoft compilers (Symantec, Borland, Turbo C++, Delphi) ?

A: The EMS API is designed with a standard C interface, which means any compiler capable of exports functions as standard C will work with the EMS API.

Q: Can I write the API functions in C++ or do they need to be in C?

A: All the EMS API functions must be exported with standard C interfaces. Your plug-in can be written completely in C++, as long as you specify ‘extern "C"’ for all the EMS API functions. This is usually accomplished by using our ems-win.h file, which has the correct exporting directives.

Q: My plug-in only loads when it is the only plug-in in the "plugins" directory, or when I remove a specific plug-in for the directory, why?

A: Each plug-in must have a universally unique ID number, which your plug-in must provide during ems_plugin_init(). To ensure these ID numbers are unique across all plug-ins, they are allocated by QUALCOMM. To obtain a unique ID, send any message to <emsapi-ids@qualcomm.com>. A list of several unique IDs will be returned by an auto-responder for you to use.

(from PDF)

Plug-in entry points

ems_plugin_version (Required)

ems_plugin_init (Required)

ems_plugin_finish (Required)




ems_translator_info (Optional*)



ems_queued_properties (Optional)

* At least one of  ems_translator_info, ems_attacher_info or ems_special_info  must be defined.


ems_attacher_info (Optional*)



ems_special_info (Optional*)



Except ems_plugin_init ,  ems_plugin_finish , and  ems_plugin_config all of these functions take an argument which specifies which of the translators, attachers or special tools in the plug-in is being called.


The above entry points are implemented as a set of functions in the DLL


Each plug-in must have a distinct ID number. To ensure these ID numbers are unique they are allocated by QUALCOMM. To obtain a unique ID, send a blank message to <emsapi-ids@qualcomm.com>. A list of several IDs will be returned by an auto-responder. The auto-responder doesn’t actually track IDs by individuals or organization, it just returns monotonically increasing integers, so it’s OK to request a second or third set if needed.

Each plug-in must have a distinct ID number. To ensure these ID numbers are unique they are allocated by QUALCOMM. To obtain a unique ID, send a blank message to <emsapi-ids@qualcomm.com>

5.1.0 - Unknown address error 550-'#5.1.0 Address rejected.'

Version numbers

There are version numbers for three things related to the EMS API. As Eudora changes it will have different version numbers. However every version of Eudora will not result in a change in the API definition so the API has its own version number. It is a single integer. It is also possible that Eudora will support multiple API versions for backward compatibility. The third version number is associated with the SDK. It may change independent of the Eudora version number.














Resources: ICO

"ANSI character set (which is a superset of ISO-8859-1)"

The author should be able to create a plug-in by creating the necessary C functions and some associated resources.

Free and Commercial Basic compilers

Free C/C++ Compilers and IDEs


Base64, Quoted-printable?


Content-Type: text/plain; charset=ISO-8859-1; format=flowed

Content-Transfer-Encoding: 8bit



Why "multipart/alternative" with no actual parts?

Content-Type: multipart/alternative;





Why is "é" turned into "=E9"?

Content-Type: text/plain; charset=windows-1252

vélo -> v=E9lo

Does the lack of "multipart/alternative" mean an e-mail only has a single part?

Content-Type: text/plain; charset="us-ascii"; format=flowed


Content-Type: multipart/alternative;  boundary="----=_Part_24928_19148457.1185203468377"

What's the opposite of "format=flowed" + <x-flowed> in In.mbx?

Content-Type: text/plain; charset="us-ascii"; format=flowed






Decyphering passwords

Eudora Password Recovery Tool

Removing X-Sender header

Here's how to get rid of the X-Sender header. More infos about this header in "What is 'X-Sender' in the message header?".

If, all of sudden, Eudora can no longer connect out to a remote POP server through a SPAM server running on localhost, and poops out "Could not connect to "" Cause: connection refused (10061)", it might be that the eudora.ini file is corrupt. Close Eudora, delete this file, restart Eudora and reconfigure, ie. set it to connect to 9999, and recreate Personas.

Windows Eudora Logging Instructions

Using Google to query the web

Here's how to get Eudora to query Google instead of jump.eudora.com when searching the web:

  1. Close Eudora
  2. Lake a backup of c:\Program Files\Qualcomm\Eudora\EudoraRes.dll3.
  3. Download and run "XN Windows resource editor"
  4. Open c:\Program Files\Qualcomm\Eudora\EudoraRes.dll
  5. String Table > 124: Right-click on item 1980 > Modify String
  6. Right click and modify that string to: http://www.google.com/search
  7. File > Save
  8. Restart Eudora, and give it a try

Converting UTF-8 incoming e-mails

Development of Eudora since in the late 90's, just when Unicode was finally starting to be mainstream. As a result, it's unable to display UTF-8-encoded e-mails.

Meanwhile, Daniel Kuhn's "UTF8 to ISO plugin V1.60 for Eudora" plug-in has a problem with some characters and cannot be worked on since the source code was lost; Thankfully, Brana Bujenovic's "Greek Message Viewer" alternative works very well to open faulty e-mails into its own window and convert characters so they're displayed as expected:

  1. Close Eudora
  2. Download "Greek Message Viewer" from www.drivehq.com/web/brana/plugins.htm . I used from December 2nd 2013.
  3. Unzip the file and copy viewer.dll into Eudora's plugins sub-directory, eg. "c:\Program Files\Eudora\plugins\". This should require Admin rights.
  4. Restart Eudora
  5. Select any UTF-8 e-mails from the In box, and select "Edit > Message Plug-ins/View - Plain Text Version"
  6. Through the plug-in's "View > Character Encoding" menu item, change the default charset from "Latin - Western European [System Default] (Windows-1252)" to "Unicode (UTF-8)".