MAILQ(1zm)                                                          MAILQ(1zm)

       mailq - zmailer mail queue printer

       mailq [-4|-6]  [-d]  [-i]  [-M]  [-p port_or_socket_path]  [-s[s]] [-t]
             [-u user]  [-U username/password]  [-v[v]]   [-S]   [-Q[Q[Q[Q]]]]
             [-Z zenvfile]]] [[-c channel] -h host] [host]

       FIXME: Not all options are documented!

       The  mailq(1zm) queries a running scheduler(8zm) process on a specified
       host for its current internal model of the mail  transport  queues  and
       presents  this information to the user.  By default, the scheduler(8zm)
       process queried is the one relevant to the local host,  i.e.  either  a
       local  process  or  a  scheduler(8zm)  on  a  mail server host.  If the
       optional host argument is specified, the scheduler(8zm) running on that
       host will be queried instead.

       If  the  scheduler(8zm) has used -Q option to shrink the amount of out-
       put, the mailq(1zm) must also use -Q option to report about  the  queue
       status at the server in ``queue-summary'' format.

       The information printed for each queued message is labelled by its mes-
       sage file id, which is the name of the original  message  file  in  the
       POSTOFFICE/queue  directory  and  of  the  message  control file in the
       POSTOFFICE/transport directory.  The information may be  different  for
       different  channel/host combinations in destination addresses in a sin-
       gle message, so the status information is grouped in clusters  labelled
       by the channel and host for addresses in the group.

       The text associated with a particular deferred destination in a message
       originates in a transport agent.  The scheduler annotates the transport
       agent  messages  with retry information when an address has been sched-
       uled for later delivery attempts, or with text stating why a retry that
       should  have  happened  was delayed.  A lack of annotations indicates a
       delivery attempt is in progress.

       The normal action is to print the transport queue.

       -c channel -h host
              in MAILQv2 mode (see scheduler(8zm)) query  details  about  only
              those messages destined at given channel and host.

              The default for channel is "smtp".

       -d     This  prints  the information received from the scheduler as is.
              This will override the verbose option.  This is debugging  mode.

              prints  a  verbose  transport queue output (see the -v flag) for
              your own messages only.

              Attached to an MTA instance  wide  shared  memory  segment,  and
              dumpts its content (various counters and gauges).

              This works only local in the system, unlike MAILQ-v2 queries!

              Listed variables are described at: mailq-m(5zm).

       -p port
              specifies  an  alternate  TCP/IP  port  to  connect  to a sched-
              uler(8zm) at.

              Shows full thread-wise status of scheduler's internal state.

              Produces abbreviated summary of scheduler's internal state.

              Shows only scheduler's summary statistics lines.

              Shows same dump as "mailq -M" produces, but can do it  over  the

              Listed variables are described at: mailq-m(5zm).

              asks for a status of the router(8zm), scheduler(8zm), and trans-
              port queues.

              The first two are determined by scanning the appropriate  direc-
              tories  and  counting files, whereas the status of the transport
              queue is retrieved from the running scheduler(8zm) process.

              Doubling this option will cause mailq(1zm) to exit after  print-
              ing this summary.

       -S     shows  summary  of  files  queued  to  the  channel/destination.
              Listed info tells the number of files, and  if  available,  also
              total- and mean-size of those files.

       -t     disables  any previous verbose flags to produce the normal terse

       -u user
              selects messages sent by the specified user id.

              This option is usually only useful to the Postmaster on the sys-

       -U username/password
              Defines  username/password pair for MAILQ-V2 mode connection, in
              case the default "nobody"/"nobody" is not proper.

              Do note: The "/" separates fields!

              will produce verbose transport  queue  output  in  that  message
              id's,  and  sender  and  recipient  addresses, will be listed in
              addition to the normal status line.

              Doubling this option asks for extra  verbose  output,  presently
              this  adds the message size in bytes after the message id.  This
              option is only useful if mailq  can  read  the  message  control
              files  in  the postoffice.  Most users can only see the data for
              their own messages.

       -Z zenvfile
              :RS passes on explicite non-compiled-in-default located  ZCONFIG
              environment file.

