1 |
#!/usr/local/bin/perl |
2 |
|
3 |
BEGIN { $APP_PATH="/home/httpd/html/webmail/cgi-bin/"; } |
4 |
|
5 |
# @ ---------------------------------------------------------------------------------------------------------- |
6 |
# @ This code is (c) 1999 Alexandre Aufrere and NikoSoft. |
7 |
# @ Published under NPL rights, meaning you have the right |
8 |
# @ to use and modify this code freely, provided it |
9 |
# @ remains available and free. Any modified code should be |
10 |
# @ submitted to Nikopol Software Corp. or Alexandre Aufrere. |
11 |
# @ This code is protected by the French laws on Copyright. |
12 |
# @ Please note that there it comes with NO WARRANTY of any kind, |
13 |
# @ and especially for any damagbe it could cause to your computer |
14 |
# @ or network. |
15 |
# @ Using this code means you agree to this license agreement. |
16 |
# @ Further information at http://aufrere.citeweb.net/nsc/ |
17 |
# @ ---------------------------------------------------------------------------------------------------------- |
18 |
# @ |
19 |
# @ Project NS WebMail |
20 |
# @ |
21 |
# @ Filename send.pl |
22 |
# @ |
23 |
# @ Description sends mail using SMTP protocol. the mail sender |
24 |
# @ is authentified through POP, preventing this script |
25 |
# @ from beeing used for bomb mailing and so on. |
26 |
# @ |
27 |
# @ Version 1.0 |
28 |
# @ |
29 |
# @ ---------------------------------------------------------------------------------------------------------- |
30 |
|
31 |
use Socket; |
32 |
use Mail::POP3Client; |
33 |
require $APP_PATH."config.pl"; |
34 |
|
35 |
#obtain the FORM information that has been passed by using |
36 |
#the param() method of the cgi object. |
37 |
&ReadParse; |
38 |
$loginname = $in{'loginname'}; |
39 |
$password = $in{'password'}; |
40 |
$POPserver = $in{'POPserver'}; |
41 |
$sender = $in{'sender'}; |
42 |
$to = $in{'to'}; |
43 |
$cc = $in{'cc'}; |
44 |
$subject = $in{'subject'}; |
45 |
$message = $in{'message'}; |
46 |
$cache = $in{'cache'}; |
47 |
|
48 |
# POP connexion to authentify sender |
49 |
$pop = new Mail::POP3Client($loginname, $password, $POPserver); |
50 |
$MessageCount = $pop->Count; |
51 |
$pop->Close(); |
52 |
if ($MessageCount == -1) { |
53 |
print "<font size=+1>$POPserver: $loginname, $incorrectlogin"; |
54 |
exit; |
55 |
} |
56 |
|
57 |
# sending the mail using sendmail function |
58 |
# the apparently-from field is made using login and POP server, but the |
59 |
# from and reply-to fields are specified by the sender in the from field |
60 |
$status = sendmail($loginname."\@".$POPserver, $sender, $sender, $to, $cc, $SMTPserver, $subject, $message); |
61 |
$date=localtime(); |
62 |
|
63 |
#output the header to the client browser (DO NOT DELETE). |
64 |
#lack of this will result in an error 500. |
65 |
print "Content-type: text/html\n\n"; |
66 |
print "<HTML><HEAD><TITLE>NSWM - Message sent</TITLE>"; |
67 |
if ($cache eq "No") { print "<META HTTP-EQUIV='Pragma' CONTENT='no-cache'>"; } |
68 |
|
69 |
|
70 |
print "<SCRIPT LANGUAGE='JavaScript'>\n"; |
71 |
print "function closeThisWindow() { \n"; |
72 |
print "window.close()\n"; |
73 |
print "}\n"; |
74 |
print "</SCRIPT>\n"; |
75 |
|
76 |
print "</HEAD><BODY BGCOLOR='FFFFFF'>"; |
77 |
|
78 |
print "<FORM METHOD='POST' ACTION='".$CGI_PATH_NSWM."sendform.pl' name=newMailForm>\n"; |
79 |
print "<INPUT TYPE='hidden' NAME='loginname' VALUE=$loginname>\n"; |
80 |
print "<INPUT TYPE='hidden' NAME='password' VALUE=$password>\n"; |
81 |
print "<INPUT TYPE='hidden' NAME='POPserver' VALUE=$POPserver>\n"; |
82 |
print "<INPUT TYPE='hidden' NAME='cache' VALUE=$cache>\n"; |
83 |
print "<INPUT TYPE='hidden' NAME='to' VALUE=''>\n"; |
84 |
print "<INPUT TYPE='hidden' NAME='subject' VALUE=''>\n"; |
85 |
print "</FORM>"; |
86 |
|
87 |
print "<FORM METHOD='POST' ACTION='".$CGI_PATH_NSWM."sentmail.pl' name=sentForm>\n"; |
88 |
print "<INPUT TYPE='hidden' NAME='loginname' VALUE=$loginname>\n"; |
89 |
print "<INPUT TYPE='hidden' NAME='password' VALUE=$password>\n"; |
90 |
print "<INPUT TYPE='hidden' NAME='POPserver' VALUE=$POPserver>\n"; |
91 |
print "<INPUT TYPE='hidden' NAME='cache' VALUE=$cache>\n"; |
92 |
print "</FORM>"; |
93 |
|
94 |
print "<h3>"; |
95 |
|
96 |
if ($status == 1) { |
97 |
$logfilename=$LOG_PATH.$loginname."\@".$POPserver.".log"; |
98 |
print $messagesent; |
99 |
open (f, ">>$logfilename"); |
100 |
print f $date.";".$to.";".$subject."\n"; |
101 |
close (f); |
102 |
} |
103 |
elsif ($status == -1) {print " $smtp : $smtphostunkown";} |
104 |
elsif ($status == -2) {print $createsocketfailed;} |
105 |
elsif ($status == -3) {print $connectionfailed;} |
106 |
elsif ($status == -4) {print $servicena;} |
107 |
elsif ($status == -5) {print $commerror;} |
108 |
elsif ($status == -6) {print " $to ($smtp): $userunkown.";} |
109 |
elsif ($status == -7) {print " $transfailed.";} |
110 |
elsif ($status == -8) {print " $notofield";} |
111 |
else {print " $errorunkown.";} |
112 |
|
113 |
print "</h3><br>"; |
114 |
print "<FORM METHOD='POST' ACTION='".$CGI_PATH_NSWM."inbox.pl' name=inboxForm >\n"; |
115 |
print "<INPUT TYPE='SUBMIT' VALUE='OK' >\n"; |
116 |
print "<INPUT TYPE='hidden' NAME='loginname' VALUE=$loginname >\n"; |
117 |
print "<INPUT TYPE='hidden' NAME='password' VALUE=$password >\n"; |
118 |
print "<INPUT TYPE='hidden' NAME='POPserver' VALUE=$POPserver >\n"; |
119 |
print "<INPUT TYPE='hidden' NAME='cache' VALUE=$cache >\n"; |
120 |
|
121 |
print "</FORM>"; |
122 |
|
123 |
|
124 |
#send the ending html code (/body and /head tags) |
125 |
print "</BODY></HTML>"; |
126 |
exit; |
127 |
|
128 |
|
129 |
#-----------------------------SUBROUTINES------------------------ |
130 |
|
131 |
sub ReadParse { |
132 |
local(*in)=@_ if @_; |
133 |
local ($i,$key,$val); |
134 |
|
135 |
if ($ENV{'REQUEST_METHOD'} eq "GET") { |
136 |
$in=$ENV{'QUERY_STRING'}; |
137 |
} |
138 |
elsif ($ENV{'REQUEST_METHOD'} eq "POST") { |
139 |
read(STDIN,$in,$ENV{'CONTENT_LENGTH'}); |
140 |
} |
141 |
|
142 |
@in=split(/&/,$in); |
143 |
|
144 |
foreach $i (0 .. $#in) { |
145 |
$in[$i] =~ s/\+/ /g; |
146 |
($key,$val)=split(/=/,$in[$i],2); |
147 |
$key =~ s/%(..)/pack("c",hex($1))/ge; |
148 |
$val =~ s/%(..)/pack("c",hex($1))/ge; |
149 |
$in{$key} .= "\0" if (defined($in{$key})); |
150 |
$in{$key} .=$val; |
151 |
} |
152 |
return length($in); |
153 |
} |
154 |
|
155 |
|
156 |
#------------------------------------------------------------ |
157 |
# sub sendmail() |
158 |
# |
159 |
# send/fake email around the world ... |
160 |
# |
161 |
# Version : 1.21 |
162 |
# Environment: Hip Perl Build 105 NT 3.51 Server SP4 |
163 |
# Environment: Hip Perl Build 110 NT 4.00 |
164 |
# |
165 |
# arguments: |
166 |
# |
167 |
# $afrom apparently-from email address of sender |
168 |
# $from email address of sender |
169 |
# $reply email address for replying mails |
170 |
# $to email address of reciever |
171 |
# (multiple recievers can be given separated with space) |
172 |
# $smtp name of smtp server (name or IP) |
173 |
# $subject subject line |
174 |
# $message (multiline) message |
175 |
# |
176 |
# return codes: |
177 |
# |
178 |
# 1 success |
179 |
# -1 $smtphost unknown |
180 |
# -2 socket() failed |
181 |
# -3 connect() failed |
182 |
# -4 service not available |
183 |
# -5 unspecified communication error |
184 |
# -6 local user $to unknown on host $smtp |
185 |
# -7 transmission of message failed |
186 |
# -8 argument $to empty |
187 |
# |
188 |
# usage examples: |
189 |
# |
190 |
# print |
191 |
# sendmail("Alice <alice\@company.com>", |
192 |
# "alice\@company.com", |
193 |
# "joe\@agency.com charlie\@agency.com", |
194 |
# $smtp, $subject, $message ); |
195 |
# |
196 |
# or |
197 |
# |
198 |
# print |
199 |
# sendmail($from, $reply, $to, $smtp, $subject, $message ); |
200 |
# |
201 |
# (sub changes $_) |
202 |
# |
203 |
#------------------------------------------------------------ |
204 |
|
205 |
################################################################ |
206 |
### sendmail ################################################### |
207 |
################################################################ |
208 |
sub sendmail { |
209 |
|
210 |
my ($afrom,$from, $reply, $to, $cc, $smtp, $subject, $message) = @_; |
211 |
|
212 |
$date=localtime(); |
213 |
|
214 |
my $fromaddr = $from; chomp $fromaddr; chomp $from; |
215 |
my $replyaddr = $reply; chomp $replyaddr; |
216 |
|
217 |
$to =~ s/[ \t]+/, /g; # pack spaces and add comma |
218 |
$cc =~ s/[ \t]+/, /g; # pack spaces and add comma |
219 |
$fromaddr =~ s/.*<([^\s]*?)>/$1/; # get from email address |
220 |
$replyaddr =~ s/.*<([^\s]*?)>/$1/; # get reply email address |
221 |
$replyaddr =~ s/^([^\s]+).*/$1/; # use first address |
222 |
$message =~ s/^\./\.\./gm; # handle . as first character |
223 |
$message =~ s/\r\n/\n/g; # handle line ending |
224 |
$message =~ s/\n/\r\n/g; |
225 |
$smtp =~ s/^\s+//g; # remove spaces around $smtp |
226 |
$smtp =~ s/\s+$//g; |
227 |
|
228 |
if (!$to) { return -8; } |
229 |
|
230 |
my($proto) = (getprotobyname('tcp'))[2]; |
231 |
my($port) = (getservbyname('smtp', 'tcp'))[2]; |
232 |
|
233 |
my($smtpaddr) = ($smtp =~ |
234 |
/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/) |
235 |
? pack('C4',$1,$2,$3,$4) |
236 |
: (gethostbyname($smtp))[4]; |
237 |
|
238 |
if (!defined($smtpaddr)) { return -1; } |
239 |
|
240 |
if (!socket(S, AF_INET, SOCK_STREAM, $proto)) { return -2; } |
241 |
if (!connect(S, pack('Sna4x8', AF_INET, $port, $smtpaddr))) { return -3; } |
242 |
|
243 |
my($oldfh) = select(S); $| = 1; select($oldfh); |
244 |
|
245 |
$_ = <S>; if (/^[45]/) { close S; return -4; } |
246 |
|
247 |
print S "helo localhost\r\n"; |
248 |
$_ = <S>; if (/^[45]/) { close S; return -5; } |
249 |
|
250 |
print S "mail from: <$fromaddr>\r\n"; |
251 |
$_ = <S>; if (/^[45]/) { close S; return -5; } |
252 |
|
253 |
foreach (split(/, */, $to)) { |
254 |
chomp; |
255 |
print S "rcpt to: <$_>\r\n"; |
256 |
$_ = <S>; if (/^[45]/) { close S; return -6; } |
257 |
} |
258 |
foreach (split(/, */, $cc)) { |
259 |
chomp; |
260 |
print S "rcpt to: <$_>\r\n"; |
261 |
$_ = <S>; if (/^[45]/) { close S; return -6; } |
262 |
} |
263 |
print S "data\r\n"; |
264 |
$_ = <S>; if (/^[45]/) { close S; return -5; } |
265 |
|
266 |
print S "To: $to\r\n"; |
267 |
if ($cc ne "") { print S "CC: $cc\r\n"; } |
268 |
print S "From: $from\r\n"; |
269 |
print S "Reply-to: $replyaddr\r\n" if $replyaddr; |
270 |
print S "Apparently-from: $afrom\r\n"; |
271 |
print S "X-Mailer: NikoSoft WebMail Perl from Alexandre Aufrere\r\n"; |
272 |
print S "Date: $date\r\n"; |
273 |
print S "Subject: $subject\r\n\r\n"; |
274 |
print S "$message"; |
275 |
print S "\r\n.\r\n"; |
276 |
|
277 |
$_ = <S>; if (/^[45]/) { close S; return -7; } |
278 |
|
279 |
print S "quit\r\n"; |
280 |
$_ = <S>; |
281 |
|
282 |
close S; |
283 |
return 1; |
284 |
} |