PureBasic
PureBasic
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 PureBasic Downloads
IncludeFile "CkCertStore.pb"
IncludeFile "CkCert.pb"
IncludeFile "CkJsonObject.pb"
IncludeFile "CkEmail.pb"
IncludeFile "CkMailMan.pb"
Procedure ChilkatExample()
success.i = 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.
mailman.i = CkMailMan::ckCreate()
If mailman.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
; Set the SMTP server.
CkMailMan::setCkSmtpHost(mailman, "smtp.mymailserver.com")
; Create a new email object
email.i = CkEmail::ckCreate()
If email.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkEmail::setCkSubject(email, "This email is signed")
CkEmail::setCkBody(email, "This is a digitally signed mail")
CkEmail::setCkFrom(email, "Chilkat Admin <admin@chilkatsoft.com>")
success = CkEmail::ckAddTo(email,"Chilkat Support","support@chilkatsoft.com")
; Indicate that the email should be sent signed.
CkEmail::setCkSendSigned(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.)
certStore.i = CkCertStore::ckCreate()
If certStore.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
; The 1st argument is the path of the PFX file, the 2nd arg is the
; PFX file's password:
success = CkCertStore::ckLoadPfxFile(certStore,"/pfx_files/chilkatsoft_secret.pfx","secret")
If success <> 1
Debug CkCertStore::ckLastErrorText(certStore)
CkMailMan::ckDispose(mailman)
CkEmail::ckDispose(email)
CkCertStore::ckDispose(certStore)
ProcedureReturn
EndIf
; Find the certificate for the email address:
jsonE.i = CkJsonObject::ckCreate()
If jsonE.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkJsonObject::ckUpdateString(jsonE,"email","admin@chilkatsoft.com")
cert.i = CkCert::ckCreate()
If cert.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkCertStore::ckFindCert(certStore,jsonE,cert)
If success = 0
Debug CkCertStore::ckLastErrorText(certStore)
CkMailMan::ckDispose(mailman)
CkEmail::ckDispose(email)
CkCertStore::ckDispose(certStore)
CkJsonObject::ckDispose(jsonE)
CkCert::ckDispose(cert)
ProcedureReturn
EndIf
; 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:
cert2.i = CkCert::ckCreate()
If cert2.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
; The 1st argument is the filename, the 2nd arg is the
; PFX file's password:
success = CkCert::ckLoadPfxFile(cert2,"/pfx_files/chilkatsoft_secret.pfx","secret")
If success <> 1
Debug CkCert::ckLastErrorText(cert2)
CkMailMan::ckDispose(mailman)
CkEmail::ckDispose(email)
CkCertStore::ckDispose(certStore)
CkJsonObject::ckDispose(jsonE)
CkCert::ckDispose(cert)
CkCert::ckDispose(cert2)
ProcedureReturn
EndIf
; This example will use the cert from the certStore...
success = CkEmail::ckSetSigningCert(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::setCkOpaqueSigning(mailman, 0)
; Send a signed email.
success = CkMailMan::ckSendEmail(mailman,email)
If success <> 1
Debug CkMailMan::ckLastErrorText(mailman)
Else
; The LastErrorText property provides information
; even when successful.
Debug CkMailMan::ckLastErrorText(mailman)
Debug "Mail Sent!"
EndIf
CkMailMan::ckDispose(mailman)
CkEmail::ckDispose(email)
CkCertStore::ckDispose(certStore)
CkJsonObject::ckDispose(jsonE)
CkCert::ckDispose(cert)
CkCert::ckDispose(cert2)
ProcedureReturn
EndProcedure