Technical Notes, Zetafax

HOWTO: Use DDE to automate sending faxes from within Zetafax

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)