Advertisement
Guest User

jabber

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