Schrift
[thread]347[/thread]

SendMail-Attachment: ?!: Attachment mit Perl (Seite 2)

Leser: 1


<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten
Dubu
 2004-08-07 22:41
#3350 #3350
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Genau, da fehlen die Leerzeilen. Die  werden benoetigt - zumindest die Leerzeile nach dem Mail-Header!

Ausserdem ist deine Boundary zu einfach, sie muss fuer alle Mails beim Empfaenger eindeutig sein und darf nicht in einem der Mail-Teile vorkommen (bei deiner Boundary kann das sogar sehr leicht passieren).

Ich moechte mal wieder dazu raten, CPAN:MIME::Lite einzusetzen, das kuemmert sich um alles.
soilant
 2004-08-08 00:30
#3351 #3351
User since
2004-08-07
13 Artikel
BenutzerIn
[Homepage] [default_avatar]
Liebe Leute,
das alles klappt immer noch nicht. Ich habe:
a) den Zeilenabstand neu wunderschön gesetzt
b) die "boundary" als 20-stellige Zufallszahl generieren lassen:
$boundary = int(rand(100000000000000000000));
- Ergebnis: wie vorher. Ein Mail kommt an, aber das ist komplett leer. Keine Spur von Attachment, nicht mal von Normal-Text.

Der zweite Tip (MIME::Lite) ist ja gutgemeint, doch nach einigen fruchtlosen Versuchen mit MIME::Entity (Erklärung: amerikanisches Englisch, super verständlich) will ich mir nicht auch noch eine Woche MIME::Lite antun - ist es denn wirklich nicht möglich, im obigen Code die richtigen Zeilen zu finden ???
pq
 2004-08-08 00:56
#3352 #3352
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Guest,07.08.2004, 18:07]
Code: (dl )
1
2
3
4
5
6
7
8
$file = param('file');
binmode $file;
$encoded_file = MIME::Base64::encode($file);
print MAIL <<EOA;
...
Content-Disposition: attachment; filename="$file"
$encoded_file
EOA

[/quote]
du bist sicher, dass du den dateinamen verschicken willst?
an welcher stelle in deinem programm liest du denn die daten der hochgeladenen
datei?
du beschwerst dich über eriks code, aber du benutzt ihn ja auch verkehrt bzw.
nur zum teil.

edit: übrigens ein klassisches beispiel für den link, den ich weiter oben
erwähnte, den du ja hoffentlich gelesen hast.\n\n

<!--EDIT|pq|1091912626-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
soilant
 2004-08-08 05:01
#3353 #3353
User since
2004-08-07
13 Artikel
BenutzerIn
[Homepage] [default_avatar]
Guten Tag miteinander,
hallo pq,
ein Teil ist geschafft - vieles lag am Lesen der Datei. Nach vielen Versuchen mit der heiklen "boundary" und dem genauen Setzen der Zeilenabstände, wird die Datei jetzt immerhin bereits versendet, und es erscheint auch der Text.
Jedoch ist das JPG-Bild nachher nicht aufzukriegen ("Format unknown") und im Quelltext meldet der "Spam-Assasin" (vom Server) eine "MIME-MISSING-BOUNDARY".  ?!
Ist wohl die Benutzung von "MIME::64..." nicht ganz am richtigen Ort?
Der Code sieht jetzt so aus:
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
$boundary = '--=_'.substr(pack('u', ('E-Mail'.'Mieser Peter')), 0, 24);

open(MAIL, "| /usr/sbin/sendmail -n -t -oi") or die "Oh hoppla!";
print MAIL <<EOA;
From: $from
To: $to
Cc: $bc
Bcc: $bcc
Subject: $subject
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="$boundary"

--$boundary
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

$text

--$boundary
EOA
while ( read($file, $container, 1024) ) {
binmode($file);
local $/;
$encoded_file = MIME::Base64::encode($container);
}
print MAIL <<EOB;
Content-Type: image/jpeg; name="$file"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="$file"

$encoded_file

--$boundary
EOB
close(MAIL);
pq
 2004-08-08 12:00
#3354 #3354
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
ein paar hinweise:
1. use strict benutzen
2. use warnings benutzen
3. binmode natürlich vor dem lesen der datei setzen!
4. $encoded_file enthält in der schleife immer nur einen teil der
  datei. du überschreibst den vorherigen teil und schickst am ende nur
  den letzten teil ab. warum? mit use strict wäre dir das übrigens nicht
  passiert. wenn du das nicht benutzt, kommentier ich nix mehr.
