Archive for the ‘Component’ Category

We’re changing our name from Lesnikowski to Limilabs

Sunday, February 5th, 2012

Limilabs logoWe are pleased to announce that we will soon be Limilabs.

We continue to deliver same, great .NET components. The change is not in name only as at Limilabs we are also going to provide full lifecycle application development services for our customers.

It’s a pretty exciting time for our little company.

With a change like this, we thought it would be a good time to introduce a new website www.limilabs.com and do some namespace cleaning.

You will still get the same great service you’ve come to expect from lesnikowski.com.

Don’t worry if you forget the new web site address, after we finish the transition, you will be redirected to the new address automatically.

And since it’s not often that I get to post on non-technology related stuff, I thought I’d take the opportunity to say thank you to all of you readers, users and buyers who have supported us and helped us grow!

Thank You All, and I hope you’ll like the new name.

Archive email in Gmail

Friday, January 6th, 2012

First remember to enable IMAP in Gmail.

You need to use DeleteMessageByUID method. Messages will be still available in All Mail folder.

// C#

using(Imap imap = new Imap())
{
	imap.ConnectSSL("imap.gmail.com");
	imap.Login("user", "password");

	// Find all emails we want to delete
	imap.SelectInbox();
	List<long> uids = imap.Search(
		Expression.Subject("email to archive"));

	imap.DeleteMessageByUID(uids);

	imap.Close();
}
' VB.NET

Using imap As New Imap()
	imap.ConnectSSL("imap.gmail.com")
	imap.Login("user@gmail.com", "password")

	' Find all emails we want to delete
	imap.SelectInbox()
	Dim uids As List(Of Long) = imap.Search(_
		Expression.Subject("email to archive"))

	imap.DeleteMessageByUID(uids)

	imap.Close()
End Using

Send iCalendar meeting requests for different timezone

Sunday, January 1st, 2012

Usually you define time of an event in relation to UTC time zone.

If you need to define event on 9:00 o’clock in Alaska you simply need
to subtract 9 hours from event time to get the event time in UTC
(18:00:00). 18 – 9 = 9.

It all works great in December (Alaska is UTC-9), but in May, daylight
saving time is in effect in Alaska (Alaska is UTC-8 then).

If the event is recurring, in May, event is going to be held on 10:00
Alaska time (18 – 8 = 10). Which is most likely not what you want.

As the time zones in different parts of world change way to often to reflect these changes in Mail.dll,
you’ll need to specify the time zone when creating new event (including the daylight savings time).

Here’s the sample:

// C#
using Fluent = Lesnikowski.Mail.Fluent;
using Lesnikowski.Client;
using Lesnikowski.Mail;
using Lesnikowski.Mail.Appointments;

Appointment appointment = new Appointment();

// Create time zone
VTimeZone alaska = appointment.AddTimeZone();
alaska.TimeZoneId = "America/Anchorage";

// Define standard time offset
var standardRecurring = new RecurringRule();
standardRecurring.Frequency = Frequency.Yearly;
standardRecurring.ByDay.Add(Weekday.Sunday);
standardRecurring.ByMonths.Add(11);

var standard = new StandardOffset
{
    Name = "AKST",
    Start = new DateTime(1970, 11, 01, 02, 00, 00),
    OffsetFrom = TimeSpan.FromHours(-8),
    OffsetTo = TimeSpan.FromHours(-9),
    RecurringRule = standardRecurring
};

// Define daylight time offset
var daylightRecurring = new RecurringRule();
daylightRecurring.Frequency = Frequency.Yearly;
daylightRecurring.ByDay.Add(new Weekday(2, Weekday.Sunday));
daylightRecurring.ByMonths.Add(3);

var daylight = new DaylightOffset
{
    Name = "AKDT",
    Start = new DateTime(1970, 03, 08, 02, 00, 00),
    OffsetFrom = TimeSpan.FromHours(-9),
    OffsetTo = TimeSpan.FromHours(-8),
    RecurringRule = daylightRecurring
};

