Chilkat Examples

ChilkatHOMEAndroid™AutoItCC#C++Chilkat2-PythonCkPythonClassic ASPDataFlexDelphi DLLGoJavaNode.jsObjective-CPHP ExtensionPerlPowerBuilderPowerShellPureBasicRubySQL ServerSwiftTclUnicode CUnicode C++VB.NETVBScriptVisual Basic 6.0Visual FoxProXojo Plugin

Visual FoxPro Examples
Web API Categories

ASN.1
AWS KMS
AWS Misc
Amazon EC2
Amazon Glacier
Amazon S3
Amazon S3 (new)
Amazon SES
Amazon SNS
Amazon SQS
Async
Azure Cloud Storage
Azure Key Vault
Azure Service Bus
Azure Table Service
Base64
Box
CAdES
CSR
CSV
Cert Store
Certificates
Cloud Signature CSC
Code Signing
Compression
DKIM / DomainKey
DNS
DSA
Diffie-Hellman
Digital Signatures
Dropbox
Dynamics CRM
EBICS
ECC
Ed25519
Email Object
Encryption
FTP
FileAccess
Firebase
GMail REST API
GMail SMTP/IMAP/POP
Geolocation
Google APIs
Google Calendar
Google Cloud SQL
Google Cloud Storage
Google Drive
Google Photos
Google Sheets
Google Tasks
Gzip
HTML-to-XML/Text
HTTP
HTTP Misc
IMAP
JSON
JSON Web Encryption (JWE)
JSON Web Signatures (JWS)
JSON Web Token (JWT)
Java KeyStore (JKS)
MHT / HTML Email
MIME
Microsoft Graph
Misc
NTLM
OAuth1
OAuth2
OIDC
Office365
OneDrive
OpenSSL
Outlook
Outlook Calendar
Outlook Contact
PDF Signatures
PEM
PFX/P12
PKCS11
POP3
PRNG
REST
REST Misc
RSA
SCP
SCard
SFTP
SMTP
SSH
SSH Key
SSH Tunnel
ScMinidriver
Secrets
SharePoint
SharePoint Online
Signing in the Cloud
Socket/SSL/TLS
Spider
Stream
Tar Archive
ULID/UUID
Upload
WebSocket
X
XAdES
XML
XML Digital Signatures
XMP
Zip
curl
uncategorized

 

 

 

(Visual FoxPro) Send Email without Mail Server

How to send an email without a mail server (so-to-speak).

Note: This example requires Chilkat v11.0.0 or greater.

Chilkat ActiveX Downloads

ActiveX for 32-bit and 64-bit Windows

LOCAL lnSuccess
LOCAL loMailman
LOCAL lcRecipientEmailAddr
LOCAL loDns
LOCAL loJson
LOCAL lcSmtpHostname
LOCAL loEmail

lnSuccess = 0

