none
[MS-OXOMSG] Understand Transport Queue RRS feed

  • Question

  • Hi,

    Unfortunately this isn't a very well formed question. Its mostly that I "don't understand this stuff"....

    I'm trying to understand about how the Transport Folder (as returned by RopGetTransportFolder) is meant to be used. I've gone over MS-OXOMSG, but I'm not sure of how the various ROPs relate to each other.

    It looks like there are are a range of things that can happen when a client wants to send a message. We create the message (using RopCreateMessage), and submit it (using RopSubmitMessage). There are some options to RopSubmitMessage.

    Question 1. What does the PreProcess flag option mean? What does the client assume will happen when this option is set? What is the server required to do?

    I assume that if the NeedsSpooler flag option is set, then the server will store, but not process, the message. The client sends RopSetSpooler to indicate it can take over sending messages that are awaiting client spooling. It then sends RopSpoolerLockMessage, fetches the message, deals with it (e.g. sends it by SMTP or whatever) and then unlocks it using RopSpoolerLockMessage.

    Question 2. Is the spooler queue referred to in MS-OXOMSG Section 3.1.5.3 "Processing a Mail in the Spooler Queue" the same as the transport folder (as returned by RopGetTransportFolder)?

    In E2K7, I see the PR_URL_NAME property for that transport folder set to /NON_IPM_SUBTREE/MDB Transport Queue Folder. I don't see anything like that in E2K10 though.

    Question 3. Is the transport folder (again, as returned by RopGetTransportFolder) a per-user folder?

    Question 4. Is the transport folder considered to be a private folder or public folder? I assume private folder, but I don't see anything about a private non-IPM subtree in MS-OXCSTOR. Any more details on this?

    Question 5. Is RopTransportSend only ever used for messages submitted with NeedsSpooler flag set?

    Brad

     

    Wednesday, May 12, 2010 11:49 AM

Answers

  • Hi Brad,

     

    Thank you for your patience as this response took much longer than anticipated.

     

    The answers to your questions:

    (1) Is RopTransportSend used only for messages with NeedsSpooler set?

     

    Transport send is used to send messages w/out NeedsSpooler as well.  It can be used by both MAPI Spooler and MAPI Transport Provider to submit a message.

     

    (2) Is transport folder a public folder or private folder?

     

    For Exchange 2010 the Transport Queue folder is per mailbox, and private.  The FID is value of property 0x68080003 off mailbox.  For Exchange 2007 and earlier, Transport Queue folder is per MDB, and the FID can only be obtained via result of RopSetTransport.  Transport Queue folder can be on both public or private MDB.  The most accurate method to obtain FID of the Transport Queue folder is via RopSetTransport.  Note, however, that RopSetTransport has a side effect of marking the logon that issued this ROP as a MAPI Transport Provider logon, which affects server behavior for subsequent ROPs issued on this logon.

     

    (3) Are the spooler queue and the transport folder the same?

     

    They are not the same.  The Spooler Queue is a server-side Exchange mechanism.  The Transport Queue folder is specific to Outlook.  The idea is the same - the Transport Queue folder is essentially a client-side Spooler Queue - but you can't assume that what applies to Exchange's Spooler Queue is also true of Outlook's Transport Queue folder.  The most accurate method to obtain FID of the Spooler Queue folder regardless of the server version is to use RopSetSpooler.  Also, this ROP has a side effect of marking the logon that issued this ROP as a MAPI Spooler logon, which affects the behavior of subsequent ROPs issued on this logon.

     

    (4) What are client/server required to do with PreProcess flag?

     

    For server PreProcess flag means that client wants a MAPI Spooler to see the submitted message before the message is processed by server Transport.  Therefore, this flag causes a link to the submitted message to be added to the Spooler Queue search folder.  The message remains in the Spooler Queue until MAPI Spooler instructs the server to remove the message from the Spooler Queue.  The client can use a few ROPs to achieve this: RopAbortSubmit, RopTransportSend, RopSpoolerLockMessage

     

    (5) Is Transport folder a per-user folder?

     

    This depends on the server version.  For Exchange 2007, this folder is per-MDB folder for both public and private MDB.  For Exchange 2010, this folder is per-mailbox on private MDB and it is per-MDB on public MDB.

     

    Regards,

    Mark Miller

    Escalation Engineer

    US-CSS DSC PROTOCOL TEAM

    Wednesday, July 7, 2010 6:47 PM

