Sample code for 30+ languages & platforms
Tcl

Send Signed Email using PFX File (long version)

Demonstrates how to send a signed email using a digital certificate w/ private key stored in a PFX file.

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.

# The mailman object is used for sending and receiving email.
set mailman [new_CkMailMan]

# Set the SMTP server.
CkMailMan_put_SmtpHost $mailman "smtp.mymailserver.com"

# Create a new email object
set email [new_CkEmail]

CkEmail_put_Subject $email "This email is signed"
CkEmail_put_Body $email "This is a digitally signed mail"
CkEmail_put_From $email "Chilkat Admin <admin@chilkatsoft.com>"
set success [CkEmail_AddTo $email "Chilkat Support" "support@chilkatsoft.com"]

# Indicate that the email should be sent signed.
CkEmail_put_SendSigned $email 1

# Load a PFX file into a certificate store object.
# Then locate the certificate matching the  sender's email address,
# and use it for signing.
# (a PFX file may contain more than one certificate.)
set certStore [new_CkCertStore]

# The 1st argument is the path of the PFX file, the 2nd arg is the 
# PFX file's password:
set success [CkCertStore_LoadPfxFile $certStore "/pfx_files/chilkatsoft_secret.pfx" "secret"]
if {$success != 1} then {
    puts [CkCertStore_lastErrorText $certStore]
    delete_CkMailMan $mailman
    delete_CkEmail $email
    delete_CkCertStore $certStore
    exit
}

# Find the certificate for the email address:
set jsonE [new_CkJsonObject]

CkJsonObject_UpdateString $jsonE "email" "admin@chilkatsoft.com"

set cert [new_CkCert]

set success [CkCertStore_FindCert $certStore $jsonE $cert]
if {$success == 0} then {
    puts [CkCertStore_lastErrorText $certStore]
    delete_CkMailMan $mailman
    delete_CkEmail $email
    delete_CkCertStore $certStore
    delete_CkJsonObject $jsonE
    delete_CkCert $cert
    exit
}

# Alternatively, if a PFX file is known to contain a single certificate,
# you may load it directly into a Chilkat certificate object.
# This snippet of source code shows how:
set cert2 [new_CkCert]

# The 1st argument is the filename, the 2nd arg is the 
# PFX file's password:
set success [CkCert_LoadPfxFile $cert2 "/pfx_files/chilkatsoft_secret.pfx" "secret"]
if {$success != 1} then {
    puts [CkCert_lastErrorText $cert2]
    delete_CkMailMan $mailman
    delete_CkEmail $email
    delete_CkCertStore $certStore
    delete_CkJsonObject $jsonE
    delete_CkCert $cert
    delete_CkCert $cert2
    exit
}

# This example will use the cert from the certStore...
set success [CkEmail_SetSigningCert $email $cert]

# Signed email can be sent in two different ways.  
# In a multipart/signed email, the signature is attached as a separate MIME part.
# In an opaque email (signedData) the content of the email is encapsulated within the signature
# and the email is sent as "application/pkcs7-mime". 
# Either should be fine, but some receiving systems might require one or the other..
CkMailMan_put_OpaqueSigning $mailman 0

# Send a signed email.
set success [CkMailMan_SendEmail $mailman $email]
if {$success != 1} then {
    puts [CkMailMan_lastErrorText $mailman]
} else {
    # The LastErrorText property provides information
    # even when successful.
    puts [CkMailMan_lastErrorText $mailman]
    puts "Mail Sent!"
}


delete_CkMailMan $mailman
delete_CkEmail $email
delete_CkCertStore $certStore
delete_CkJsonObject $jsonE
delete_CkCert $cert
delete_CkCert $cert2