AnyEvent-SMTP
view release on metacpan or search on metacpan
lib/AnyEvent/SMTP/Client.pm view on Meta::CPAN
our $VERSION = $AnyEvent::SMTP::VERSION;use AnyEvent::SMTP ();
# vvv This code was partly derived from AnyEvent::HTTP vvv
our $MAXCON = 10; # Maximum number of connections to any host
our %MAXCON; # Maximum number of connections to concrete host
our $ACTIVE = 0; # Currently active connections
our %ACTIVE;
my %CO_SLOT; # number of open connections, and wait queue, per host
sub _slot_schedule;
sub _slot_schedule($) {
my $host = shift;
my $mc = exists $MAXCON{$host} ? $MAXCON{$host} : $MAXCON;
while (!$mc or ( $mc > 0 and $CO_SLOT{$host}[0] < $mc )) {
if (my $cb = shift @{ $CO_SLOT{$host}[1] }) {
# somebody wants that slot
++$CO_SLOT{$host}[0];
++$ACTIVE;
++$ACTIVE{$host};
$cb->(AnyEvent::Util::guard {
--$ACTIVE;
lib/AnyEvent/SMTP/Client.pm view on Meta::CPAN
});
} else {
# nobody wants the slot, maybe we can forget about it
delete $CO_SLOT{$host} unless $CO_SLOT{$host}[0];
last;
}
}
}
# wait for a free slot on host, call callback
sub _get_slot($$) {
push @{ $CO_SLOT{$_[0]}[1] }, $_[1];
_slot_schedule $_[0];
}
sub _tcp_connect($$$;$) {
my ($host,$port,$cb,$pr) = @_;
#warn "Need slot $host (have $ACTIVE)";
_get_slot $host, sub {
my $sg = shift;
#warn "Have slot $host (have $ACTIVE)";
tcp_connect($host,$port,sub {
$cb->(@_,$sg);
}, $pr);
}
}
lib/AnyEvent/SMTP/Client.pm view on Meta::CPAN
@_ or return;
for (@_) {
if ( $_ eq 'sendmail') {
*{$pkg.'::'.$_} = \&$_;
} else {
require Carp; Carp::croak "$_ is not exported by $me";
}
}
}
sub sendmail(%) {
my %args = @_;
my @keys = keys %args;
@args{map lc, @keys} = delete @args{ @keys };
$args{data} ||= delete $args{message} || delete $args{body};
$args{helo} ||= hostname();
if ($args{server}) {
my ($h,$p) = $args{server} =~ /^([^:]+)(?:|:(\d+))$/;
$args{host} = $h or return $args{cb}(undef,"Bad option value for `server'");
$args{port} = $p if defined $p;
}
( run in 0.580 second using v1.01-cache-2.11-cpan-65fba6d93b7 )