One option to maintain the clean modularity of your notification task is to use two packages to organize or "scope" your code.

The added "controller" package contains an Execute Package Task for the existing package of ETL tasks. The Send Mail Task is moved to the controller package with an On Failure constraint from the Execute Package Task. Pass the path of the ETL package's log file back to the controller package as a global variable. Set the FileAttachments property of the Send Mail Task to the global variable value so that the log file can conveniently be read as an attachment to the failure notification email.

This would avoid the development burden of building a custom task or ActiveX script to avoid redundancy.

(Of course, a custom task is the direction to go when you need powerful auditing or, especially, an error handler...but throwing COM or Visual Studio into the mix probably won't meet the spec for simplicity of maintenance.)

I'm brand new to the whole DTS scene, and I found the article very helpful. However, my task involves some conditional processing. Could you help me by providing some examples of conditional logic for determining whether the current row is existing or not (ins vs upd)? I know very little VBscript/ActiceX, but I can extrapolate from examples.

"Data Driven Query Task" suck, if you ask me. Other than that, it's a pretty good overview of what you can do with DTS. Personally, I put business rules in SQL code, preferably making it data driven so users can modify the imports in simple ways without changing code.