Do we need to dispose or terminate a thread in C# after usage?

NO!

there is no need to dispose the Thread object (BTW, the Thread class does not provide the Dispose method).


Thread is diposed when its routine comes at end.
So NO, you don't have to do it, it's not necessary (nor possible I think).


Well, your SmtpClient should be Dispose()'d. I'd use the Task Parallel Library instead of creating raw threads:

public static void Send(this MailMessage email)
{
    if (!isInitialized)
        Initialize(false);
    //smtpClient.SendAsync(email, "");
    email.IsBodyHtml = true;

    Task.Factory.StartNew(() =>
    {
        // Make sure your caller Dispose()'s the email it passes in at some point!
        using (SmtpClient client = new SmtpClient("smtpserveraddress"))
        {
            client.Send(email);
        }
    });
}