Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Sending a Message (WebDAV)
This content is no longer actively maintained. It is provided as is, for anyone who may still be using these technologies, with no warranties or claims of accuracy with regard to the most recent product version or service release.
The following example uses the WebDAV PUT method and MOVE Method to create and send an RFC 822-formatted e-mail message. The PUT method creates the message in the drafts folder of the sender's inbox and the MOVE Method is used to send the message by moving it to the DAV mail submission Uniform Resource Identifier (URI) of the recipient.
It is also possible to use the WebDAV PUT method to save the message to the DAV mail submission URI directly, but this results in the received Field on the message not being set. If the received Field is not set, POP3 clients may not be able to download the message from the Exchange server. Saving the message to the drafts folder of the sender's inbox and moving it to the DAV mail submission URI will set the received Field properly.
See Constructing Exchange Store HTTP URLs and Authentication and Security Using WebDAV for more information.
This topic contains Microsoft® Visual Basic®, Microsoft C#, and Visual Basic .NET code examples.
Option Explicit Private Sub SendMessage() Dim strSubURI As String Dim strTempURI As String Dim strAlias As String Dim strUserName As String Dim strPassWord As String Dim strExchSvrName As String Dim strTo As String Dim strSubject As String Dim strBody As String Dim strText As String Dim bRequestSuccessful As Boolean ' To use MSXML 3.0, use the following Dim statements. Dim xmlReq As IXMLHTTPRequest Dim xmlReq2 As IXMLHTTPRequest ' To use MSXML 4.0, use the following Dim statements. ' Dim xmlReq As MSXML2.XMLHTTP40 ' Dim xmlReq2 As MSXML2.XMLHTTP40 On Error GoTo ErrHandler ' Exchange server name. strExchSvrName = "Server" ' Alias of the sender. strAlias = "alias" ' User name of the sender. strUserName = "Domain\alias" ' Password of the sender. strPassWord = "!Password" ' E-mail address of the sender. strTo = "alias2" ' Subject of the mail. strSubject = "DAV Message Test" ' Text body of the mail. strBody = "This message was sent using WebDAV" ' Build the submission URI. If Secure Sockets Layer (SSL) ' is set up on the server, use "https://" instead of "http://". strSubURI = "http://" & strExchSvrName & "/exchange/" & _ strAlias & "/%23%23DavMailSubmissionURI%23%23/" ' Build the temporary URI. If SSL is set up on the ' server, use "https://" instead of "http://". strTempURI = "http://" & strExchSvrName & "/exchange/" & _ strAlias & "/drafts/" & strSubject & ".eml" ' Construct the body of the PUT request. ' Note: If the From: header is included here, ' the MOVE method request will return a ' 403 (Forbidden) status. The From address will ' be generated by the Exchange server. strText = "To: " & strTo & vbNewLine & _ "Subject: " & strSubject & vbNewLine & _ "Date: " & Now & _ "X-Mailer: test mailer" & vbNewLine & _ "MIME-Version: 1.0" & vbNewLine & _ "Content-Type: text/plain;" & vbNewLine & _ "Charset = ""iso-8859-1""" & vbNewLine & _ "Content-Transfer-Encoding: 7bit" & vbNewLine & _ vbNewLine & strBody ' Initialize. bRequestSuccessful = False ' To use MSXML 3.0, use the following Set statement. Set xmlReq = CreateObject("Microsoft.XMLHTTP") ' To use MSXML 4.0, use the following Set statement. ' Set xmlReq = CreateObject("Msxml2.XMLHTTP.4.0") ' Open the request object with the PUT method and ' specify that it will be sent asynchronously. The ' message will be saved to the drafts folder of the ' specified user's inbox. xmlReq.open "PUT", strTempURI, False, strUserName, strPassWord ' Set the Content-Type header to the RFC 822 message format. xmlReq.setRequestHeader "Content-Type", "message/rfc822" ' Send the request with the message body. xmlReq.send strText ' The PUT request was successful. If (xmlReq.Status >= 200 And xmlReq.Status < 300) Then bRequestSuccessful = True ' An error occurred on the server. ElseIf (xmlReq.Status = 500) Then MsgBox "PUT request status:" & xmlReq.Status & vbCrLf & _ "Status text: An error occurred on the server." GoTo ErrExit Else MsgBox "PUT request status:" & xmlReq.Status & vbCrLf & _ "Status text: " & xmlReq.statusText GoTo ErrExit End If ' If the PUT request was successful, ' MOVE the message to the mailsubmission URI. If bRequestSuccessful Then ' To use MSXML 3.0, use the following Set statement. Set xmlReq2 = CreateObject("Microsoft.XMLHTTP") ' To use MSXML 4.0, use the following Set statement. ' Set xmlReq2 = CreateObject("Msxml2.XMLHTTP.4.0") ' Open the request object with the PUT method and ' specify that it will be sent asynchronously. xmlReq2.open "MOVE", strTempURI, False, strUserName, strPassWord xmlReq2.setRequestHeader "Destination", strSubURI xmlReq2.send ' The MOVE request was successful. If (xmlReq2.Status >= 200 And xmlReq2.Status < 300) Then MsgBox "Message was sent to " & strTo & " successfully." ' An error occurred on the server. ElseIf (xmlReq.Status = 500) Then MsgBox "MOVE request status:" & xmlReq.Status & vbCrLf & _ "Status text: An error occurred on the server." GoTo ErrExit Else MsgBox "MOVE request status:" & xmlReq.Status & vbCrLf & _ "Status text: " & xmlReq.statusText GoTo ErrExit End If End If ' Clean up. Set xmlReq = Nothing Set xmlReq2 = Nothing Exit Sub ErrHandler: ' Display error information. MsgBox Err.Number & ": " & Err.Description ' Clean up. Set xmlReq = Nothing Set xmlReq2 = Nothing Exit Sub ErrExit: ' Clean up. Set xmlReq = Nothing Set xmlReq2 = Nothing End Sub
using System; using System.Net; using System.IO; using System.Text; namespace ExchangeSDK.Snippets.CSharp { class SendingMessageWebDAV { [STAThread] static void Main(string[] args) { System.Net.HttpWebRequest PUTRequest; System.Net.WebResponse PUTResponse; System.Net.HttpWebRequest MOVERequest; System.Net.WebResponse MOVEResponse; System.Net.CredentialCache MyCredentialCache; string strMailboxURI = ""; string strSubURI = ""; string strTempURI = ""; string strServer = "ServerName"; string strPassword = "!Password"; string strDomain = "Domain"; string strAlias = "SenderAlias"; string strTo = "recipient@example.com"; string strSubject = "WebDAV message test."; string strText = "This message was sent using WebDAV."; string strBody = ""; byte[] bytes = null; System.IO.Stream PUTRequestStream = null; try { // Build the mailbox URI. strMailboxURI = "http://" + strServer + "/exchange/" + strAlias; // Build the submission URI for the message. If Secure // Sockets Layer (SSL) is set up on the server, use // "https://" instead of "http://". strSubURI = "http://" + strServer + "/exchange/" + strAlias + "/##DavMailSubmissionURI##/"; // Build the temporary URI for the message. If SSL is set // up on the server, use "https://" instead of "http://". strTempURI = "http://" + strServer + "/exchange/" + strAlias + "/drafts/" + strSubject + ".eml"; // Construct the RFC 822 formatted body of the PUT request. // Note: If the From: header is included here, // the MOVE method request will return a // 403 (Forbidden) status. The From address will // be generated by the Exchange server. strBody = "To: " + strTo + "\n" + "Subject: " + strSubject + "\n" + "Date: " + System.DateTime.Now + "X-Mailer: test mailer" + "\n" + "MIME-Version: 1.0" + "\n" + "Content-Type: text/plain;" + "\n" + "Charset = \"iso-8859-1\"" + "\n" + "Content-Transfer-Encoding: 7bit" + "\n" + "\n" + strText; // Create a new CredentialCache object and fill it with the network // credentials required to access the server. MyCredentialCache = new System.Net.CredentialCache(); MyCredentialCache.Add( new System.Uri(strMailboxURI), "NTLM", new System.Net.NetworkCredential(strAlias, strPassword, strDomain) ); // Create the HttpWebRequest object. PUTRequest = (System.Net.HttpWebRequest)HttpWebRequest.Create(strTempURI); // Add the network credentials to the request. PUTRequest.Credentials = MyCredentialCache; // Specify the PUT method. PUTRequest.Method = "PUT"; // Encode the body using UTF-8. bytes = Encoding.UTF8.GetBytes((string)strBody); // Set the content header length. This must be // done before writing data to the request stream. PUTRequest.ContentLength = bytes.Length; // Get a reference to the request stream. PUTRequestStream = PUTRequest.GetRequestStream(); // Write the message body to the request stream. PUTRequestStream.Write(bytes, 0, bytes.Length); // Close the Stream object to release the connection // for further use. PUTRequestStream.Close(); // Set the Content-Type header to the RFC 822 message format. PUTRequest.ContentType = "message/rfc822"; // PUT the message in the Drafts folder of the // sender's mailbox. PUTResponse = (System.Net.HttpWebResponse)PUTRequest.GetResponse(); // Create the HttpWebRequest object. MOVERequest = (System.Net.HttpWebRequest)HttpWebRequest.Create(strTempURI); // Add the network credentials to the request. MOVERequest.Credentials = MyCredentialCache; // Specify the MOVE method. MOVERequest.Method = "MOVE"; // Set the Destination header to the // mail submission URI. MOVERequest.Headers.Add("Destination", strSubURI); // Send the message by moving it from the Drafts folder of the // sender's mailbox to the mail submission URI. MOVEResponse = (System.Net.HttpWebResponse)MOVERequest.GetResponse(); Console.WriteLine("Message successfully sent."); // Clean up. PUTResponse.Close(); MOVEResponse.Close(); } catch(Exception ex) { // Catch any exceptions. Any error codes from the PUT // or MOVE method requests on the server will be caught // here, also. Console.WriteLine(ex.Message); } } } }
Option Explicit On Option Strict On Module Module1 Public Sub Main() ' Variables. Dim PUTRequest As System.Net.HttpWebRequest Dim PUTResponse As System.Net.HttpWebResponse Dim MOVERequest As System.Net.HttpWebRequest Dim MOVEResponse As System.Net.HttpWebResponse Dim MyCredentialCache As System.Net.CredentialCache Dim strMailboxURI As String Dim strSubURI As String Dim strTempURI As String Dim strServer As String Dim strPassword As String Dim strDomain As String Dim strAlias As String Dim strTo As String Dim strSubject As String Dim strText As String Dim strBody As String Dim PUTRequestStream As System.IO.Stream Dim bytes() As Byte Try ' Initialize variables. strServer = "ServerName" strPassword = "!Password" strDomain = "Domain" strAlias = "SenderAliase" strTo = "recipient@example.com" strSubject = "WebDAV message test." strText = "This message was sent using WebDAV." ' Build the mailbox URI. strMailboxURI = "http://" & strServer & "/exchange/" & strAlias ' Build the submission URI for the message. If Secure ' Sockets Layer (SSL) is set up on the server, use ' "https://" instead of "http://". strSubURI = "http://" & strServer & "/exchange/" & strAlias _ & "/##DavMailSubmissionURI##/" ' Build the temporary URI for the message. If SSL is set ' up on the server, use "https://" instead of "http://". strTempURI = "http://" & strServer & "/exchange/" & strAlias & _ "/drafts/" & strSubject & ".eml" ' Construct the RFC 822 formatted body of the PUT request. ' Note: If the From: header is included here, ' the MOVE method request will return a ' 403 (Forbidden) status. The From address will ' be generated by the Exchange server. strBody = "To: " & strTo & vbNewLine & _ "Subject: " & strSubject & vbNewLine & _ "Date: " & System.DateTime.Now & _ "X-Mailer: test mailer" & vbNewLine & _ "MIME-Version: 1.0" & vbNewLine & _ "Content-Type: text/plain;" & vbNewLine & _ "Charset = ""iso-8859-1""" & vbNewLine & _ "Content-Transfer-Encoding: 7bit" & vbNewLine & _ vbNewLine & strText ' Create a new CredentialCache object and fill it with the network ' credentials required to access the server. MyCredentialCache = New System.Net.CredentialCache MyCredentialCache.Add(New System.Uri(strMailboxURI), _ "NTLM", _ New System.Net.NetworkCredential(strAlias, strPassword, strDomain) _ ) ' Create the PUT HttpWebRequest object. PUTRequest = CType(System.Net.WebRequest.Create(strTempURI), _ System.Net.HttpWebRequest) ' Add the network credentials to the request. PUTRequest.Credentials = MyCredentialCache ' Specify the PUT method. PUTRequest.Method = "PUT" ' Encode the body using UTF-8. bytes = System.Text.Encoding.UTF8.GetBytes(strBody) ' Set the content header length. This must be ' done before writing data to the request stream. PUTRequest.ContentLength = bytes.Length ' Get a reference to the request stream. PUTRequestStream = PUTRequest.GetRequestStream() ' Write the message body to the request stream. PUTRequestStream.Write(bytes, 0, bytes.Length) ' Close the Stream object to release the connection ' for further use. PUTRequestStream.Close() ' Set the Content-Type header to the RFC 822 message format. PUTRequest.ContentType = "message/rfc822" ' PUT the message in the Drafts folder of the ' sender's mailbox. PUTResponse = CType(PUTRequest.GetResponse(), System.Net.HttpWebResponse) Console.WriteLine("Message successfully PUT to " & strTempURI) ' Create the MOVE HttpWebRequest object. MOVERequest = CType(System.Net.WebRequest.Create(strTempURI), _ System.Net.HttpWebRequest) ' Add the network credentials to the request. MOVERequest.Credentials = MyCredentialCache ' Specify the MOVE method. MOVERequest.Method = "MOVE" ' Set the Destination header to the ' mail submission URI. MOVERequest.Headers.Add("Destination", strSubURI) ' Send the message by moving it from the Drafts folder of the ' sender's mailbox to the mail submission URI. MOVEResponse = CType(MOVERequest.GetResponse(), System.Net.HttpWebResponse) Console.WriteLine("Message successfully sent to " & strTo) ' Clean up. PUTResponse.Close() MOVEResponse.Close() Catch ex As Exception ' Catch any exceptions. Any error codes from the PUT ' or MOVE method requests on the server will be caught ' here, also. Console.WriteLine(ex.Message) End Try End Sub End Module
Send us your feedback about the Microsoft Exchange Server 2003 SDK.
This topic last updated: March 2004
Build: June 2007 (2007.618.1)
© 2003-2006 Microsoft Corporation. All rights reserved. Terms of use.