Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

195 lines
5.5 KiB

  1. # Filename: sendmsg.pl
  2. #
  3. # Have any changes to this file reviewed by DavePr, BryanT, or WadeLa
  4. # before checking in.
  5. # Any changes need to verified in all standard build/rebuild scenarios.
  6. #
  7. # routine for sending message at microsoft via SMTP
  8. #
  9. # to use specify
  10. # BEGIN {
  11. # require $ENV{'sdxroot'} . '\TOOLS\sendmail.pl';
  12. # }
  13. # or
  14. # BEGIN {
  15. # push @INC, $ENV{'sdxroot'} . '\TOOLS';
  16. # require 'sendmail.pl';
  17. # }
  18. #
  19. use Socket;
  20. #
  21. # sendmsg [-v,] sender, subject, message, recipient [, recipient ...]
  22. #
  23. # uses SMTP port connection to send a mail message
  24. # optional -v will provide verbosity on unexpected output from the SMTP server
  25. # returns 1 on failure, 0 on success
  26. #
  27. # A recipient of the form "replyto:alias" sets the Reply-To field to be the
  28. # specified alias rather than the default of "noone".
  29. #
  30. # A recipient of the form "cc:alias" will be placed on the CC line instead of
  31. # the To line.
  32. #
  33. # A recipient of the form "content:..." will set the message's content type.
  34. # E.g., "content:text/html", if you want your message to be intrepreted as HTML.
  35. sub sendmsg {
  36. my @SmtpServers = ("red-imc-01", "red-imc-02", "red-imc-03", "smarthost");
  37. for (@SmtpServers) {
  38. $rc = sendmsg2 ($_, @_);
  39. last if !$rc;
  40. } continue {
  41. print "WARNING: Connection to $_ failed. Will try another SMTP server\n";
  42. }
  43. if ($rc) {
  44. print "WARNING: MAIL NOT SENT: All SMTP servers failed\n";
  45. return 1
  46. }
  47. return 0;
  48. }
  49. sub sendmsg2 {
  50. my $Company = '@Microsoft.com';
  51. my $SmtpPort = 25;
  52. my $SmtpServer = shift;
  53. my $verbose = shift if $_[0] =~ /^-v$/i;
  54. my $NotAtMicrosoft = shift if $_[0] =~ /^-m$/i;
  55. my $sender = shift;
  56. my $subject = shift;
  57. my $msg = shift;
  58. my @rcpts = @_;
  59. my $replyto = 'noone';
  60. my $rcptlist;
  61. my $cclist;
  62. my $ct = "";
  63. my $iaddr;
  64. my $paddr;
  65. my $proto = getprotobyname('tcp');
  66. my $r;
  67. my $to;
  68. socket(SOCK, PF_INET, SOCK_STREAM, $proto) or return 1;
  69. {
  70. #
  71. # hardwired to Pacific Time
  72. # format: Date: Thu, 13 Jan 2000 15:55:25 -0800
  73. #
  74. ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
  75. $datestamp = sprintf "%3s, %2d %3s %4d %02d:%02d:%02d -0%1d00",
  76. (Sun, Mon, Tue, Wed, Thu, Fri, Sat)[$wday],
  77. $mday,
  78. (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)[$mon],
  79. 1900+$year,
  80. $hour, $min, $sec, 8 - $isdst;
  81. #
  82. # Get a connection to the SMTP server
  83. #
  84. $iaddr = inet_aton($SmtpServer);
  85. $paddr = sockaddr_in($SmtpPort, $iaddr);
  86. $rc = connect(SOCK, $paddr);
  87. last if !$rc;
  88. $r = <SOCK>;
  89. print $r if $verbose;
  90. send SOCK, "HELO\r\n", 0 or last;
  91. $r = <SOCK>;
  92. print $r if $verbose;
  93. last if $r !~ /^250 /i;
  94. if ($NotAtMicrosoft) {
  95. send SOCK, "MAIL From: <$sender>\r\n", 0 or last;
  96. } else {
  97. send SOCK, "MAIL From: <$sender$Company>\r\n", 0 or last;
  98. }
  99. $r = <SOCK>;
  100. print $r if $verbose;
  101. last if $r !~ /^250 /i;
  102. $rcptlist = "";
  103. $cclist = "";
  104. for (@rcpts) {
  105. if ($NotAtMicrosoft || /^content:/) {
  106. $to = $_;
  107. } else {
  108. $to = $_ . $Company;
  109. }
  110. if ($to =~ s/^replyto://i) {
  111. $replyto = $to;
  112. } elsif ($to =~ s/^content://i) {
  113. $ct = $to;
  114. } else {
  115. if ($to =~ s/^cc://i) {
  116. $cclist = "$cclist $to,";
  117. } else {
  118. $rcptlist = "$rcptlist $to,";
  119. }
  120. send SOCK, "RCPT To: <$to>\r\n", 0 or last;
  121. $r = <SOCK>;
  122. print $r if $verbose;
  123. last if $r !~ /^250 /i;
  124. }
  125. }
  126. chop $rcptlist; # remove trailing ','
  127. chop $cclist; # remove trailing ','
  128. send SOCK, "DATA\r\n", 0 or last;
  129. $r = <SOCK>;
  130. print $r if $verbose;
  131. last if $r !~ /^354 /i;
  132. if ($NotAtMicrosoft) {
  133. send SOCK, "From: $sender\r\n", 0 or last;
  134. } else {
  135. send SOCK, "From: $sender$Company\r\n", 0 or last;
  136. }
  137. send SOCK, "To:$rcptlist\r\n", 0 or last;
  138. send SOCK, "Cc:$cclist\r\n", 0 or last if $cclist;
  139. # send SOCK, "Bcc:\r\n", 0 or last;
  140. send SOCK, "Subject: $subject\r\n", 0 or last;
  141. send SOCK, "Date: $datestamp\r\n", 0 or last;
  142. send SOCK, "Content-Type: $ct\r\n", 0 or last if $ct;
  143. send SOCK, "Reply-To: $replyto\r\n", 0 or last;
  144. send SOCK, "Importance: High\r\n", 0 or last if $subject =~ /failed/i;
  145. send SOCK, "\r\n", 0 or last;
  146. send SOCK, "$msg", 0 or last;
  147. send SOCK, "\r\n.\r\n", 0 or last;
  148. $r = <SOCK>;
  149. print $r if $verbose;
  150. last if $r !~ /^250 /i;
  151. send SOCK, "QUIT\r\n", 0 or last;
  152. } continue {
  153. #
  154. # Success return
  155. #
  156. close(SOCK);
  157. return 0;
  158. }
  159. #
  160. # Error return (last)
  161. #
  162. close(SOCK);
  163. return 1;
  164. }
  165. #
  166. # return true to our caller
  167. #
  168. return 1;