mailq -Q output codes
       Examples of ``mailq -Q'' output:

          smtp/  R=1 A=147 P={19598} HA={571}s FA={571}s OF=1 S={STUFF} UF=0 QA=1d18h
          smtp/ R=1 A=58 W=1860s QA=11h11m28s
             Threads: 11 Msgs: 36 Procs: 23 Idle: 12 Plim:90 Flim: 150 Tlim: 1
       Kids: 414 Idle: 324 Msgs: 754 Thrds: 129 Rcpnts: 943 Uptime: 1d31m22s
       Msgs in 5384 out 4630 stored 754 Rcpnts in 441890 out 440917 stored 971

       The codes mean following:

       R=     Number  of messages on this  ``channel/host''  thread; this does
              not count individual target users separately!   (e.g.  if  there
              are  a  dozen  recipients  at some message, but they are at same
              host, they are counted as one.)

       A=     Count of Attempts to do delivery at this thread.

       P=     Process number(s) of the transport agent actively handling  this
              thread.   There  can  be multiple processes, and they are listed
              comma-separated inside the curly brackets.   Similarly  for  the
              rest of the things below.

       W=     Delay  time  until next time the transport-agent may try to send
              this thread.  (Wait)

       HA=    ``#HungerAge(s)'' -- time since the scheduler saw  last  ``#hun-
              gry'' message from the transport agent.

       FA=    ``Feed  Age(s)''  -- time since the scheduler did last time feed
              something to the transport agent(s).

       OF=    ``OverFeed count'' -- how many unacknowledged tasks are still in
              the  transport  agent(s)  for this thread.  The ``OverFeed'' was
              created to handle sluggish scheduler in hard pressed  system  to
              get  jobs  scheduled  around,  when the transport agents were in
              practice running dry as they did their jobs fast, but the sched-
              uler  didn't  get  around  to feed them...  Thus the way for the
              scheduler to ``overfeed'' as many of the jobs in  active  thread
              to  the  transport agent as possible, and then just wait them to
              complete, and be acknowledged.  With this a lot more  gets  done
              even with a sluggish scheduler.

       S=     Feed-State  of TA-process(es) doing actual job.  The scheme goes
              like following:

              LARVA  (This is very fast transient state.)   TA  processes  are
                     created at this state, and they stay there only until the
                     first ``#hungry'' message is heard, then one job  if  fed
                     there, and state is changed to ``STUFFing.''  (One job so
                     that if it fails, TA process kicks to other thread.)

                     This is normal lifetime state of a TA process.  When pro-
                     cess' UF= count goes to zero, more jobs are fed to it.  A
                     process moves away from this state by either:

                     Getting a #retryat message
                             Next state is FINISHing.

                     Running out of jobs to feed
                             Next state is FINISHing -- this requires that  no
                             messages  were available for feeding at the time.
                             If even single one is fed, state stays in  STUFF-

                     This  waits  for the OF= count to go to zero, and then it
                     tries to pick a new thread for the process to work on (if
                     available), or if none can be found, moves the process to
                     IDLE state.  If a new thread  is  found  for  processing,
                     process moves there, and goes to STUFFing state.

              IDLE   (This  is  very fast transient state.)  The TA process is
                     being idled, next  state  for  the  process  will  be  in
                     thread-group idle-pool.

       UF=    How  many  messages out of all present in the queue have not yet
              been fed to the current TA process set ?  ("UnFed count")

       QA=    Age of oldest message in the queue at this thread.  ("QueueAge")

       /opt/mail/zmailer.conf            (ZCONFIG)
       /var/spool/postoffice/transport   (POSTOFFICE/transport)
       /var/spool/postoffice/queue       (POSTOFFICE/queue)

       The MAILQ-V2 protocol is described at the scheduler(8zm) manual page.

       mailq-m(5zm),      zmailer(1zm),      router(8zm),      scheduler(8zm),
       ZMailer::mailq(3pm), zmailer.conf(5zm).

       This program authored and copyright by:
          Rayan Zachariassen <no address>
       Partial rewrite for ZMailer 2.99/3.0 by:
          Matti Aarnio <>

                                  2003-Aug-28                       MAILQ(1zm)