Sample code for 30+ languages & platforms
Tcl

Send DKIM Signed Email

See more DKIM / DomainKey Examples

Demonstrates how to send DKIM signed email.

Chilkat Tcl Downloads

Tcl

load ./chilkat.dll

set success 0

# This example requires the Chilkat API to have been previously unlocked.
# See Global Unlock Sample for sample code.

set mailman [new_CkMailMan]

set dkim [new_CkDkim]

# SMTP server settings...
CkMailMan_put_SmtpHost $mailman "SMTP_DOMAIN"
CkMailMan_put_SmtpUsername $mailman "SMTP_LOGIN"
CkMailMan_put_SmtpPassword $mailman "SMTP_PASSWORD"
CkMailMan_put_SmtpPort $mailman 465
CkMailMan_put_SmtpSsl $mailman 1

set email [new_CkEmail]

CkEmail_put_Subject $email "This is a test"
CkEmail_put_Body $email "This is a test"
CkEmail_put_From $email "Chilkat Support <support@chilkatsoft.com>"

# Add some recipients (BCC recipients are added below)
CkEmail_AddTo $email "Chilkat Software" "chilkat_software@yahoo.com"
CkEmail_AddTo $email "Chilkat Admin" "admin@chilkatsoft.com"
CkEmail_AddCC $email "Chilkat Admin" "admin@chilkat.io"

# When sending an email with a DKIM signature, the MIME
# of the email must not be modified prior to
# or during the sending process.  Therefore, the MIME of the
# email is assembled, the DKIM signature is added, and then
# SendMimeBd is called to send the email.

# First get the MIME of the email.  Calling RenderToMimeBd 
# causes the email to be signed and/or encrypted if those options
# have been selected.  The MIME returned by RenderToMimeBd
# is the exact MIME that would've been sent if SendEmail was
# called.  We'll add a DKIM signature header to this MIME and then send...
set bdMime [new_CkBinData]

set success [CkMailMan_RenderToMimeBd $mailman $email $bdMime]
if {$success == 0} then {
    puts [CkMailMan_lastErrorText $mailman]
    delete_CkMailMan $mailman
    delete_CkDkim $dkim
    delete_CkEmail $email
    delete_CkBinData $bdMime
    exit
}

# To create a DKIM signature,
# you'll need to provide the following:
# (1) An RSA private key in any common file format.
# (2) The domain name (typically the same domain
# as the sender of an email).
# (3) A selector for the domain name -- an arbitrary string
# to identify the matching public key in DNS.

# To allow an email recipient to verify the DKIM signature via an
# external email client supporting DKIM or using other software,
# you will need to create a DNS record with the selector
# and matching public key.  This example does not provide
# information about DKIM DNS record creation.  
# (Chilkat does not provide an API for creating DNS records.  
# Creating the DKIM DNS record is something you would do
# manually.)

# Set the domain and selector:
# You'll need to provide your own values here..
CkDkim_put_DkimDomain $dkim "chilkatsoft.com"
CkDkim_put_DkimSelector $dkim "brisbane"

# Load a private key from any common RSA private key
# format, such as DER, PKCS8, PEM, XML, etc.
# The LoadDkimPkFile method automatically detects
# the file format and reads it appropriately.
# If a password is not required, you'll still need to provide
# an empty password string argument, but it is ignored.
set password "passwd"
set privKey [new_CkPrivateKey]

set success [CkPrivateKey_LoadAnyFormatFile $privKey "qa_data/pem/rsa_passwd.pem" $password]
if {$success == 0} then {
    puts [CkPrivateKey_lastErrorText $privKey]
    delete_CkMailMan $mailman
    delete_CkDkim $dkim
    delete_CkEmail $email
    delete_CkBinData $bdMime
    delete_CkPrivateKey $privKey
    exit
}

set success [CkDkim_SetDkimPrivateKey $dkim $privKey]
if {$success == 0} then {
    puts [CkDkim_lastErrorText $dkim]
    delete_CkMailMan $mailman
    delete_CkDkim $dkim
    delete_CkEmail $email
    delete_CkBinData $bdMime
    delete_CkPrivateKey $privKey
    exit
}

# Add the DKIM-Signature header to the MIME in bdMime
set success [CkDkim_DkimSign $dkim $bdMime]
if {$success == 0} then {
    puts [CkDkim_lastErrorText $dkim]
    delete_CkMailMan $mailman
    delete_CkDkim $dkim
    delete_CkEmail $email
    delete_CkBinData $bdMime
    delete_CkPrivateKey $privKey
    exit
}

# If desired, examine the MIME of the email being sent.
CkBinData_WriteFile $bdMime "qa_output/dkimSigned.eml"

# ---- Prepare to send the email contained in bdMime ---

# To send to multiple email addresses, the strRecipients should be set to a comma-separated
# list of email addresses.

# Note: This is where we can add additional BCC addreses.
# Here we are adding "chilkat.support@gmail.com" as an additional BCC address.
# Notice that the 1st three email addresses are NOT BCC because these email addresses
# appear in the MIME header of the email (in the "To" and "CC" header fields).
# A BCC email address does not appear in the MIME, and thus the non-BCC recipients cannot see
# that the email was also sent to the BCC address.  (BCC means "blind carbon copy")
set strRecipients "chilkat_software@yahoo.com, admin@chilkatsoft.com, admin@chilkat.io, chilkat.support@gmail.com"
set strFrom "support@chilkatsoft.com"

set success [CkMailMan_SendMimeBd $mailman $strFrom $strRecipients $bdMime]
if {$success == 0} then {
    puts [CkMailMan_lastErrorText $mailman]
    delete_CkMailMan $mailman
    delete_CkDkim $dkim
    delete_CkEmail $email
    delete_CkBinData $bdMime
    delete_CkPrivateKey $privKey
    exit
}

set success [CkMailMan_CloseSmtpConnection $mailman]
if {$success != 1} then {
    puts "Connection to SMTP server not closed cleanly."
}

puts "DKIM Signed Mail Sent!"

delete_CkMailMan $mailman
delete_CkDkim $dkim
delete_CkEmail $email
delete_CkBinData $bdMime
delete_CkPrivateKey $privKey