Advertisement
Guest User

jabber

a guest
Jun 3rd, 2016
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.33 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. use File::Find;
  7. use MIME::Parser;
  8. use MIME::Words qw(decode_mimewords);
  9. use HTML::Entities;
  10. use Net::XMPP;
  11. use Encode 'from_to';
  12.  
  13. # location to look up mails
  14. #my $maildir = '/var/mail';
  15. #my $maildir = '/home/vmail/town.lg.ua';
  16. my $maildir = '/home/vmail';
  17. # file to cache seen mails
  18. my $seenFile = '/var/cache/mailnotify/mailnotified';
  19. # which directories will be ignored?
  20. my $ignorepattern = qr/^.*\.(junk|spam|trash|sent|draft)$/i;
  21.  
  22. # Jabber account data
  23. my $user = 'USER';
  24. my $server = 'SERVER';
  25. my $pass = 'PASSWORD';
  26. my $tls = 1; # use tls?
  27.  
  28. my %users = (
  29. 'user1@domain' => 'user1@server',
  30.  
  31. );
  32.  
  33. my %mails;
  34. my @notified;
  35.  
  36. sub findMails() {
  37. return find({
  38. wanted => \&wanted,
  39. follow => 0,
  40. no_chdir => 1,
  41. }, $maildir);
  42. }
  43.  
  44. sub wanted() {
  45. return unless -d _;
  46. # return unless m#$maildir/([^/]+)/([^/]+)/Maildir/(?:([^/]+)/)?new/(.*)$#;
  47. # return unless m#$maildir/([^/]+)/([^/]+?:([^/]+)/)?inbox/(.*)$#;
  48. # return unless m#$maildir/inbox;
  49. # return unless m#$maildir/town.lg.ua/inbox/(.*)$#;
  50. # return unless m#$maildir/([^/]+)/(?:([^/]+)/)?inbox$#;
  51. return unless m#$maildir/([^/]+)/(?:([^/]+)/)?new/(.*)$#;
  52. my $user = "$2\@$1";
  53. my $box = defined $3 ? $3 : 'inbox';
  54. my $mail = $4;
  55. return if $box =~ /$ignorepattern/;
  56. return unless exists $users{$user};
  57. my $jabber = $users{$user};
  58. $mails{$jabber} = [] unless $mails{$jabber};
  59. push @{$mails{$jabber}}, $_;
  60. }
  61.  
  62. sub readMail($) {
  63. my ($file) = @_;
  64. my $parser = new MIME::Parser;
  65. $parser->tmp_to_core(1);
  66. $parser->use_inner_files(1);
  67. $parser->output_to_core(1);
  68. return $parser->parse_open($file);
  69. }
  70.  
  71. sub stripHtml($) {
  72. my ($html) = @_;
  73. $html =~ s/<[^>]+>//g;
  74. $html = decode_entities($html);
  75. return $html;
  76. }
  77.  
  78. sub getText($) {
  79. my ($mail) = @_;
  80. my $parts_num = $mail->parts;
  81. my $message = '';
  82. return join('', @{$mail->body}) if $parts_num == 0;
  83. for (0 .. $parts_num - 1) {
  84. my $part = $mail->parts($_);
  85. my $mimetype = $part->mime_type;
  86. if ($mimetype eq 'text/plain') {
  87. return $part->body_as_string;
  88. } elsif($mimetype eq 'text/html') {
  89. $message = $part->body_as_string;
  90. $message = stripHtml($message);
  91. } elsif($mimetype eq 'application/pgp-encrypted' and $message eq '') {
  92. $message = "(content is encrypted)";
  93. }
  94. }
  95. return $message;
  96. }
  97.  
  98. sub mailToString($) {
  99. my ($mail) = @_;
  100.  
  101. my $head = $mail->head;
  102. $head->unfold;
  103. $head->decode;
  104. my $msg = '';
  105. $msg .= "You have mail from: " . ($head->get("From") || '(unset)');
  106. # $msg .= "From: " . ($head->get("From") || '(unset)');
  107. # $msg .= "Subject: " . ($head->get("Subject") || '(unsert)');
  108. from_to($msg, 'koi8-r', 'cp1251');
  109. $msg .= "\n";
  110.  
  111. my $text = getText($mail);
  112.  
  113. if (length $text > 128) {
  114. $text = substr($text, 0, 125) . "...";
  115. }
  116. # $msg .= $text;
  117. return $msg;
  118. }
  119.  
  120. sub sendNotifications($%) {
  121. my ($jabber, %mails) = @_;
  122. for my $jid (keys %mails) {
  123. for my $mailfile (@{$mails{$jid}}) {
  124. my $mail = readMail($mailfile);
  125. $mail = mailToString($mail) . "\n";
  126. sendNotification($jabber, $jid, $mail);
  127. }
  128. }
  129. }
  130.  
  131. sub connectToJabber() {
  132. my $jabber = Net::XMPP::Client->new();
  133. $jabber->Connect(
  134. hostname => $server,
  135. tls => $tls
  136. ) or die("Cannot connect to server: " . $jabber->GetErrorCode . "\n");
  137. my @result = $jabber->AuthSend(
  138. hostname => $server,
  139. username => $user,
  140. password => $pass,
  141. resource => $0);
  142. die "Auth as $user\@$server/$0 failed: $result[1]\n" unless @result && $result[0] eq 'ok';
  143. $jabber->PresenceSend(type => 'unavailable');
  144. return $jabber;
  145. }
  146.  
  147. sub sendNotification($$$) {
  148. my ($jabber, $jid, $message) = @_;
  149. $jabber->MessageSend(
  150. to => $jid,
  151. body => $message);
  152. }
  153.  
  154. sub disconnectFromJabber($) {
  155. my ($jabber) = @_;
  156. $jabber->Disconnect();
  157. }
  158.  
  159. sub loadSeenFiles() {
  160. open(my $fh, $seenFile) or return ();
  161. chomp(my @result = <$fh>);
  162. close $fh;
  163. return @result;
  164. }
  165.  
  166. sub saveSeen(@) {
  167. open(my $fh, '>', $seenFile) or die "Could not save file: $!";
  168. for(@_) {
  169. print $fh "$_\n";
  170. }
  171. close $fh;
  172. }
  173.  
  174. sub removeAlreadySeen(\@\%) {
  175. my ($seen, $mails) = @_;
  176.  
  177. for my $account (keys %{$mails}) {
  178. for(my $mail = 0; $mail < @{$mails->{$account}}; ++$mail) {
  179. my $file = $mails->{$account}->[$mail];
  180. if (grep $file eq $_, @{$seen}) {
  181. splice @{$mails->{$account}}, $mail, 1;
  182. --$mail;
  183. }
  184. }
  185. if(@{$mails->{$account}} == 0) {
  186. delete $mails->{$account};
  187. }
  188. }
  189. }
  190.  
  191. sub cleanupSeen(\@) {
  192. my ($seen) = @_;
  193. for (my $i = 0; $i < @{$seen}; ++$i) {
  194. if($seen->[$i] eq '' || ! -f $seen->[$i]) {
  195. splice @{$seen}, $i, 1;
  196. --$i;
  197. }
  198. }
  199. }
  200.  
  201. sub addNewSeen(\@\%) {
  202. my ($seen, $mails) = @_;
  203.  
  204. for my $account (keys %{mails}) {
  205. for my $mail (@{$mails->{$account}}) {
  206. push @{$seen}, $mail;
  207. }
  208. }
  209. }
  210.  
  211. findMails();
  212. my @seen = loadSeenFiles();
  213. cleanupSeen(@seen);
  214. removeAlreadySeen(@seen, %mails);
  215. addNewSeen(@seen, %mails);
  216. saveSeen(@seen);
  217.  
  218. exit 0 unless (%mails);
  219.  
  220. my $jabber = connectToJabber();
  221. sendNotifications($jabber, %mails);
  222. disconnectFromJabber($jabber);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement