############################################################################### # MailMembers.pm # # $Date: 01 Sep 2026 $ # ############################################################################### # YaBB: Yet another Bulletin Board # # Open-Source Community Software for Webmasters # # Version: YaBBForum 3.2 # # Packaged: 01 Sep 2026 # # Distributed by: https://yabbforum.nz # # =========================================================================== # # Copyright (c) 2000-2026 YaBB (yabbforum.nz) - All Rights Reserved. # # Software by: The YaBB Development Team # # with assistance from the YaBB community. # ############################################################################### use CGI::Carp qw(fatalsToBrowser); our $VERSION = '3.2'; $mailmemberspmver = 'YaBBForum 3.2'; if ( $action eq 'detailedversion' ) { return 1; } if ($iamguest) { fatal_error('no_access'); } LoadLanguage('Main'); LoadLanguage('MemberList'); $reused = 0; sub Mailing { if ($iamguest) { fatal_error('no_access'); } $yymain .= qq~
$admin_img{'register'} $admintxt{'19'}
~; my $grpselect; my $groupcnt = 0; foreach ( sort { $a cmp $b } keys %Group ) { if ( $_ ne 'Moderator' ) { ( $title, $dummy ) = split /\|/xsm, $Group{$_}, 2; $grpselect .= qq~\n~; $groupcnt++; } } foreach (@nopostorder) { ( $title, $dummy ) = split /\|/xsm, $NoPost{$_}, 2; $grpselect .= qq~\n~; $groupcnt++; } foreach ( reverse sort { $a <=> $b } keys %Post ) { ( $title, $dummy ) = split /\|/xsm, $Post{$_}, 2; $grpselect .= qq~\n~; $groupcnt++; } if ( $groupcnt > 12 ) { $groupcnt = 12; } $yymain .= qq~
~; if ( $groupcnt != 0 ) { $yymain .= qq~
$amv_txt{'39'}
$amv_txt{'49'}:
$amv_txt{'47'}:
~; if ( -e "$vardir/yabbaddress.csv" ) { $yymain .= qq~~; } $yymain .= q~
$amv_txt{'50'}
~; if ( -e ("$vardir/maillist.dat") ) { fopen( FILE, "$vardir/maillist.dat" ); @maillist = ; fclose(FILE); $yymain .= q~ ~; foreach my $curmail (@maillist) { chomp $curmail; ( $otime, $osubject, $otext, $osender ) = split /\|/xsm, $curmail; LoadUser($osender); $thetime = timeformat($otime); $jsubject = $osubject; $jtext = $otext; ToJS($jsubject); ToJS($jtext); $yymain .= qq~~; } $yymain .= q~
$thetime
${$uid.$osender}{'realname'}
$osubject del
 
~; } $yymain .= qq~
 
~; } $yytitle = $admin_txt{'6'}; $action_area = 'mailing'; AdminTemplate(); return; } sub Mailing2 { if ($iamguest) { fatal_error('no_access'); } if ( !$FORM{'mailsend'} && !$FORM{'convert'} ) { fatal_error('no_access'); } @convlist = (); if ( $FORM{'mailsend'} && $FORM{'emailtext'} ne q{} ) { $FORM{'emailsubject'} =~ s/\|/&\x23124;/gsm; $FORM{'emailtext'} =~ s/\|/&\x23124;/gsm; $FORM{'emailtext'} =~ s/\r//gsm; $mailline = qq~$date|$FORM{'emailsubject'}|$FORM{'emailtext'}|$username~; MailList($mailline); } (@mailgroups) = split /\, /sm, $FORM{'field1'}; ManageMemberinfo('load'); $i = 0; my ( $emailsubject, $emailtext ); foreach my $user ( keys %memberinf ) { ( $memrealname, $mememail, $memposition, $memposts, $memaddgrp ) = split /\|/xsm, $memberinf{$user}; FromHTML($memrealname); if ( $FORM{'mailsend'} && $FORM{'emailtext'} ne q{} ) { $emailsubject = $FORM{'emailsubject'}; $emailsubject =~ s/\[name\]/$memrealname/igxsm; $emailsubject =~ s/\[username\]/$user/igxsm; $emailtext = $FORM{'emailtext'}; $emailtext =~ s/\[name\]/$memrealname/igxsm; $emailtext =~ s/\[username\]/$user/igxsm; } $mailit = 0; foreach my $element (@mailgroups) { chomp $element; if ( $element eq $memposition ) { $mailit = 1; } foreach my $memberaddgroups ( split /, /sm, $memaddgrp ) { chomp $memberaddgroups; if ( $element eq $memberaddgroups ) { $mailit = 1; last; } } if ($mailit) { last; } } if ( $mailit && $FORM{'mailsend'} ) { require Sources::Mailer; sendmail( $mememail, $emailsubject, $emailtext ); } elsif ( $mailit && $FORM{'convert'} ) { if ( $memrealname =~ /&\x23(\d{3,}?)\;/igxsm ) { $memrealname = $user; } $convlist[$i] = qq~$memrealname\;$mememail\n~; $i++; } } undef %memberinf; if (@convlist) { fopen( ADDRESSLIST, ">$vardir/yabbaddress.csv", 1 ); print {ADDRESSLIST} "Name\;E-mail Address\n" or croak "$croak{'print'} ADDRESSLIST"; print {ADDRESSLIST} @convlist or croak "$croak{'print'} ADDRESSLIST"; fclose(ADDRESSLIST); } elsif ( $FORM{'convert'} ) { unlink "$vardir/yabbaddress.csv"; } $yySetLocation = qq~$adminurl?action=mailing~; redirectexit(); return; } sub Mailing3 { fopen( FILE, "$vardir/yabbaddress.csv" ); @addlist = ; fclose(FILE); print qq~Content-disposition: inline; filename=yabbaddress.csv\n\n~ or croak "$croak{'print'} yabbaddress"; foreach my $curadd (@addlist) { chomp $curadd; print qq~$curadd\n~ or croak "$croak{'print'} yabbaddress"; } return; } sub MailingMembers { $sortmode = q{}; $selPos = q{}; $selUser = q{}; if ( $FORM{'sortform'} eq 'position' ) { $selPos = q~ selected="selected"~; } else { $selUser = q~ selected="selected"~; } if ( $INFO{'sort'} ne q{} ) { $sortmode = ';sort=' . $INFO{'sort'}; } elsif ( $FORM{'sortform'} ne q{} ) { $sortmode = ';sort=' . $FORM{'sortform'}; } if ($iamguest) { fatal_error('no_access'); } $yymain .= qq~
$admin_img{'register'} $admintxt{'19'}
 
~; %TopMembers = (); ManageMemberinfo('load'); while ( ( $membername, $value ) = each %memberinf ) { ( $memberrealname, undef, $memposition, $memposts ) = split /\|/xsm, $value; $pstsort = 99_999_999 - $memposts; $sortgroups = q{}; $j = 0; if ( $membername eq $username ) { $sortgroups = '!!!'; } else { if ( $FORM{'sortform'} eq 'position' || $INFO{'sort'} eq 'position' ) { foreach my $key ( keys %Group ) { if ( $memposition eq $key ) { if ( $key eq 'Administrator' ) { $sortgroups = "aaa.$pstsort.$memberrealname"; } elsif ( $key eq 'Global Moderator' ) { $sortgroups = "bbb.$pstsort.$memberrealname"; } elsif ( $key eq 'Mid Moderator' ) { $sortgroups = "bcc.$pstsort.$memberrealname"; } } } if ( !$sortgroups ) { foreach ( sort { $a <=> $b } keys %NoPost ) { if ( $memposition eq $_ ) { $sortgroups = "ddd.$memposition.$pstsort.$memberrealname"; } } } if ( !$sortgroups ) { $sortgroups = "eee.$pstsort.$memposition.$memberrealname"; } } else { $sortgroups = $memberrealname; } } $TopMembers{$membername} = $sortgroups; } my @toplist = sort { lc $TopMembers{$a} cmp lc $TopMembers{$b} } keys %TopMembers; $memcount = @toplist; $bb = 0; $numshown = 0; $actualnum = 0; while ( ( $numshown < $memcount ) ) { $user = $toplist[$bb]; ( $memrealname, $mememail, $memposition, $memposts ) = split /\|/xsm, $memberinf{$user}; if ( $user eq $username ) { $bagcolor = 'windowbg2'; } else { $bagcolor = 'windowbg'; } if ( $memrealname ne q{} ) { $addel = qq~~; $actualnum++; my $memberinfo = "$memposition"; if ( $memberinfo eq 'Administrator' ) { ( $memberinfo, undef ) = split /\|/xsm, $Group{'Administrator'}, 2; } elsif ( $memberinfo eq 'Global Moderator' ) { ( $memberinfo, undef ) = split /\|/xsm, $Group{'Global Moderator'}, 2; } elsif ( $memberinfo eq 'Mid Moderator' ) { ( $memberinfo, undef ) = split /\|/xsm, $Group{'Mid Moderator'}, 2; } else { foreach my $key ( sort { $a <=> $b } keys %NoPost ) { if ( $key eq $memberinfo ) { ( $memberinfo, undef ) = split /\|/xsm, $NoPost{$key}, 2; } } } $viewmembinfo = $memberinfo; ToJS($memberinfo); $tmp_postcount = $memposts; $checkinfo = $memberinfo; $checkinfo =~ s/\, /\'\|\'/gsm; $CheckingAll .= qq~"'$checkinfo'", ~; if ($do_scramble_id) { $cloakusername = cloak($user); } else { $cloakusername = $user; } ToChars($memrealname); $linkuser = qq~$memrealname~; $yymain .= qq~~; } $numshown++; $bb++; } undef @toplist; undef %memberinf; $yymain .= q~
$addel $linkuser - $viewmembinfo
~; if ( $memcount != 0 ) { if ( $FORM{'sortform'} eq q{} ) { $FORM{'sortform'} = $INFO{'sort'}; } if ( !$FORM{'reversed'} ) { $FORM{'reversed'} = $INFO{'reversed'}; } @groupinfo = (); $i = 0; $z = 0; ( $title, $dummy ) = split /\|/xsm, $Group{'Administrator'}, 2; ToJS($title); $groupinfo[$i] = $title; $i++; $grp_data = qq~"'$title'", ~; ( $title, $dummy ) = split /\|/xsm, $Group{'Global Moderator'}, 2; ToJS($title); $groupinfo[$i] = $title; $i++; $grp_data .= qq~"'$title'", ~; ( $title, $dummy ) = split /\|/xsm, $Group{'Mid Moderator'}, 2; ToJS($title); $groupinfo[$i] = $title; $i++; $grp_data .= qq~"'$title'", ~; foreach (@nopostorder) { ( $title, $dummy ) = split /\|/xsm, $NoPost{$_}, 2; ToJS($title); $groupinfo[$i] = $title; $grp_data .= qq~"'$title'", ~; $i++; $z++; } $groupcnt = $i; $grp_data .= q~""~; $yymain .= qq~
$amv_txt{'39'}

$amv_txt{'47'}:
~; if ( -e ("$vardir/maillist.dat") ) { fopen( FILE, "$vardir/maillist.dat" ); @maillist = ; fclose(FILE); $yymain .= q~ ~; foreach my $curmail (@maillist) { chomp $curmail; ( $otime, $osubject, $otext, $osender ) = split /\|/xsm, $curmail; LoadUser($osender); $thetime = timeformat($otime); $jsubject = $osubject; $jtext = $otext; ToJS($jsubject); ToJS($jtext); $yymain .= qq~~; } $yymain .= q~
$thetime
${$uid.$osender}{'realname'}
$osubject del
 
~; } $yymain .= qq~
 
~; } $yytitle = "$admin_txt{'6'}"; $action_area = 'mailing'; AdminTemplate(); return; } sub ToJS { $_[0] =~ s/;/&\x23059;/gsm; $_[0] =~ s/\!/&\x2333;/gsm; $_[0] =~ s/\(/&\x2340;/gsm; $_[0] =~ s/\)/&\x2341;/gsm; $_[0] =~ s/\-/&\x2345;/gsm; $_[0] =~ s/\./&\x2346;/gsm; $_[0] =~ s/\:/&\x2358;/gsm; $_[0] =~ s/\?/&\x2363;/gsm; $_[0] =~ s/\[/&\x2391;/gsm; $_[0] =~ s~\\~&\x2392;&\x2392;~gsm; $_[0] =~ s/\]/&\x2393;/gsm; $_[0] =~ s/\^/&\x2394;/gsm; $_[0] =~ s/\x22/&\x2334;/gsm; $_[0] =~ s/\x27/&\x2396;/gsm; $_[0] =~ s/\/&\x2362;/gsm; } 1;