From: Blake C. <li...@li...> - 2003-10-10 18:47:09
|
Hi All, Since this is the first time I've used PERL/Slashcode to write anything more than a few lines, I was looking for some feedback on this script. Essentially it reads from a file of email addresses (I have several thousand from an old list) and creates a user based on the (us...@do...) user name/email address. It logs the mistakes to a couple files What I am most worried about is: 1. Some people may have their email address in this list, and also have signed up a slash user account with that same email 2. 2 people may have the same user@ part of their emails, though at different domains. 3. Someone already has an account that is the same as someones email name 3. This script will screw up and give someone more than one account or something goofy like that. Since I'm rather new to perl & slashcode, I assume this is rather ugly, and probably could be streamlined, but since it's a one time thing, I just want the sucker to work, and not cause me any big headaches when I run it on a big list of emails. So anywho... here it is. I've tested it with some fake emails, and it seems to work ok, but I'm hoping someone might see something obviously dumb that I've missed. Many thanks! #!/usr/bin/perl -w use strict; use Digest::MD5 'md5_hex'; use Slash::Display; use strict; use File::Basename; use Getopt::Std; use Slash; use Slash::Utility; use Benchmark; use Slash::Messages; use Slash::Constants qw(:messages); use vars qw( $slashdb $werder $constants $junk ); use Data::Dumper; my $slashdb = getCurrentDB(); my $form = getCurrentForm(); my $user = getCurrentUser(); my $title; my %opts; my $line; my $name; my $domain; my $email; my $username; my $old_uid; my $sth; my $exs_user; my $cur_uid; my $exs; $opts{'u'} ||= 'slash'; createEnvironment($opts{u}); $slashdb = getCurrentDB(); $constants = getCurrentStatic(); open(LIST, "email_list") or die "cant do it!"; while (chomp($line = <LIST>)) { ($name, $domain) = split("\@", $line); $username = $name; $email = $name."@".$domain; $username = nickFix($username); my $matchname = nick2matchname($username); $exs_user = $slashdb->sqlSelectHashref("uid as cur_uid", "users", "nickname=" . $slashdb->sqlQuote($matchname) ); if($exs_user) { print "\n$username exsists\n\n"; open (UUSER, ">>usernames_exsist") or die; print UUSER "$username -- $email\n"; close (UUSER); } else { my $exx_email = $slashdb->existsEmail($email); if (defined($exx_email)) { print "\nemail exists! - $email\n"; print "\n$username exsists\n\n"; open (EMAILZ, ">>emails_exsist") or die; print EMAILZ "$username -- $email\n"; close (EMAILZ); } else { my $uid = $slashdb->createUser($matchname, $email, $username); if($uid) { print "\nNew user: $username (User #$uid) ($email)\n"; use Slash::Constants qw(:messages); my $messages = getObject('Slash::Messages'); my %params; $params{MSG_CODE_NEWSLETTER()} = MSG_MODE_EMAIL(); $messages->setPrefs($uid, \%params); mailPasswd($uid, $username, $email); } } } } ### subroutines ### sub mailPasswd { my $slashdb = getCurrentDB(); my $form = getCurrentForm(); my $hr = @_; my $username = $_[1]; my $uid = $_[0]; my $user_edit; my $user = getCurrentUser(); my $messages = getObject('Slash::Messages'); my $newpasswd = $slashdb->getNewPasswd($uid); my $tempnick = fixparam($user_edit->{nickname}); my $remote_ip = " "; my $xff = " "; my $ua = " "; my $addr = $email; my $content = "Greetings,\n You now have an account at LISNews.com. Hopefully this does not come as a suprise!\n"; $content .= "Your username is: $username.\n The password for this account is: $newpasswd.\n And in case you care, you're user #$uid"; my $subject = "Your New LISNews Account Details"; BlakEmail($addr, $subject, $content); } sub BlakEmail { use Mail::Sendmail; $Mail::Sendmail::mailcfg{mime} = 0; my($addr, $subject, $content) = @_; my $constants = getCurrentStatic(); my %data = ( From=> $constants->{mailfrom}, Smtp=> $constants->{smtp_server}, Subject=> $subject, Message=> $content, To=> $addr, # put in vars ... ? 'Content-type'=> 'text/plain; charset="us-ascii"', 'Content-transfer-encoding'=> '8bit', ); my $mail_sent; { local $^W; # sendmail() should't warn to STDERR $mail_sent = sendmail(%data); } } |
From: George C. <ga...@sp...> - 2003-10-11 03:09:55
|
** Reply to message from "Blake Carver" <li...@li...> on Fri, 10 Oct 2003 13:44:05 -0500 Hi Blake, A Slash or Perl expert, I'm most certainly not. However I've been trying your bulk load script and it looks good. I was asking about this a while ago and Shane was very helpful. I've made a couple of tweaks, with a few more to go: My email addresses will be coming from mailman, and I have a lot of fullnames set, so I need to set the realname field and change the parsing just a bit. I added the following to parse apart the field in the format of: Real Name <em...@do...> my $re1 = '(.*)<(.*)@(.*)>'; $_ = $line; if (/$re1/io) {$realname = $1; $name = $2; $domain = $3} Then, after the createUser is issued, $slashdb->setUser($uid, { realname => $realname }); to set the real name. I'll most likely add some things to change the default number of stories to be displayed, the default comment display mode, etc. But that's for another time. The new parsing is not all that right yet. Right now it will try to re-add the prior user when it hits a blank line. So I need to restructure that just a bit. George |