Thursday, July 15, 2010

Windows 7: SMTP Server

I am using Windows 7, as a developer some times i need to send emails from my applications. But using Windows 7  i can’t send emails as SMTP service used to ship with IIS 6.0 and earlier versions are missing from IIS 7.0 on Windows 7.  there is no default SMTP configured, I am very impressed with Windows 7 but  IIS 7.0 does not include Post Office Protocol or Simple Mail Transfer Protocol.

For this there many third party free SMTP Servers available over net.  But for me after trying various SMTP service solutions, the one that I found to be pretty simple to install and configure is hMailServer. Just like the old SMTP that ships with IIS 6.0, hMailServer allows one to restrict access to the local machine (127.0.0.1) only in order to prevent being vulnerable to spam. It installs a SQL database meant for storing inbound email for users to POP/IMAP mail out of. Its a security features of locking it down to the loopback address. But as developer its simple and easy to use

Download and install hMailServer.

Some pointers on ensuring you restrict access to your local machine only.

Once you attempt to connect i ask for the password which is give at the time of installation.

8

This will open the admin console.  Go to Protocols section in Settings, and check only SMTP and save.

9

Now go to Advanced in Settings –>Settings –> Advanced. Select IP Ranges section

image

Select My Computer from IP Ranges and click Edit,

image

Uncheck all from Require SMTP authentication section. And keep the rest all default settings as it is.

That is it.  You have a mail server now on Windows 7.  This software has a lot of options including having multiple domains.  Remember to secure it the best you can so you don’t become a spam haven.  Happy SMTP Mailing Smile

Wednesday, July 14, 2010

SP_EXECUTESQL vs EXECUTE/EXEC

Common Properties

  • The Transact-SQL statements in the sp_executesql or EXECUTE string are not compiled into an execution plan until sp_executesql or the EXECUTE statement are executed. The strings are not parsed or checked for errors until they are executed. The names referenced in the strings are not resolved until they are executed.
  • The Transact-SQL statements in the executed string do not have access to any of the variables declared in the batch that contains the sp_executesql or EXECUTE statement. The batch containing the sp_executesql or EXECUTE statement does not have access to variables or local cursors defined in the executed string.
  • If the executed string has a USE statement that changes the database context, the change to the database context only lasts until sp_executesql or the EXECUTE statement completes.

Comparison SP_EXECUTESQL vs EXECUTE/EXEC

sp_executesql gives you the possibility to use parameterised statements, EXECUTE does not. Parameterised statements gives no risk to SQL injection and also gives advantage of cached query plan. The sp_executesql stored procedure supports parameters. So, using the sp_executesql stored procedure instead of the EXECUTE statement improve readability of your code when there are many parameters are used. When you use the sp_executesql stored procedure to executes a Transact-SQL statements that will be reused many times, the SQL Server query optimizer will reuse the execution plan it generates for the first execution when the change in parameter values to the statement is the only variation.

sp_executesql can be used instead of stored procedures to execute a Transact-SQL statement a number of times when the change in parameter values to the statement is the only variation. Because the Transact-SQL statement itself remains constant and only the parameter values change, the SQL Server query optimizer is likely to reuse the execution plan it generates for the first execution.

Use SP_EXECUTESQL rather than EXEC(), it has better performance and improved security.

sp_executesql [ @statement= ] statement
[ 
  { , [ @params = ] N'@parameter_name data_type [ OUT | OUTPUT ][ ,...n ]' } 
     { , [ @param1= ] 'value1' [ ,...n ] }
]

Thursday, July 08, 2010

How to: Drop a Database if it exists

Here is the T-SQL code for checking to create if the database exists. This code below drops the database and creates new.

-- Changed database context to 'master'
USE master
GO
-- Check Exists
IF EXISTS(SELECT name FROM sys.databases
WHERE name = 'Angel83')
DROP DATABASE Angel83
GO
-- Create Database
CREATE DATABASE Angel83
GO

Tuesday, July 06, 2010

SQL SERVER Tweaks

Here are some shortcuts to monitor and admin SQL Server

Determines Server available disk space:
xp_fixeddrives

Determine Log Size Log Space used and status of the available databases

DBCC SQLPERF(LOGSPACE);
GO


Database size and service broker information:

DBCC CHECKDB

Uses to get information of the database work tables to hold intermediate results and for sort operations

How to get Current time and user information:

SELECT
    CURRENT_TIMESTAMP AS TIME,
    USER AS Username,
    SYSTEM_USER AS System_Username,
    CURRENT_USER AS Current_Username,
    SESSION_USER AS Session_Username

Monitoring SQL-Server:

sp_who2

Useful stored procedures:

sp_helpdb -- Displays information about all databases on the server
sp_helpdb ‘databasename’ -- Displays information about a particular database
sp_help objectname -- Displays information about a table
sp_spaceused -- Displays information about the space used in the current database
sp_tables -- Lists the tables in a database
sp_helptext name -- Displays the code used in a particular stored procedure
sp_dboption -- Sets or returns information about database options

Hope this helps.

Tuesday, June 29, 2010

How to: List all files in a Drive using C#

The code below shows how to use the System.IO.DirectoryInfo function to retreive all the files in the specified location, it also show how to get the extension and other information. Here in this code sample checking for DriveType CD Rom and files in that CD Drive.

Here is a sample code snippet for doing this. Have fun!

System.IO.DriveInfo[] drives = System.IO.DriveInfo.GetDrives();
string strDriverLetter = "";
bool boolDriveIsReady = false;
foreach (System.IO.DriveInfo drive in drives)
{
    if (drive.DriveType == System.IO.DriveType.CDRom)
    {
        Console.WriteLine("Drive Name: " + drive.Name);
        strDriverLetter = drive.Name;
        boolDriveIsReady = drive.IsReady;
        break;
    }
}
if (boolDriveIsReady == true)
{
    boolDriveIsReady = false;
    DirectoryInfo di = new DirectoryInfo(strDriverLetter);
    FileInfo[] exFiles = di.GetFiles("*.exe");
    foreach (FileInfo fi in exFiles)
    {
        Console.WriteLine("File Name: " + fi.Name + "Extension "+ fi.Extension);
        if (fi.Name.ToUpper().Equals("LAUNCH.EXE"))
        {                        
            boolDriveIsReady = true;
            break;
        }
    }
}