* Sending Email: Do You Really Need an SMTP Server?
* 
* A common question developers ask is: "Can my application send email without connecting to a mail server?"
* 
* The short answer is: No, not really. Every email sent over the internet must be handed to a Simple Mail Transfer Protocol (SMTP) server.
* 
* What people usually mean is: "My application doesn't have credentials for a dedicated SMTP server. 
* Can it send an email directly to the recipient's server without me needing to configure one?"
* 
* The answer to that question is: "Yes, it's technically possible, but it's an outdated and highly unreliable method that will likely fail in the real world." 
* Let's explore how it works and, more importantly, why you shouldn't use it.
* 
* How "Serverless" Email Sending Works
* 
* Components and libraries that claim to send email without a configured server perform a clever trick behind the scenes:
* 
*     DNS MX Lookup: They take the recipient's email address (e.g., recipient@example.com) and perform a special DNS query to find the Mail Exchange (MX) records for the example.com domain.
* 
*     Direct Connection: This MX record provides the hostname of the SMTP server responsible for handling email for that domain (e.g., mx.example.com).
* 
*     Delivery Attempt: The library then connects directly to that server on the standard SMTP port (25) and attempts to deliver the email.
* 
* You're still connecting to an SMTP server�just the recipient's, not your own.
* Why This Method Fails in Modern Applications
* 
* While this process seems straightforward, it is almost guaranteed to fail for two critical reasons. These aren't minor "gotchas"; they are fundamental roadblocks in today's internet infrastructure.
* 
* Problem #1: Most Networks Block Port 25
* 
* To combat spam, nearly all residential Internet Service Providers (ISPs) like Comcast and Spectrum, corporate firewalls, and cloud providers (AWS, Azure, Google Cloud) 
* block outgoing connections on port 25 to any server except their own.
* 
* If your application is running on a user's home computer or within a typical corporate or cloud network, its attempt to connect to a random recipient's mail server 
* will be blocked before it even starts. The connection will simply time out.
* 
* Problem #2: You Have No IP Reputation
* 
* Email servers are built on trust. They will not accept mail from unknown, untrusted sources.
* 
* When your application connects directly from its IP address (especially a dynamic IP from a residential ISP), the recipient's server will see it as a suspicious, 
* unauthenticated connection. It will likely be rejected for several reasons:
* 
*     No Authentication: You are not logging in to prove who you are.
* 
*     Poor IP Reputation: The IP address has no history of sending legitimate mail.
* 
*     Blacklists (DNSBLs): The IP is likely on a DNS Blackhole List (DNSBL) that flags dynamic IPs as sources of spam.
* 
* You will receive an error message from the server, like this common example:
* 
* 553-Your message was rejected because it appears to be spam.
* 553-The IP address [your.ip.address.here] is listed on the SORBS DUHL blacklist.
* 553 To request removal, see http://www.sorbs.net/
* The Modern, Reliable Solution: Use an Authenticated Relay
* 
* Instead of trying to deliver mail directly, the correct and reliable method is to relay your email through a server that you can 
* authenticate with. This solves all the problems mentioned above.
* 
* There are two primary ways to do this:
* 
*     Authenticated SMTP Relay (The Standard)
* 
* You configure your application to connect to a dedicated mail server that knows and trusts you.
* 
*     How it Works: You connect using a specific port designed for authenticated sending (port 587 or 465), which is not blocked by firewalls. 
*     You then provide a username and password (or API key) to authenticate.
* 
*     Why it Works: You are now a trusted user on a server that has a high IP reputation. That server handles the final delivery to the recipient, who will trust mail coming from it.
* 
*     Examples: Your ISP's mail server (e.g., smtp.comcast.net), your web host's server, or your company's Microsoft 365 or Google Workspace mail server.
* 
*     Transactional Email API Services (The Professional Standard)
* 
* For applications, the best practice is to use a dedicated email delivery service.
* 
*     How it Works: Instead of dealing with SMTP directly, you use a simple API (like a REST API) to send your email. 
*     The service handles all the complexities of delivery, reputation, and compliance.
* 
*     Why it's Better: These services are built for high-volume, reliable delivery. They provide detailed analytics (opens, clicks, bounces), 
*     manage IP reputation across entire server farms, and ensure your mail doesn't land in the spam folder.
* 
*     Examples: SendGrid, Mailgun, Postmark, and Amazon SES.
* 
* Conclusion
* 
* While the idea of sending email without a configured server is tempting, the direct-to-MX method is an obsolete technique that is fundamentally incompatible 
* with the security and anti-spam measures of the modern internet.
* 
* For reliable email delivery, always use an authenticated SMTP relay or a dedicated transactional email API service.

* ----------------------------------------------------------
* The following code is NOT recommended as explained above:
* ----------------------------------------------------------

* The mailman object is used for sending and receiving email.
loMailman = CreateObject('Chilkat.MailMan')

lcRecipientEmailAddr = "joe@example.com"

* Do a DNS MX lookup for the recipient's mail server.
loDns = CreateObject('Chilkat.Dns')
loJson = CreateObject('Chilkat.JsonObject')

* This gets all MX domains for an email address.  (Typically one domain.)
* The preferred domain will be at index 0 (see below).
lnSuccess = loDns.Query("MX",lcRecipientEmailAddr,loJson)
IF (lnSuccess = 0) THEN
    ? loDns.LastErrorText
    RELEASE loMailman
    RELEASE loDns
    RELEASE loJson
    CANCEL
ENDIF

lcSmtpHostname = loJson.StringOf("answer.mx[0].domain")
? lcSmtpHostname

* Set the SMTP server.
loMailman.SmtpHost = lcSmtpHostname

* Create a new email object
loEmail = CreateObject('Chilkat.Email')

loEmail.Subject = "This is a test"
loEmail.Body = "This is a test"
loEmail.From = "My Name <myname@mydomain.com>"
loEmail.AddTo("",lcRecipientEmailAddr)

lnSuccess = loMailman.SendEmail(loEmail)
IF (lnSuccess = 0) THEN
    ? loMailman.LastErrorText
    RELEASE loMailman
    RELEASE loDns
    RELEASE loJson
    RELEASE loEmail
    CANCEL
ENDIF

RELEASE loMailman
RELEASE loDns
RELEASE loJson
RELEASE loEmail


 

© 2000-2025 Chilkat Software, Inc. All Rights Reserved.