package Mail;

use strict;

use Encode;
use MIME::Entity;
use Net::SMTP;
use POSIX;

my $offset = -5;

sub send()
{
	my ($from, $reply_to, $to, $subject, $message) = @_;

	my $entity = MIME::Entity->build(
		Type => 'text/plain',
		Charset => 'UTF-8',
		Encoding => 'quoted-printable',
		Data => Encode::encode('UTF-8', $message),
		Date => &rfc2822(time()),
		From => Encode::encode('MIME-Header', $from),
		'Reply-To' => Encode::encode('MIME-Header', $reply_to),
		To => Encode::encode('MIME-Header', $to),
		Subject => Encode::encode('MIME-Header', $subject)
	);

	my $smtp = new Net::SMTP('localhost');

	$smtp->mail($from);
	$smtp->to($to);

	$smtp->data();
	my $msg = $entity->stringify;
	while ($msg =~ /([^\r\n]*)(\r\n|\n\r|\r|\n)?/g) {
		my $line = (defined($1) ? $1 : '') . "\r\n";
		$smtp->datasend($line);
	}
	$smtp->dataend();

	$smtp->quit();
}

#######
## Given a UNIX-style datestamp, returns a string with the date in RFC2822 format
#######
sub rfc2822()
{
	my $date = shift;
	my @parts = localtime($date);
	# $parts[8] is 'isdst'
	my $zone = ($parts[8] ? $offset + 1 : $offset) * 100;
	
	return strftime('%a, %e %b %Y %H:%M:%S', @parts) . sprintf(" %+05d", $zone);
}

1;
