Tuesday, January 1, 2008

Sending automated email with ASP.NET

This is something I had to do a bit of digging. Since I am not a linux, php, or cgi script guru, I use ASP.NET to do all my scripting and programming. Finding solutions in ASP.NET are sometimes straight forward, but the odd time it isn't. With sending automated emails I didn't think it would be too much a problem, which it isn't if your ISP doesn't block outgoing SMTP servers transmissions. But if your ISP does, then it's a bit more of a hassle.

For an ISP that doesn't block SMTP, you can install the SMTP Server that comes with Windows Server 2003 or XP. It is a component of IIS. This is of course if you don't have MS Exchange. Many users tend to use the namespace System.Web.Mail for the classes used for sending email, this is fine when it comes to having an ISP that doesn't block SMTP transmissions. But still why use something that is now a bit outdated? Namespace System.Net.Mail which was introduced in ASP.NET 2.0 has more functionality and flexibility when it comes to sending emails. One of the more important features being able to supply credentials to a specified SMTP server. This will then allow you to utilize your ISP's SMTP Server and send emails.

So lets take a look at
some simple code that will get you on your way. The following code would ideally be put under the function that handles a button click (i.e. submit button). You will have to have the namespaces System.Net and System.Net.Mail imported.

MailMessage instance used for defining the attributes and content of the email<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="utf-8" %>
MailMessage message = new MailMessage(txtFrom.Text, txtTo.Text, txtSubject.Text, txtBody.Text);

SmtpClient instance used for defining the SMTP Server to be used for sending the email
SmtpClient emailClient = new SmtpClient(txtSMTPServer.Text);

Part of the System.Net namespace : NetworkCredential instance defines the user name and password used for accessing the SMTP Server in order to the send email
NetworkCredential SMTPUserInfo = new NetworkCredential(txtSMTPUser.Text, txtSMTPPass.Text);

Explicitly defines emailClient instance not to use default credentials when sending the email
emailClient.UseDefaultCredentials = false;

Set the credentials for emailClient instance with those defined by SMTPUserInfo instance
emailClient.Credentials = SMTPUserInfo;

Sends the email
emailClient.Send(message);

You can then setup ASP.NET form that will allow the user to enter in the relevant information using related ASP.NET controls.

Reference Material
http://msdn2.microsoft.com/en-us/library/system.net.mail.aspx
http://www.systemnetmail.com/

Software:
ASP .NET 2.0



Year 2008

Well, having started blogging in late 2007, I have to admit I haven't used it as much as I would like. So for 2008, I hope to get it off to a better start and start blogging some more.

Tuesday, November 6, 2007

MOSS 2007: Event ID: 2424 - The update cannot be started because the content sources cannot be accessed. Fix the errors and try the update again.

For those of you who have encountered this error, know that it is quite annoying. This is the error:



