2 # $Id: mailto.pm,v 1.1.1.1 2003/08/02 23:39:56 takezoe Exp $
\r
4 # This module implements the mailto protocol. It is just a simple
\r
5 # frontend to the Unix sendmail program except on MacOS, where it uses
\r
8 package LWP::Protocol::mailto;
\r
10 require LWP::Protocol;
\r
11 require HTTP::Request;
\r
12 require HTTP::Response;
\r
13 require HTTP::Status;
\r
17 use vars qw(@ISA $SENDMAIL);
\r
19 @ISA = qw(LWP::Protocol);
\r
21 $SENDMAIL ||= "/usr/lib/sendmail";
\r
25 my($self, $request, $proxy, $arg, $size) = @_;
\r
27 my ($mail, $addr) if $^O eq "MacOS";
\r
28 my @text = () if $^O eq "MacOS";
\r
33 return new HTTP::Response &HTTP::Status::RC_BAD_REQUEST,
\r
34 'You can not proxy with mail';
\r
38 my $method = $request->method;
\r
40 if ($method ne 'POST') {
\r
41 return new HTTP::Response &HTTP::Status::RC_BAD_REQUEST,
\r
42 'Library does not allow method ' .
\r
43 "$method for 'mailto:' URLs";
\r
47 my $url = $request->url;
\r
49 my $scheme = $url->scheme;
\r
50 if ($scheme ne 'mailto') {
\r
51 return new HTTP::Response &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
\r
52 "LWP::file::request called for '$scheme'";
\r
54 if ($^O eq "MacOS") {
\r
56 require Mail::Internet;
\r
59 return new HTTP::Response &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
\r
60 "You don't have MailTools installed";
\r
62 unless ($ENV{SMTPHOSTS}) {
\r
63 return new HTTP::Response &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
\r
64 "You don't have SMTPHOSTS defined";
\r
67 unless (-x $SENDMAIL) {
\r
68 return new HTTP::Response &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
\r
69 "You don't have $SENDMAIL";
\r
72 if ($^O eq "MacOS") {
\r
73 $mail = Mail::Internet->new or
\r
74 return new HTTP::Response &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
\r
75 "Can't get a Mail::Internet object";
\r
77 open(SENDMAIL, "| $SENDMAIL -oi -t") or
\r
78 return new HTTP::Response &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
\r
79 "Can't run $SENDMAIL: $!";
\r
81 if ($^O eq "MacOS") {
\r
82 $addr = $url->encoded822addr;
\r
84 $request = $request->clone; # we modify a copy
\r
85 my @h = $url->headers; # URL headers override those in the request
\r
89 next unless defined $v;
\r
90 if (lc($k) eq "body") {
\r
91 $request->content($v);
\r
93 $request->push_header($k => $v);
\r
97 if ($^O eq "MacOS") {
\r
98 $mail->add(To => $addr);
\r
99 $mail->add(split(/[:\n]/,$request->headers_as_string));
\r
101 print SENDMAIL $request->headers_as_string;
\r
102 print SENDMAIL "\n";
\r
104 my $content = $request->content;
\r
105 if (defined $content) {
\r
106 my $contRef = ref($content) ? $content : \$content;
\r
107 if (ref($contRef) eq 'SCALAR') {
\r
108 if ($^O eq "MacOS") {
\r
109 @text = split("\n",$$contRef);
\r
114 print SENDMAIL $$contRef;
\r
117 } elsif (ref($contRef) eq 'CODE') {
\r
118 # Callback provides data
\r
120 if ($^O eq "MacOS") {
\r
122 while (length($d = &$contRef)) {
\r
125 @text = split("\n",$stuff);
\r
134 if ($^O eq "MacOS") {
\r
135 $mail->body(\@text);
\r
136 unless ($mail->smtpsend) {
\r
137 return HTTP::Response->new(&HTTP::Status::RC_INTERNAL_SERVER_ERROR,
\r
138 "Mail::Internet->smtpsend unable to send message to <$addr>");
\r
141 unless (close(SENDMAIL)) {
\r
142 my $err = $! ? "$!" : "Exit status $?";
\r
143 return HTTP::Response->new(&HTTP::Status::RC_INTERNAL_SERVER_ERROR,
\r
144 "$SENDMAIL: $err");
\r
149 my $response = HTTP::Response->new(&HTTP::Status::RC_ACCEPTED,
\r
151 $response->header('Content-Type', 'text/plain');
\r
152 if ($^O eq "MacOS") {
\r
153 $response->header('Server' => "Mail::Internet $Mail::Internet::VERSION");
\r
154 $response->content("Message sent to <$addr>\n");
\r
156 $response->header('Server' => $SENDMAIL);
\r
157 my $to = $request->header("To");
\r
158 $response->content("Message sent to <$to>\n");
\r