NAME
Email::Queue - schedule email messages to be sent one by one at a later time.
VERSION
Version 0.01
SYNOPSIS
use File::Queue;
my $fq = File::Queue->new(
path => '/tmp/emails',
mkpath => 1
);
# Create a message
my $message = Email::Simple->create(...);
# Schedule the message 50 times (for the sake of the example)
$fq->schedule($message) for ( 0 .. 49 );
# ... much later ... from another script ....
# Process the scheduled messages
while ( my $message = $fq->next ) {
# sendmail is an imaginery sub that sends RFC2822 formatted emails.
sendmail( $message->as_string );
}
DESCRIPTION
This module schedules email messages to be sent one by one at a later time.
Your web application sends a lot of emails to your users for notifications, verification, updates or anything. Whether you use sendmail
or SMTP
, your emails are sent slower and they become the bottleneck of your application.
One possible solution is to use this module to write your emails to files and send them later one by one, perhaps from another script with lower process priority. You could even process the email queue using several concurrently working scripts and it will be OK because this module handles all file locking and queue management.
This module does not provide the actual email sending functionality. It is up to the user of this module to decide what to use for sending emails.
EMAIL FORMATS
All emails must be a Email::Simple object. Please see the documentation for Email::Simple, to understand how to create emails.
When an email is scheduled, it is dumped to a file in the specified "path" as plain text RFC2822 email message.
When an email is loaded from a file it is converted back to an Email::Simple object.
ATTRIBUTES
The following attributes are available during object construction
path
Specifies the path where email files will be stores. The default is the current path. If the path is not writeable it will croak.
mkpath
If set to 1 it will try to create a the path
unless the path already exists.
ext
Set the extension for the email files. The default value for this attribute is .eml
prefix
Set the prefix for the email files. The default value for this attribute is msg
xlock
Set the name of the email header which marks an email file as locked. The default value is X-Lock
.
timeout
Timeout in seconds to hold email files locked. If a mailer process locks an email file and does not send it within the specified time, the file will be unlocked and available for other mailer processes. The default value is 3600.
grab_count
Sets the number of messages that "next" will lock when called the very first time. The default value is 50. If set to 0, then next
will lock all messages in the queue.
# Only lock 2 messages at a time
$fq->grab_count(2);
$fq->next; # Lock 2 messages and return the first
$fq->next; # Return the second locked message
$fq->next; # Lock another 2 messages and return the first
METHODS
The following methods are available:
schedule( $message )
Schedule a message. $message
must be an Email::Simple instance. Returns the ID of the message, which is the filename used to save it.
my $message = Email::Simple->new( ... );
my $message_id = $fq->schedule( $message );
count
Returns the count of all scheduled messages.
my $all_emails = $fq->count;
next
Returns the next scheduled message as an Email::Simple instance and immediately removes that message from the queue. Returns undef is there are no more messages in the queue.
print "Processing " . $fq->count . " messages\n";
while ( my $message = $fq->next ) {
# Do something with $message,
# for example send $message->as_string via sendmail
}
print "All mail sent\n";
SEE ALSO
AUTHOR
minimalist, <minimalist at lavabit.com>
BUGS
Bug reports and patches are welcome. Reports which include a failing Test::More style test are helpful and will receive priority.
DEVELOPMENT
The source code of this module is available on GitHub: https://github.com/naturalist/Email--Queue
LICENSE AND COPYRIGHT
Copyright 2011 minimalist.
This program is free software; you can redistribute it and/or modify it under the terms as perl itself.