HOWTO: Use DDE to automate sending faxes from within Zetafax
Print
ZTN1315
ID: ZTN1315
This Zetafax technical note applies to:
- Zetafax 8.0.0.104 and later
Summary
This document will tell you how to send faxes with the Zetafax client using DDE. This document assumes that you have familiarity with programming and access to documentation explaining how DDE works in your chosen environment. This document will:
- Explain when you should use DDE to automate Zetafax
- Explain the initialisation, commands and parameters you can use.
- Provide two pseudo-code functions for sending a fax with DDE; one for sending a single fax, and one for sending a multi-part fax to a single recipient.
- Provide the VBA code for two Microsoft Word macros, one sending a multipart fax and one sending a single fax.
When Should You Use DDE?
When you print a fax to the Zetafax Printer the Zetafax client usually pops up a dialog box so that you can address the fax. Using DDE you can address the fax programmatically so the client doesn't need to prompt for user input.
You could use DDE to send faxes if:
- The client is likely to be running
- The user is likely to be at the machine when DDE runs
- You do not have an API licence
You should NOT use DDE to send faxes if:
- You need to track the fax's status after it has been sent
- Your code needs to run completely unattended (e.g. on a server)
- You need to send over 200 faxes at once
In all these situations you would need to use the Zetafax API.
DDE Initialisation, Commands and Parameters
DDEInitialize Parameters
When you initialise a DDE session you need to know the application name and the DDE topic. The application name is "Zetafax" and the topic is "Addressing". So to initialise the DDE session you would call:
chan = DDEInitialize "Zetafax", "Addressing"
Note: This call will only succeed if the Zetafax client has started.
DDEExecute Parameters
You use DDEExecute to send commands to the client. Commands should be placed in square brackets. You can send multiple commands with a single call to DDEExecute. So to send a fax then release the client from DDE control at the same time you would write the following:
DDEExecute chan, "[Send][DDERelease]"
This table lists the commands that can be sent to the Zetafax client.
Name |
Purpose |
DDEControl |
Puts the client under control of DDE |
DDERelease |
Releases the client from control of DDE |
Preview |
Sends a fax for preview |
Send |
Sends a fax |
MultiPart |
Appends the current spool file to a multi-part fax |
MultiSend |
Sends a multipart fax |
The first thing you should do once the DDE session has started is execute a "DDEControl" command. The last thing you should do before you terminate the DDE session is execute a "DDERelease" command. Between these two commands the client is under the control of DDE, and will not respond properly to user input.
DDEPoke Parameters
This table lists all the settings that can be poked into the client before a fax is sent. Each of these settings can also be used in embedded addressing.
Name |
API Only? |
Purpose |
Notes |
To |
No |
Addressing in one call |
"Number, Name, Company" |
Name |
No |
Name of Addressee |
Organisation or Organization |
No |
Organisation of Addressee |
Fax |
No |
Fax number of Addressee |
From |
Yes |
Sets the "From" name of the fax |
Coversheet |
Yes |
Sets the coversheet used by the fax |
Letterhead |
Yes |
Sets the letterhead used by the fax |
Quality or Resolution |
Yes |
Sets the quality of the fax |
"Draft", "Normal", or "High" |
Priority |
Yes |
Sets the priority of the fax |
"Background", "Normal", or "Urgent" |
Time or After |
Yes |
Sets the send time |
"Offpeak", "yy-mm-dd HH:mm:ss", or "HH:mm:ss" |
Header |
Yes |
Controls what fields appear on header |
Concatenation of "No", "To", "Fr", "Dt", "Ti" |
Attachment |
Yes |
Adds a public/private attachment |
Charge |
Yes |
Sets the charge code |
Will display dialog if Charge Code not recognised |
Subject |
Yes |
Sets the subject of fax |
Note |
Yes |
Sets the note on the coversheet |
Delete |
Yes |
Deletes the message after sending |
"Yes", "OK", or "No" |
Pseudo-code Functions
Note: Writing in green are comments
Single part fax
'Sending a single part faxes
DDEInitialize 'Zetafax', 'Addressing'
DDEExecute '[DDEControl]'
While Faxes left to send
Print to Zetafax Printer
Wait for print job to finish
If we want to poke the entire address in one go
DDEPoke 'To', 'Andrew, Equisys, 020 7203 4005'
Else
DDEPoke 'Name', 'Andrew'
DDEPoke 'Organisation', 'Equisys'
DDEPoke 'Fax', '020 7203 4005'
End If
DDEPoke 'Priority', 'Urgent'
'Poke all other settings as required'
If we want to preview fax
DDEExecute '[Preview]'
Else If we want to send the fax
DDEExecute '[Send]'
End If
End While
DDEExecute '[DDERelease]'
DDETerminate
Multiple part fax
'Sending a multi-part fax to a single addressee'
DDEInitialize 'Zetafax', 'Addressing'
DDEExecute '[DDEControl]'
Loop
Print to Zetafax Printer
Wait for print job to finish
If No more printing to do
Exit Loop
End If
DDEExecute '[MultiPart]'
End Loop
DDEPoke 'To', '"Andrew", "Equisys", "020 7203 4005"'
'Poke all other settings as required'
'Multiple DDEExecute calls can be combined'
DDEExecute '[MultiSend][DDERelease]'
DDETerminate
Sample VBA Word Macros
Single part fax
' SendMultiFax fax macro
' Macro created 11 June 2004 by Equisys plc.
'
Public Sub SendMultiFax()
Dim chan
chan = DDEInitiate(" Zetafax" , " Addressing" )
DDEExecute chan, " [DDEControl]"
ActivePrinter = " Zetafax Printer"
' Print the document three times and use it as a multipart fax
For i = 1 To 3
Application.PrintOut FileName:=" " , Range:=wdPrintAllDocument, _
Item:=wdPrintDocumentContent, Copies:=1, Pages:=" " , _
PageType:=wdPrintAllPages, Collate:=True, Background:=False, _
PrintToFile:=False
Call Wait 'waits for print file to be created
If i < > 3 Then
DDEExecute chan, " [MultiPart]"
End If
Next
DDEPoke chan, " To" , " +44 020 7203 4005, Sam Smith, Equisys PLC"
DDEExecute chan, " [MultiSend][DDERelease]"
DDETerminate chan
End Sub
Multiple part fax
'
' SendSingleFax Macro
' Macro created 11 June 2004 by Equisys plc.
'
Public Sub SendSingleFax()
Dim chan, Address, Contact
' Set up DDE control of Zetafax
chan = DDEInitiate(App:=" Zetafax" , Topic:=" Addressing" )
DDEExecute Channel:=chan, Command:=" [DDEControl]"
' Set Zetafax to the default printer and print the document
ActivePrinter = " Zetafax Printer"
' FilePrint
Application.PrintOut FileName:=" " , Range:=wdPrintAllDocument,
Item:= wdPrintDocumentContent, Copies:=1, Pages:=" " , _
PageType:=wdPrintAllPages, Collate:=True, Background:=False, _
PrintToFile:=False
Call Wait 'waits for print file to be created
' Address for the Fax taken from an array of data.
Contact = Array(" +44 20 7203 4005" , " Brian Bull" , " Equisys plc" )
' Add data for the address
Address = Contact(0) & " , " & Contact(1) & " , " & Contact(2)
' Format data to Address
' Set the addressing options
DDEPoke Channel:=chan, Item:=" TO" , Data:=Address ' Address the fax
' Submit the fax and release DDE control
DDEExecute Channel:=chan, Command:=" [Send][DDERelease]"
DDETerminate Channel:=chan
End Sub
Wait routine for all types of fax
Private Sub Wait()
On Error GoTo oops
Dim pauseDuration As Single
Dim fileSize As Long
Dim strSpoolfile As String
Dim tmStart As Double
' This line finds the spool path for the Zetafax printers. Do not Change this line.
strSpoolfile = System.PrivateProfileString(" " , " HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers\Zetafax Printer" , " port" )
Do
DoEvents
fileSize = FileLen(strSpoolfile) ' Returns file length (bytes).
Loop While fileSize = 0
' If you are printing direct to the printer you do not need this pause
' and can remove the next five lines.
pauseDuration = 2 ' Set duration.
tmStart = Timer ' Set start time.
Do While Timer < tmStart + pauseDuration
DoEvents ' Yield to other processes.
Loop
Exit Sub
oops:
If Err.Number = 53 Then
' eat " file not found" errors
Resume Next
End If
MsgBox Err.Description
End Sub
Common Problems
This section lists commonly encountered problems and their solutions
- The most common problem is the client trying to send the fax before it has been prepared. This happens when you have forgotten to implement a "Wait" function to wait for the print job to finish
- If you are trying to send a large number of faxes you should stay within the guidelines offered in the "When to use DDE" section above. If you want to increase the number of faxes you can send you can try printing directly to the printer
- If more than 10 seconds elapse between the DDEControl command and the DDESend command the client may time the request out.
References
Zetafax technical notes:
ZTN1032 HOWTO: Using DDE - similar to this document but for versions prior to 9.
ZTN1057 INFO: Enabling Zetafax client DDE logging - this document tells you how to enable DDE logging within the Zetafax client. This is useful when you wish to track bugs.
Last Updated: 15 December 2005 (MS)
First Published: 11 June 2004 (AG/EB)