alaska.Standard.Add(standard);
alaska.Daylight.Add(daylight);

// Define event
Event e = appointment.AddEvent();
e.Start = new DateTime(2007, 08, 17, 12, 00, 00);
e.End = new DateTime(2007, 08, 17, 12, 30, 00);
e.Summary = "At noon in Alaska";
e.InTimeZone(alaska);

e.SetOrganizer(new Person("Alice", "alice@example.org"));

e.AddParticipant(new Participant(
    "Bob", "bob@example.org", ParticipationRole.Required, true));
e.AddParticipant(new Participant(
    "Tom", "tom@example.org", ParticipationRole.Optional, true));
e.AddParticipant(new Participant(
    "Alice", "alice@example.org", ParticipationRole.Required, true));

Alarm alarm = e.AddAlarm();
alarm.BeforeStart(TimeSpan.FromMinutes(15));

IMail email = Fluent.Mail
    .Text("Status meeting at noon in Alaska.")
    .Subject("Status meeting")
    .From("alice@example.org")
    .To("bob@example.org")
    .To("tom@example.org")
    .AddAppointment(appointment)
    .Create();

using (Smtp smtp = new Smtp())
{
    smtp.Connect("smtp.example.org"); // or ConnectSSL
    smtp.Login("user", "password");
    smtp.SendMessage(email);
    smtp.Close();
}
' VB.NET
Imports Fluent = Lesnikowski.Mail.Fluent
Imports Lesnikowski.Client
Imports Lesnikowski.Mail
Imports Lesnikowski.Mail.Appointments

Dim appointment As New Appointment()

' Create time zone
Dim alaska As VTimeZone = appointment.AddTimeZone()
alaska.TimeZoneId = "America/Anchorage"

' Define standard time offset
Dim standardRecurring = New RecurringRule()
standardRecurring.Frequency = Frequency.Yearly
standardRecurring.ByDay.Add(Weekday.Sunday)
standardRecurring.ByMonths.Add(11)

Dim standard = New StandardOffset() With { _
	.Name = "AKST", _
	.Start = New DateTime(1970, 11, 1, 2, 0, 0), _
	.OffsetFrom = TimeSpan.FromHours(-8), _
	.OffsetTo = TimeSpan.FromHours(-9), _
	.RecurringRule = standardRecurring _
}

' Define daylight time offset
Dim daylightRecurring = New RecurringRule()
daylightRecurring.Frequency = Frequency.Yearly
daylightRecurring.ByDay.Add(New Weekday(2, Weekday.Sunday))
daylightRecurring.ByMonths.Add(3)

Dim daylight = New DaylightOffset() With { _
	.Name = "AKDT", _
	.Start = New DateTime(1970, 3, 8, 2, 0, 0), _
	.OffsetFrom = TimeSpan.FromHours(-9), _
	.OffsetTo = TimeSpan.FromHours(-8), _
	.RecurringRule = daylightRecurring _
}

alaska.Standard.Add(standard)
alaska.Daylight.Add(daylight)

' Define event
Dim e As [Event] = appointment.AddEvent()
e.Start = New DateTime(2007, 8, 17, 12, 0, 0)
e.[End] = New DateTime(2007, 8, 17, 12, 30, 0)
e.Summary = "At noon in Alaska"
e.InTimeZone(alaska)

e.SetOrganizer(New Person("Alice", "alice@example.org"))

e.AddParticipant(New Participant( _
	"Bob", "bob@example.org", ParticipationRole.Required, True))
e.AddParticipant(New Participant( _
	"Tom", "tom@example.org", ParticipationRole.[Optional], True))
e.AddParticipant(New Participant( _
	"Alice", "alice@example.org", ParticipationRole.Required, True))

Dim alarm As Alarm = e.AddAlarm()
alarm.BeforeStart(TimeSpan.FromMinutes(15))

Dim email As IMail = Fluent.Mail _
	.Text("Status meeting at noon in Alaska.") _
	.Subject("Status meeting") _
	.From("alice@example.org") _
	.[To]("bob@example.org") _
	.[To]("tom@example.org") _
	.AddAppointment(appointment) _
	.Create()

