windows-nt/Source/XPSP1/NT/inetsrv/msmq/sdk/samples/replyall/replyall.frm
2020-09-26 16:20:57 +08:00

352 lines
11 KiB
Plaintext

VERSION 5.00
Begin VB.Form Main
Caption = "ReplyAll"
ClientHeight = 5325
ClientLeft = 60
ClientTop = 345
ClientWidth = 7275
LinkTopic = "Form1"
ScaleHeight = 5325
ScaleWidth = 7275
StartUpPosition = 3 'Windows Default
Begin VB.TextBox tbOutput
Height = 3855
Left = 240
MultiLine = -1 'True
ScrollBars = 2 'Vertical
TabIndex = 3
Top = 1320
Width = 6855
End
Begin VB.Timer timerPoll
Enabled = 0 'False
Interval = 50
Left = 3120
Top = 120
End
Begin VB.CommandButton btnStart
Caption = "&Start"
Height = 495
Left = 5280
TabIndex = 2
Top = 240
Width = 1215
End
Begin VB.TextBox tbQueueLabel
Height = 285
Left = 1560
TabIndex = 0
Top = 240
Width = 1215
End
Begin VB.Label lblQueueLabel
Caption = "Input Queue Label:"
Height = 255
Left = 120
TabIndex = 1
Top = 240
Width = 1455
End
End
Attribute VB_Name = "Main"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' This is a part of the Microsoft Source Code Samples.
' Copyright (C) 1999 Microsoft Corporation.
' All rights reserved.
' This source code is only intended as a supplement to
' Microsoft Development Tools and/or WinHelp documentation.
' See these sources for detailed information regarding the
' Microsoft samples programs.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Option Explicit
Dim g_qInput As MSMQQueue
Private Function FFindCreateQueue(strQueueLabel As String, qinfo As MSMQQueueInfo) _
As Boolean
Dim query As MSMQQuery
Dim qinfos As MSMQQueueInfos
Set query = New MSMQQuery
'
'look for queue
'
Set qinfos = query.LookupQueue(Label:=strQueueLabel, _
ServiceTypeGuid:=MSMQMAIL_SERVICE_MAIL)
qinfos.Reset
Set qinfo = qinfos.Next
'No such queue found
If qinfo Is Nothing Then
If MsgBox("Mail queue " & strQueueLabel & _
" doesn't exist, would you like to create it?", vbYesNo) _
= vbNo Then
FFindCreateQueue = False
Exit Function
End If
'Create one
Set qinfo = New MSMQQueueInfo
qinfo.PathName = ".\" & strQueueLabel & "_replyall"
qinfo.Label = strQueueLabel
qinfo.ServiceTypeGuid = MSMQMAIL_SERVICE_MAIL
'
'Error handling should be added here.
'
qinfo.Create
End If
FFindCreateQueue = True
End Function
Private Function FDoStart() As Boolean
Dim qinfo As MSMQQueueInfo
'reset return value
FDoStart = False
'check input
If tbQueueLabel.Text = "" Then
Beep
MsgBox "Please fill in the input queue label", vbOKOnly + vbInformation
tbQueueLabel.SetFocus
Exit Function
End If
'find or create the queue
If Not FFindCreateQueue(tbQueueLabel.Text, qinfo) Then
tbQueueLabel.SetFocus
Exit Function
End If
'open the input queue
Set g_qInput = qinfo.Open(MQ_RECEIVE_ACCESS, MQ_DENY_NONE)
'enable processing of the queue in the background
timerPoll.Interval = 50 'check for messages every 50 msec
timerPoll.Enabled = True
'return success
FDoStart = True
End Function
Private Sub DoStop()
'disable processing of the queue in the background
timerPoll.Enabled = False
'close the input queue
g_qInput.Close
End Sub
Private Sub btnStart_Click()
btnStart.Enabled = False
If btnStart.Caption = "&Start" Then
'it is start, start processing & change the button to stop
If FDoStart() Then
btnStart.Caption = "S&top"
End If
Else 'it is stop, stop processing & change the button to start
DoStop
btnStart.Caption = "&Start"
End If
btnStart.Enabled = True
End Sub
Private Sub Form_Load()
'disable processing of the queue in the background
timerPoll.Enabled = False
'fail and exit if local computer is DS disabled
If Not IsDsEnabled Then
MsgBox "DS disabled mode not supported.", vbOKOnly + vbInformation, "Reply All"
End
End If
End Sub
Function CreateReplyAllEmail(emailIn As MSMQMailEMail) As MSMQMailEMail
Dim emailOut As MSMQMailEMail
Dim strOurAddress As String
'create email out
Set emailOut = New MSMQMailEMail
'set date
emailOut.SubmissionTime = Now
'set subject as reply to original subject
If Left$(emailIn.Subject, 3) <> "RE:" Then
emailOut.Subject = "RE: " & emailIn.Subject
Else
emailOut.Subject = emailIn.Subject
End If
'set sender properties as ours
emailOut.Sender.Name = "ReplyAll Sample"
'our address is our input queue label
strOurAddress = g_qInput.QueueInfo.Label
emailOut.Sender.Address = strOurAddress
'set the recipients list
'add the sender of the original mail as a primary recipient
emailOut.Recipients.Add emailIn.Sender.Name, emailIn.Sender.Address, _
MSMQMAIL_RECIPIENT_TO
'add other recipients from original mail, excluding ourselves
Dim recipientIn As MSMQMailRecipient
For Each recipientIn In emailIn.Recipients
'check recipient's address. if its not us, add it to the recipient list
If recipientIn.Address <> strOurAddress Then
emailOut.Recipients.Add recipientIn.Name, recipientIn.Address, recipientIn.RecipientType
End If
Next recipientIn
'switch on email type
If emailIn.ContentType = MSMQMAIL_EMAIL_FORM Then
'it is a form. return the same form, just fill in the reply field
'set type to form
emailOut.ContentType = MSMQMAIL_EMAIL_FORM
'set form name from original form
emailOut.FormData.Name = emailIn.FormData.Name
'set fields from original form
Dim fieldIn As MSMQMailFormField
For Each fieldIn In emailIn.FormData.FormFields
'skip the reply field if any, we will add one anyway
If fieldIn.Name <> "reply" Then
'add original form field
emailOut.FormData.FormFields.Add fieldIn.Name, fieldIn.Value
End If
Next fieldIn
'Add the reply field
emailOut.FormData.FormFields.Add "reply", _
"This is a reply field from the ReplyAll sample"
ElseIf emailIn.ContentType = MSMQMAIL_EMAIL_TEXTMESSAGE Then
'it is a text message. return reply text plus the original message text
'set type to text message
emailOut.ContentType = MSMQMAIL_EMAIL_TEXTMESSAGE
'return a reply text before the original message text
Dim strReply As String
strReply = "This is a reply text message from the ReplyAll sample" & vbNewLine
strReply = strReply & "----------------------------------------------------------" & vbNewLine
'add the original message text
strReply = strReply & emailIn.TextMessageData.Text
emailOut.TextMessageData.Text = strReply
End If
'return reply-all email
Set CreateReplyAllEmail = emailOut
Set emailOut = Nothing
End Function
Private Sub SendMsgToQueueLabel(msgOut As MSMQMessage, strQueueLabel As String)
Dim query As MSMQQuery
Dim qinfos As MSMQQueueInfos
Dim qinfo As MSMQQueueInfo
Dim qDestination As MSMQQueue
Set query = New MSMQQuery
Set qinfos = query.LookupQueue(Label:=strQueueLabel, _
ServiceTypeGuid:=MSMQMAIL_SERVICE_MAIL)
qinfos.Reset
Set qinfo = qinfos.Next
If qinfo Is Nothing Then
MsgBox "Destination mail queue " & strQueueLabel & " doesn't exist. Can't send to this queue", vbExclamation
Exit Sub
End If
Set qDestination = qinfo.Open(MQ_SEND_ACCESS, MQ_DENY_NONE)
msgOut.Send qDestination
End Sub
Private Sub OutputEmail(email As MSMQMailEMail)
Dim strDump As String
strDump = "Received the following email:" & vbNewLine
strDump = strDump & "Subject: " & email.Subject & vbNewLine
strDump = strDump & "Sender: " & email.Sender.Name & " " & email.Sender.Address & vbNewLine
strDump = strDump & "Sent on: " & email.SubmissionTime & vbNewLine
strDump = strDump & "Recipients are:" & vbNewLine
'Dump the recipient list
Dim recipient As MSMQMailRecipient
For Each recipient In email.Recipients
strDump = strDump & recipient.Name & " " & recipient.Address & " " & recipient.RecipientType & vbNewLine
Next recipient
'Check email type
If email.ContentType = MSMQMAIL_EMAIL_FORM Then
'Dump form related properties
strDump = strDump & "Form name: " & email.FormData.Name & vbNewLine
strDump = strDump & "Form fields are: " & vbNewLine
'Dump the form field list
Dim formfield As MSMQMailFormField
For Each formfield In email.FormData.FormFields
strDump = strDump & formfield.Name & " " & formfield.Value & vbNewLine
Next formfield
ElseIf email.ContentType = MSMQMAIL_EMAIL_TEXTMESSAGE Then
'Dump text related properties
strDump = strDump & "Message Text is:" & vbNewLine
strDump = strDump & email.TextMessageData.Text & vbNewLine
End If
strDump = strDump & "-------------------------------------" & vbNewLine
tbOutput.Text = tbOutput.Text & strDump
End Sub
Private Sub DoProcessMsg(msgIn As MSMQMessage)
Dim emailIn As MSMQMailEMail
Dim emailOut As MSMQMailEMail
Dim msgOut As MSMQMessage
'create new email object for original message
Set emailIn = New MSMQMailEMail
'parse the body of the MSMQ message and set email object properties
emailIn.ParseBody msgIn.Body
'dump the email to the output text box
OutputEmail emailIn
'create reply-all email
Set emailOut = CreateReplyAllEmail(emailIn)
'create new MSMQ message
Set msgOut = New MSMQMessage
'create the body of the MSMQ message from the reply-all email
msgOut.Body = emailOut.ComposeBody()
'set other MSMQ message properties
msgOut.Delivery = MQMSG_DELIVERY_RECOVERABLE
'send the MSMQ message to each of the destination queues
Dim varQueueLabel As Variant
For Each varQueueLabel In emailOut.DestinationQueueLabels
SendMsgToQueueLabel msgOut, CStr(varQueueLabel)
Next varQueueLabel
End Sub
Private Sub timerPoll_Timer()
Dim msgIn As MSMQMessage
Set msgIn = New MSMQMessage
'get first message in the queue, if any
Set msgIn = g_qInput.Receive(ReceiveTimeout:=0)
While Not msgIn Is Nothing
'process the message
DoProcessMsg msgIn
Set msgIn = Nothing
'get next message in the queue, if any
Set msgIn = g_qInput.Receive(ReceiveTimeout:=0)
Wend
End Sub