This error is basically saying that there is not enough permission for the account that is trying to access the content related to "Windows SharePoint Services Help Search".
Under the Central Administration go to Operations and then Services on Server.
In Windows SharePoint Services Help Search you'll notice 2 accounts. One being the Service Account and the other being the Content Access Account. These 2 accounts are configured at the beginning of the SharePoint installation when you define the accounts that are being used. If you look at your SQL server, you'll notice that these two accounts have identical permissions (if you haven't changed anything that is).
Because this error specifically says "content sources", the account in question will be the "Content Access Account". I've gone from giving this account read access for all content databases to even giving it owner permissions as a last resort and nothing worked.
After a bit of searching on the net, I changed the Content Access Account to use the exact same account as the Service Account and it worked. No more error message.
Now, I would love to bring this to Microsoft and ask them exactly why this works as both accounts had the same permissions in the SQL server. But knowing them they'll charge me just for asking this question. Although the problem is solved, it bothers me that I don't know exactly why it is fixed using this method. The Service Account must have some extra privileges elsewhere that I am not aware of that are different from the Content Access Account. Hopefully, I will eventually come across the answer to this. But for those of you who are encountering this same problem. Make the Service Account the Content Access Account as well and all should be good.



Friday, October 26, 2007

MOSS 2007: The trial period for this product has expired

I just had a hellish week repairing MOSS 2007. Details will follow when I have completely recuperated from the ordeal. However, I thought I'd post a little problem that I encountered with MOSS 2007 that seems to be a common bug. At first, I didn't think it was little, actually I was "sweating bullets" when I saw it because I had just successfully brought back MOSS 2007 after it was completely down. So seeing this error didn't help. In any case I saw this error message, "The trial period for this product has expired" when I was editing the master page of a SharePoint site. It would not let me check it back in, or publish it (I am running MOSS 2007 Enterprise).

So I did a bit of searching across the net and didn't have problems finding information on it in terms of people talking about it. It seems to be a problem quite a few users were facing. And what makes it even harder to diagnose is that there are multiple reasons for this error. If MOSS 2007 is installed on a DC for example, then a different fix will need to be applied. For my situation that fix did not apply because I have two-machine setup so far. One being the web front end and the other being the SQL database.

To cut a long story short, I did a repair on the MOSS 2007 web front end because I was out of options as the time it was down. So I tried many things, repair being one of them. Now apparently if you do a repair, it seems to only try and fix any damaged or corrupted files but does nothing to the registry (I'm assuming). I had to run the configuration wizard in order to fix the error for "The trial period for this product has expired". The configuration wizard basically updated the registry and all settings that seemed to have been lost during the repair. So while I am still unsure of exactly what caused it, this is my guess.

So, if you encounter this error AFTER a repair of MOSS 2007, remember to run the configuration wizard right away with all the default settings.

Friday, October 12, 2007

Automatic Logon - Windows NT / 2000 / XP

Ok, this is something that always come around once in awhile and each time it does I forget how to do it. So gonna post it so that I can check it up quickly. Basically whenever a computer reboots it'll automatically logon when it reaches to the logon screen. Simple.

To enable this function you will need to add some new values to the Registry. As always before working on the Registry make a quick backup just in case. Never hurts.

Go to: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
  1. Add/Change new string value to "Default User Name" and set it to the desired username
  2. Add/Change new string value to "DefaultPassword" and set it to the password of the desired username
  3. Add/Change new string value to "DefaultDomainName" and set it to the domain that the username resides in
  4. Change the string value of "AutoAdminLogon" to "1" for enable automatical logon or "0" to disable it

NOTES:

  1. For Windows 2000, "ForceAutoLogon" must be enabled to stop settings from being reset after reboot.
  2. Password is viewable by anyone who has access to the Registry
  3. Bypass auto login by holding down SHIFT during logon process
  4. Automatic logon will not function properly if "DontDisplayLastUserName" is enabled

Wednesday, September 19, 2007

Choosing the right Firewall

I find there are quite a few people out there not too familiar with exactly what a firewall does or how to pick the best one for their situation.

Here's a nice link that talks on some points when choosing what kind of firewall to get.

http://www.windowsnetworking.com/articles_tutorials/Choosing_a_Firewall.html

Sunday, September 16, 2007

ASP.NET - Placeholder web control

One way to dynamically show data one by one in a list is through the use of a placeholder. As the name suggests it is a web control that contains other web controls.

You can dynamically add other controls to the placeholder whenever needed.

Monday, September 10, 2007

ASP.NET and MS SQL Server 2005 - Bit / Boolean Type

Ok, I'm not a hardcore programmer, so today I found something that was quite wierd to me at least.

Now I have MS SQL Server 2005 as my backend database. I created a simple type with a couple fields, one being of type "bit", which can hold the values of 1, 0, or null. Since there isn't any boolean type, then this is what should be used for true and false data.

Now, I am programming in ASP.NET which communicates with the database. I was trying to do a simple INSERT command into this table and for awhile I couldn't figure out why it wasn't writing into it.

For example my SQL statement in ASP.NET could be like this:
Ex1. INSERT table1 (x1, x2, y1, y2) VALUES ('hello', 'there', True, False);

Or say I have a couple radio buttons R1 and R2 somewhere:
Ex2. INSERT table1 (x1, x2, y1, y2) VALUES ('good', 'bye', R1.Checked, R2.Checked);

In SQL Server: x1 and x2 are nchar(10), y1 and y2 are bit

Both statements did not work. If I actual values like 1 or 0, those will work.
Ex3. INSERT table1 (x1, x2, y1, y2) VALUES ('good', 'bye', 1, 0);

The only way to get Ex1 and Ex2 to work is to put bound the True or False by single quotes like a string.
Ex4. INSERT table1 (x1, x2, y1, y2) VALUES ('hello', 'there', 'True', 'False');

To me that is very confusing. But that's how SQL Server takes it.