Is CMail free?

CMail is provided as-is, free of charge. It may be used for both personal or commercial purposes and be distributed without restriction, provided the software remains unmodified. Please ensure any acknowledgements in ThirdParty.txt (SSL-enabled version only at present) are preserved.

Is there a portable version of CMail/CMailGUI?

CMail is portable. It will not write any configuration to file or the registry, but it will access configuration files if they exist.

CMailGUI does store its configuration on disk. It can be made fully portable by simply creating a blank file named cmailgui.json in the same directory as cmailgui.exe. CMailGUI stores all its configuration and profile data in that file.

How do I escape an @ in my username?

CMail parses the hostname portion of the -host setting first, so no escaping is required.

How do I send e-mail using a GMail account?

To send to GMail, use the -starttls option and send to port 587 (preferred), or use the -secureport option. You must either use the App Password feature or provide your own OAUTHBEARER token.

Does CMail support OAuth2?

Yes, sort of. CMail supports OAuth2 authentication if the user provides an access token in place of a password and uses the -oauth setting. CMail does not have any built-in mechanism to obtain tokens. If you are a Google user, you can continue to use their SMTP services by enabling the App Password feature. A better option is to sign up with a dedicated SMTP provider such as SMTP2Go or DNS Exit, both of which offer free tiers.

Can I use a text file for the message body?

Yes. Message bodies may be read either from a file or pipe. See Examples.

How can I make CMail retry?

Retry support is the most requested feature for CMail. CMail does not retry. If mail delivery fails, CMail returns appropriate error codes, allowing the calling script (or human) to decide how to handle the situation.

Does CMail use return/exit codes?

CMail returns 0 on success. Where the remote server rejects mail for any reason, the return code will be the SMTP status code. A 4xx response from the server indicates a temporary failure and it may be appropriate to try resending the message after a short delay. A 5xx response should be considered a fatal error and you should not retry. Configuration or connection errors will result in a value less than 100, and 666 may be returned in the unlikely event of memory allocation failure.

CMail 0.8.9 and later can also output detailed information in JSON format by adding -results:filename.json.

  "subject": "And so it goes.",
  "date": "Date: Tue, 05 Sep 2023 00:48:40 GMT",
  "from": "user@example.com",
  "host": {
    "hostname": "",
    "ip": "",
    "port": 25,
    "protocol": "ESMTP"
  "recipients": [
      "e-mail": "user@example.com",
      "status": "accepted"
  "message-id": "<Cq7EyAMAFRs46OoY@example.com>",
  "status": "success",
  "smtp response": "250 2.0.0 6d3aa300 Message accepted for delivery"

Does CMail support TLS 1.3 (or TLS 1.2)?

Yes. CMail uses the default LibreSSL build options, which include support for TLS 1.3.

How do I include inline images?

CMail includes support for inline attached files. Attach the file using -ai:filename, and use the URL format cid:filename inside your HTML document (specified using -body-html). If the file name contains any characters that are not valid in a URL, it must be URL encoded using lowercase hex digits. If in doubt, use -file or send a test message to determine the Content-ID from the message source. Non-ASCII file names should be avoided due to client incompatibility.

Can I use CMail to send MHTML messages generated by SSRS (SQL Server Reporting Services)?

MTHML is essentially an e-mail message, so you can send these as using CMail’s preconstructed mode. Use -emailfile:filename.mhtml to specify the MHTML document instead of -body and -body-html. You will still need to provide -to and -from values as they are absent from the MHTML.

Why do I see "Invalid awild option 'c'"?

The drive letter is being interpreted as an option for the -awild setting. This setting takes two parameters, the first is used to set various options such as recrusion and case sensitivity, while the second specifies the patterns to match. The solution is to include a second colon, specifying a blank first parameter, i.e. -awild::pattern.

How do I report a bug or request a feature?

See the Contact page. Any custom builds will be from the development branch only and will target amd64 unless x86 is requested.

©2023 Inveigle.net