5. wenn ich alle diese fehler behebe, kommt bei mir die mail prima an.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
soilant
 2004-08-08 18:32
#3355 #3355
User since
2004-08-07
13 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo nochmal,
ich hatte von Anfang an "use strict" und "use warnings" drin, also kein Grund zur Panik.
Und da das Ganze auf UNIX läuft, spielt "binmode" eh keine Rolle.
Es lag an der Schleife. (Danke, pq)
Dennoch bleibt es fraglich weshalb der "SpamAssasin" vom Server immer noch angibt, es fehle beim JPG die "boundary".
Ausserdem bleibt mir im Grunde rätselhaft, weshalb eine 20-stellige Zufallszahl als "boundary" nicht akzeptiert wird,
eine mir - trotz immerhin 2m Perl-Literatur - im Kern unverständliche Struktur von:
"---".substr(pack('u',('Mail'.'Name')), 0, 24)
hingegen schon.
Was soll das?
esskar
 2004-08-08 18:54
#3356 #3356
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
deine letzten drei zeilen der mail sollten eben so
Code: (dl )
1
2
3
--$boundary--

.

aussehen... wenn du code, der funktioniert, änderst, solltest du auch wissen warum du ihn änderst und sicher stellen, dass das ganze dann noch funktioniert! :)

und was hat binmode mit dem betriebssystem zu tun?
soilant
 2004-08-08 19:29
#3357 #3357
User since
2004-08-07
13 Artikel
BenutzerIn
[Homepage] [default_avatar]
Danke Esskar, werd's probieren.
Bezüglich "binmode" heisst es in dem schlauen Buch "CGI-Anwendungen mit Perl"(Addison-Wesley-Verlag):

"Wenn die Datei tatsächlich binär ist, müssen Sie die Funktion binmode()für Nicht-Unix-Server verwenden. Wenn Ihr Programm nur in einer UNIX-Umgebung laufen soll, können Sie diese Zeilen auslassen, da Unix mit Binär- und Textdaten korrekt umgehen kann."
pq
 2004-08-08 19:44
#3358 #3358
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=soilant,08.08.2004, 16:32]ich hatte von Anfang an "use strict" und "use warnings" drin, also kein Grund zur Panik.
[/quote]
sieht aber nicht so aus, da du nirgendwo my() benutzt.
dann kann ich nur vermuten, dass du alle benutzten variablen am anfang
des skriptes deklarierst. das ist in perl nicht notwendig und auch nicht
empfehlenswert. in perl wird eine variable erst dann deklariert, wenn sie
zum ersten mal gebraucht wird. da du $encoded_file erst in der schleife benutzt
hast, hätte dich strict darauf aufmerksam gemacht.
wenn du alle variablen am anfang deklarierst, umgehst du somit einen wertvollen
effekt von strict. ausserdem ist es generell wegen des speicherverbrauchs
ratsam, den variablen den kleinstmöglichen gültigkeitsbereich zu geben.

Quote
Und da das Ganze auf UNIX läuft, spielt "binmode" eh keine Rolle.

aber ein binmode() an der falschen stelle zu machen, ist halt was, was
kommentiert wird. wenn du weisst, dass du es eh nicht brauchst, lass es
lieber ganz weg. und soweit ich weiss, ist es mittlerweile ratsam, auch
unter unix binmode zu benutzen, wg. utf8 oder was weiß ich (auf dem gebiet
bin ich nicht sonderlich fit). dass ältere bücher da was anderes sagen, ist
verständlich.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
esskar
 2004-08-08 20:37
#3359 #3359
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
eine Möglichekit, eine boundary zu generieren wäre z.B.

Code: (dl )
1
2
3
4
5
6
7
BEGIN {
my $BCount = 0;
}

sub gen_boundary {
return ("_----------=_".int(time).$$.$BCount++);
}

@eb: das könntest du noch ins wiki schreiben...

aber im Allgemeinen würde ich schon MIME::Lite benutzen, da es vieles einfach richtiger macht (encodieren, zeilenlänge einhalten, ...)
MIME ist schon ein sehr kompiliziertes format und es gibt viel zu viele schlechte mail-clients auf der welt; da braucht man keinen anderen schlchten client zu erfinden...

was mich an MIME::Lite nur geärgert hat, dass das Interface teilweise geändert wurde... :(
<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten



View all threads created 2004-08-07 17:43.