Thread mails verschicken an mehrere Personen (5 answers)
Opened by vayu at 2007-02-28 16:09

havi
 2007-03-02 11:31
#74687 #74687
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Hab mir vor einiger Zeit mal etwas selbst dafuer geschrieben - funktioniert aber nur fuer/mit MS-Outlook.

Bei meinen Skript gibt es 4 Eingabedateien.

1. die Emailadressen (emailadresse.txt)
Inhalt:
Code: (dl )
1
2
3
4
5
[EMAIL=ich@email.at]ich@email.at[/EMAIL]
[EMAIL=ich@domain.de]ich@domain.de[/EMAIL]
[EMAIL=mustermann@domain.com]mustermann@domain.com[/EMAIL]
[EMAIL=mustermann@domain.de]mustermann@domain.de[/EMAIL]
usw.


2. das Subject (subject.txt)
Inhalt:
Code: (dl )
Testemail


3. den Body (body.txt)
Inhalt:
Code: (dl )
1
2
3
4
5
Hallo!

Ich bin ein Testemail.

Gruss


4. das Attachments (in diesem Fall Attach.txt) - wird mit geschickt wenn vorhanden (auch mehrere moeglich)

Der Code des Moduls:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package mod_EmailVersand;

use warnings;
use strict;
use Win32::OLE;

BEGIN {
  use Exporter;
  our @ISA         = qw( Exporter );
  our @EXPORT      = qw( );
  our %EXPORT_TAGS = ( );
  our @EXPORT_OK   = qw( &su_EmailUeberpruefen &su_EmailSenden );
} # BEGIN

sub su_EmailUeberpruefen {

  open(EMAILADREIN, "<emailAdressen.txt") or die $!;
  open(EMAILADRAUS, ">emailAdressen.neu") or die $!;

  while(<EMAILADREIN>) {

     chomp;

     my @emailAdr = ();
     @emailAdr    = split(/\t/);

     foreach (@emailAdr) {
        s%^\s+%%g; # fuehrende und
        s%\s+$%%g; # abschliessende Blanks entfernen
     } # foreach

     defined $emailAdr[0] or $emailAdr[0] = ""; # To-Adresse
     defined $emailAdr[1] or $emailAdr[1] = ""; # Cc-Adresse

     my ($kennzTo, $kennzCc, $kennzToDub, $kennzCcDub) = ("OK", "OK", "OK", "OK"); # Kennzeichen
     my (%uniqueAdrTo, %uniqueAdrCc)                   = ( (), () );               # Dubletten
     # Erklaerung der Regex
     # ^              vom Anfang
     # [\w.+-]+       mindestens ein Buchstabe, Zahl, . - + _
     # \@             das @-Zeichen
     # [a-zA-Z0-9.-]* keine oder beliebig viele Buchstaben, Zahlen, . -
     # [a-zA-Z0-9]    genau einen Buchstaben oder eine Zahl
     # [a-zA-Z0-9.-]* keine oder beliebig viele Buchstaben, Zahlen, . -
     # \.             ein Punkt
     # [a-zA-Z]{2,}   zwei oder mehr Buchstaben
     # $              bis zum Ende
     $kennzTo = "KO" if $emailAdr[0] !~ m/^[\w.+-]+\@[a-zA-Z0-9.-]*[a-zA-Z0-9][a-zA-Z0-9.-]*\.[a-zA-Z]{2,}$/;
     $kennzCc = "KO" if $emailAdr[1] !~ m/^[\w.+-]+\@[a-zA-Z0-9.-]*[a-zA-Z0-9][a-zA-Z0-9.-]*\.[a-zA-Z]{2,}$/;

     # Cc-Adresse wird zu To-Adresse, wenn diese leer
     if (not($emailAdr[0])) {
        $emailAdr[0] = $emailAdr[1];
        $emailAdr[1] = "";
     } # if

     $kennzToDub = "KO" if ++$uniqueAdrTo{$emailAdr[0]} > 1; # Dublette wenn email
     $kennzCcDub = "KO" if ++$uniqueAdrCc{$emailAdr[1]} > 1; # groesser 1

     print EMAILADRAUS join("\t", @emailAdr, $kennzTo, $kennzCc, $kennzToDub, $kennzCcDub), "\n";

  } # while

  close(EMAILADREIN) or die $!;
  close(EMAILADRAUS) or die $!;

} # su_EmailUeberpruefen

sub su_EmailSenden {

  open(SUBJECT, "<subject.txt") or die $!;
  my $subject = <SUBJECT>; # Subject direkt aus Datei laden
  close(SUBJECT) or die $!;

  open(BODY, "<body.txt") or die $!;
  my @body = <BODY>; # Body direkt aus Datei in Array laden
  close(BODY) or die $!;

  open(EMAILADR, "<emailAdressen.neu") or die $!;

  while(<EMAILADR>) {

     my $outlook = Win32::OLE->new('Outlook.Application') or die $!; # Outlook Application oeffnen
     my $items   = $outlook->CreateItem(0) or die $!;

     chomp;

     my @emailAdr = ();
     @emailAdr    = split(/\t/);

     my ($emailTo, $emailCc, $kennzTo, $kennzCc, $kennzToDub, $kennzCcDub) = ("", "", "", "", "", ""); # Kennzeichen
     $emailTo    = $emailAdr[0]; defined $emailAdr[0] or $emailTo    = "";
     $emailCc    = $emailAdr[1]; defined $emailAdr[1] or $emailCc    = "";
     $kennzTo    = $emailAdr[2]; defined $emailAdr[2] or $kennzTo    = "";
     $kennzCc    = $emailAdr[3]; defined $emailAdr[3] or $kennzCc    = "";
     $kennzToDub = $emailAdr[4]; defined $emailAdr[4] or $kennzToDub = "";
     $kennzCcDub = $emailAdr[5]; defined $emailAdr[5] or $kennzCcDub = "";

#      $items->{'From'}    = "max\@mustermann.at";
     $items->{'To'}      = $emailTo if $kennzTo eq "OK" and $kennzToDub eq "OK"; # To-Adresse zuweisen
     $items->{'CC'}      = $emailCc if $kennzCc eq "OK" and $kennzCcDub eq "OK"; # Cc-Adresse zuweisen
     $items->{'Subject'} = $subject;        # Subject zuweisen
     $items->{'Body'}    = join("", @body); # Body mit Hilfe von join zuweisen (ohne funktioniert das nicht)

     # Attachments
     foreach my $attach (@ARGV) {
        die $! if not -e $attach;
        my $attachments = $items->Attachments();
        $attachments->Add($attach);
     } # foreach

     $items->Send();

     my $error = Win32::OLE->LastError();

     print "Email konnte nicht versendet werden.\n" if $error;

  } # while

  close(EMAILADR) or die $!;

} # su_EmailSenden

1;
__END__


Der Code des Skripts (im Prinzip nur der Aufruf)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl

use warnings;
use strict;
use mod_EmailVersand qw( su_EmailUeberpruefen su_EmailSenden );

su_EmailUeberpruefen();
su_EmailSenden();

print "Fertig.\n";

1;


Gruss,
havi\n\n

<!--EDIT|havi|1172828016-->

View full thread mails verschicken an mehrere Personen