All replies

  • Hi Brad,

    Thank you for your questions.  I will investigate the answers and respond asap.

    Regards,

    Mark Miller

    Escalation Engineer

    US-CSS DSC PROTOCOL TEAM

     

    Wednesday, May 12, 2010 1:00 PM
  • Mark,

    How is this going? I'm happy to take partial answers on this.

    Brad

     

    Sunday, May 23, 2010 11:07 PM
  • Hi Brad,

     

    I am still investigating the answers to your questions.  I want to be certain before I post any partial answers to your questions and am close to confirming.  I will respond asap with the answers to all of your questions.

     

    Regards,

    Mark Miller

    Escalation Engineer

    US-CSS DSC PROTOCOL TEAM

    Tuesday, May 25, 2010 2:03 PM
  • Hi Mark,

    Also I have a problem that may be correlative with this.

    I use RopSubmitMessage to send a message and usually it does work, but sometimes the sender received the "Delivery Status Notification (Delay)" message and NDR after two days. At the same time, I use Outlook to send the message and it always works. 

    So, my question is, what on earth is the difference between the RopSubmitMessage and RopTransportSend? Should I use RopTransportSend queue to resolve the above problem?

    Thanks in advance.

    vic

    Thursday, June 10, 2010 5:41 AM
  • Hi Vic,

     

    Just a quick acknowledgement of your post.  Mark will be following up as soon as he investigates this further.

     

     


    Bryan S. Burgin Senior Escalation Engineer Microsoft Protocol Open Specifications Team
    Thursday, June 10, 2010 5:58 PM
    Moderator
  • How is this question going? I'd really like to get started on implementing this stuff in the next couple of weeks. Is that likely to work?

    Brad

    Tuesday, July 6, 2010 11:46 AM
  • Hi Brad,

     

    Thank you for your patience as this response took much longer than anticipated.

     

    The answers to your questions:

    (1) Is RopTransportSend used only for messages with NeedsSpooler set?

     

    Transport send is used to send messages w/out NeedsSpooler as well.  It can be used by both MAPI Spooler and MAPI Transport Provider to submit a message.

     

    (2) Is transport folder a public folder or private folder?

     

    For Exchange 2010 the Transport Queue folder is per mailbox, and private.  The FID is value of property 0x68080003 off mailbox.  For Exchange 2007 and earlier, Transport Queue folder is per MDB, and the FID can only be obtained via result of RopSetTransport.  Transport Queue folder can be on both public or private MDB.  The most accurate method to obtain FID of the Transport Queue folder is via RopSetTransport.  Note, however, that RopSetTransport has a side effect of marking the logon that issued this ROP as a MAPI Transport Provider logon, which affects server behavior for subsequent ROPs issued on this logon.

     

    (3) Are the spooler queue and the transport folder the same?

     

    They are not the same.  The Spooler Queue is a server-side Exchange mechanism.  The Transport Queue folder is specific to Outlook.  The idea is the same - the Transport Queue folder is essentially a client-side Spooler Queue - but you can't assume that what applies to Exchange's Spooler Queue is also true of Outlook's Transport Queue folder.  The most accurate method to obtain FID of the Spooler Queue folder regardless of the server version is to use RopSetSpooler.  Also, this ROP has a side effect of marking the logon that issued this ROP as a MAPI Spooler logon, which affects the behavior of subsequent ROPs issued on this logon.

     

    (4) What are client/server required to do with PreProcess flag?

     

    For server PreProcess flag means that client wants a MAPI Spooler to see the submitted message before the message is processed by server Transport.  Therefore, this flag causes a link to the submitted message to be added to the Spooler Queue search folder.  The message remains in the Spooler Queue until MAPI Spooler instructs the server to remove the message from the Spooler Queue.  The client can use a few ROPs to achieve this: RopAbortSubmit, RopTransportSend, RopSpoolerLockMessage

     

    (5) Is Transport folder a per-user folder?

     

    This depends on the server version.  For Exchange 2007, this folder is per-MDB folder for both public and private MDB.  For Exchange 2010, this folder is per-mailbox on private MDB and it is per-MDB on public MDB.

     

    Regards,

    Mark Miller

    Escalation Engineer

    US-CSS DSC PROTOCOL TEAM

    Wednesday, July 7, 2010 6:47 PM
  • Hi Vic,

     

    Maybe this will help resolve your issue and answer your question.

     

    There is very little difference between RobSubmitMessage and RobTransportSend.  RopSubmitMessage can be used by any logon to submit a message, and can also instruct store that some spooler processing is due.  RopTransportSend is used by MAPI Spooler and MAPI Transport Provider logons to submit a message that does not require any spooler processing.

     

    Another difference is how server side failures are handled for these ROPs.  If RopSubmitMessage fails, an error is returned to the caller.  If RopTransportSend fails, then an Non-Delivery Report message is sent to the mailbox, and the error is then converted to success.  Note that this is the behavior for Exchange Server 2003 and later.

     

    Regards,

    Mark Miller

    Escalation Engineer

    US-CSS DSC PROTOCOL TEAM

    Thursday, July 8, 2010 5:04 AM
  • Mark,

    I think that basically answers my original questions. I'll start coding, and ask any follow-up questions in new threads.

    Thanks once again.

    Brad

    Friday, July 9, 2010 2:43 AM