Error:CDO.Message.1 (0x80040220) The "SendUsing" configuration value is invalid on IIS 7.5

The error CDO.Message.1 (0x80040220) -The "SendUsing" configuration value is invalid is back again on IIS 7.5 and the reasons are also the same! inadequate permissions on the IIS Metabase due to which CDOSYS is unable to read the location of the Pickup Directory from the IIS Metabase.

What has changed? The default Application Pool Identity in IIS 7.5 changed from NetworkService to AppPoolIdentity. For every Application Pool you create, the IIS Admin Process (WAS) will create a virtual account with the name of the new Application Pool and run the Application Pool's worker processes under this account. It is this account that is not able to read the location of the Pickup Directory from the IIS Metabase. You can read more about AppPoolIdentity here.

What are the available options to resolve the error? AFAIK there are 3 ways to resolve the error:

1) This is the easiest one, configure the application pool identity under which the site is running to NetworkService instead of AppPoolIdentity. From what I have seen the NetworkService account has “Special Permissions” on the /LM/SmtpSvc/ and /LM/SmtpSvc/1/ nodes in the IIS Metabase.

2) In case you do not want to change any permissions and are ok with code changes, then you can specify the smtpserverpickupdirectory and set its value to the path of pickup directory. Below is how we do it on VB Script.

 'Send using the Pickup directory on the IIS server.
Dim iMsg
Dim iConf
Dim Flds
Dim strHTML

Const cdoSendUsingPickup = 1

set iMsg = CreateObject("CDO.Message")
set iConf = CreateObject("CDO.Configuration")

Set Flds = iConf.Fields
With Flds
    .Item("https://schemas.microsoft.com/cdo/configuration/sendusing") = cdoSendUsingPickup
    'The path may differ in your environment
    .Item("https://schemas.microsoft.com/cdo/configuration/smtpserverpickupdirectory")="c:\Inetpub\mailroot\pickup"
    .Update
End With

' Build HTML for message body.
strHTML = "<HTML>"
strHTML = strHTML & "<HEAD>"
strHTML = strHTML & "<BODY>"
strHTML = strHTML & "<b> This is the test HTML message body</b></br>"
strHTML = strHTML & "</BODY>"
strHTML = strHTML & "</HTML>"

With iMsg
   Set .Configuration = iConf
   .To = "test@test.com"
   .From = "test@test.com"
   .Subject = "This is a test CDOSYS message (Sent via Pickup)"
   .HTMLBody = strHTML
   .Send
End With


' Clean up variables.
Set iMsg = Nothing
Set iConf = Nothing
Set Flds = Nothing

MsgBox "Mail Sent!"

3) Grant the IIS_IUSRS group read access to the /LM/SmtpSvc/ and /LM/SmtpSvc/1/ nodes in the IIS Metabase. How can you do it? You can download the Internet Information Services (IIS) 6.0 Resource Kit Tools at https://go.microsoft.com/fwlink/?LinkId=67351. This resource kit includes a Metabase Explorer that works with IIS 6.0 or IIS 7.0 with IIS 6 Management Compatibility role services installed. On IIS 7.0, the IIS Admin Service must be running for the Metabase Explorer tool to work correctly.

Why will this work? It will work because IIS 7 automatically adds the IIS_IUSRS membership to the worker processes token at runtime. By doing this, accounts that have been defined to run as 'application pool identities' no longer need to explicitly be part of the IIS_IUSRS group.

Enjoy!

Comments

  • Anonymous
    November 12, 2010
    Thanks for the great tips, just an addition, You can also make an impersonation tag in web.config and set the identity in appPool to that user, that would work as well. Thanks
  • Anonymous
    November 12, 2010
    Thanks for the great tips, just an addition, You can also make an impersonation tag in web.config and set the identity in appPool to that user, that would work as well. Thanks
  • Anonymous
    June 16, 2011
    Are there any security implications by choosing option #3?
  • Anonymous
    June 16, 2011
    IMO there should not be any. All we are doing is giving read permissions.With earlier version of IIS we sometimes had to grand the IUSR_MachineName account read access to the metabase.More details:learn.iis.net/.../understanding-built-in-user-and-group-accounts-in-iis-7
  • Anonymous
    June 19, 2011
    how to use this in asp.netthanks,johnlen
  • Anonymous
    June 19, 2011
    You can use the System.Net.Mail in ASP.NET to send mail.System.Net.Mail Namespacemsdn.microsoft.com/.../system.net.mail.aspxSamplearchive.msdn.microsoft.com/.../View.aspx