Using smtp As New Smtp()
	smtp.Connect("smtp.example.org") 	' or ConnectSSL
	smtp.Login("user", "password")
	smtp.SendMessage(email)
	smtp.Close()
End Using

Reply to an email

Wednesday, December 28th, 2011

You can use Mail.dll to reply to an HTML or plain-text email.

ReplyBuilder class allows you to specify custom HTML and plain-text templates for the reply. Mail.dll will parse HTML extract body part, and build-in template engine will do the rest.

The next great thing is that plain-text version of the email is generated automatically.

// C#

IMail original = ...;

ReplyBuilder replyBuilder = original.Reply();
// You can specify your own custom template:
replyBuilder.HtmlReplyTemplate =
    "[Html]" +
    "<br /><br />" +
    "On [Original.Date] [Original.Sender.Name] wrote:" +
    "<blockquote " +
        "style='margin-left: 1em; " +
        "padding-left: 1em; " +
        "border-left: 1px #ccc solid;'>" +
    "[QuoteHtml]" +
    "</blockquote>";

replyBuilder.Html =
    "Alice, <br/><br/>thanks for your email.";

MailBuilder builder = replyBuilder.ReplyToAll(
    new MailBox("bob@example.org", "Bob"));

// You can add attachments to your reply
//builder.AddAttachment("report.csv");

IMail reply = builder.Create();

using (Smtp smtp = new Smtp())
{
    smtp.Connect("smtp.example.com"); // or ConnectSSL
    smtp.Login("user", "password");
    smtp.SendMessage(reply);
    smtp.Close();
}
' VB.NET

Dim original As IMail = ...

Dim replyBuilder As ReplyBuilder = original.Reply()

' You can specify your own custom template:
replyBuilder.HtmlReplyTemplate = _
    "[Html]" + _
    "<br /><br />" + _
    "On [Original.Date] [Original.Sender.Name] wrote:" + _
    "<blockquote " + _
        "style='margin-left: 1em; " + _
        "padding-left: 1em; " + _
        "border-left: 1px #ccc solid;'>" + _
    "[QuoteHtml]" + _
    "</blockquote>"

replyBuilder.Html = _
    "Alice, <br/><br/>thanks for your email."

Dim builder As MailBuilder = replyBuilder.ReplyToAll( _
    New MailBox("bob@example.org", "Bob"))

' You can add attachments to your reply
'builder.AddAttachment("report.csv")

Dim reply As IMail = builder.Create()

Using smtp As New Smtp()
	smtp.Connect("smtp.example.com")
	smtp.Login("user", "password") ' or ConnectSSL
	smtp.SendMessage(reply)
	smtp.Close()
End Using

Extract plain text from HTML email

Tuesday, December 27th, 2011

Mail.dll MIME and Email API’s may be used to extract the plain-text body and HTML body from an email message.

If a message contains plain-text, no conversion is necessary. It’s simply a matter of using the Text property of IMail interface.

If however the email does not contain plain-text and only HTML content is available GetTextFromHtml method may be used to convert the HTML to plain-text.

The internal conversion process is much more sophisticated than can be accomplished with the simple regular-expression code. This is more than simply removing HTML tags from an HTML document.

Mail.dll contains full-blown HTML parser that handles script tags, comments, CDATA and even incorrect HTML.

The following C# and VB.NET code extracts plain-text from the HTML body of the email message:

// C#

IMail email = ...

string text = email.Text;
if (string.IsNullOrEmpty(text) && email.IsHtml)
{
    text = email.GetTextFromHtml();
}
Console.WriteLine(text);

The following C# code extracts the HTML body from this MIME message and converts the HTML to plain-text:

' VB.NET

Dim email As IMail = ...

Dim text As String = email.Text
If String.IsNullOrEmpty(text) AndAlso email.IsHtml Then
	text = email.GetTextFromHtml()
End If
Console.WriteLine(text)