Thread Problem mit sendmail (HTML-Mail erzeugen und senden) (51 answers)
Opened by carsten1976 at 2010-03-27 01:36

bianca
 2010-03-27 08:07
#135339 #135339
User since
2009-09-13
7016 Artikel
BenutzerIn

user image
Hallo Carsten, da bist Du ja :)

Ja, klar geht das. Sendmail ist ja einfach nur ein Mailversender. Soweit ich bisher mit sendmail gearbeitet habe, habe ich die Mail immer selbst als Mime zusammengesetzt (ist an sich ganz einfach) und dann damit verschickt. Sicherlicht gibt es dafür auch Module, die einem dabei helfen, ich weiß allerdings nicht, inwieweit es Module bei Strato gibt.

Wir fangen mal mit einem gaaaanz einfachen Beispiel an.
Lass Dich von dem vielen Code nicht irritieren. Die Sub's MIMEENCODE und QP_ENCODE lassen sich vielleicht durch Module ersetzen, soweit vorhanden, müssen wir später mal klären.

Hiermit verschickst Du eine ganz einfache Mail per sendmail (in Zeile 20 bitte eine gültige Empfänger-E-Mail einsetzen!):
Sollte auch auf einem Strato laufen.

Code (perl): (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
#!/usr/bin/perl -w
use strict;
use warnings;
use IO::Handle; STDOUT -> autoflush (1);
use CGI;
#######################################
my %config = (
        mailprog    => '|/usr/sbin/sendmail -t',
        from_name       => 'carsten1976',
        from_mail       => 'carsten@weissichnicht.de',
);
#######################################
my $q = CGI -> new;
print $q -> header;
my $fehler = '';
open my $mh,$config{mailprog} or $fehler = $!;
if ($fehler eq '') {
        my $mail = "Mime-Version: 1.0\n";
        $mail .= &MIMEENCODE ("From: $config{from_name} <$config{from_mail}>",'ISO-8859-1');
        $mail .= &MIMEENCODE ("To: empfaenger\@domain.de",'ISO-8859-1');
        $mail .= &MIMEENCODE ("Subject: Testmail äöüßÖÄÜ",'ISO-8859-1');
        $mail .= "Content-Type: text/plain;\n  charset=\"ISO-8859-1\"\nContent-Transfer-Encoding: quoted-printable\n\n";
        $mail .= &QP_ENCODE ('Guten Tag, dies ist ein kleiner Text für eine Mail');
        print $mh $mail;
        close ($mh);
        print "Mail verschickt\n";
}
else {
        print "Fehler >$fehler<\n";
}
#######################################
sub MIMEENCODE() {
        return '' if !defined $_[0] || $_[0] eq '';
        my $return = $_[0];
        my $charset = $_[1] || 'ISO-8859-1';
        my $noprint = "\\x00-\\x1F\\x7F-\\xFF";
        my ($word,@lines);
        my $line = '';
        $return =~ s{[a-zA-Z0-9\x7F-\xFF]{1,18}}{
                $word = $&;
                (($word !~ /[$noprint]/o)
                ? $word
                : "=?$charset?Q?".&_encode($word,$noprint)."?=");
        }xeg;
        my @words = split(/ /,$return);
        foreach $word (@words) {
                my $sameword = 0;
                if (length($word) > 75) {
                        while ($word) {
                                if ($word =~ /^(.+?\?=)(=\?.*)$/) {
                                        &addword($1,\$line,\@lines,$sameword);
                                        $word = $2;
                                }
                                else {
                                        &addword($word,\$line,\@lines,$sameword);
                                        $word = '';
                                }
                                $sameword = 1;
                        }
                }
                else { &addword($word,\$line,\@lines,$sameword) }
        }
        push(@lines,$line."\n") if ($line);
        return substr(join('',@lines),1);
        sub addword {
                my ($word,$line,$lines,$sameword) = @_;
                if (!$sameword && $word =~ /^=\?[^\?]+?\?[Qq]\?(.+\?=)$/) {
                        my $newword = $1;
                        if ($$line =~ /^(.+)\?=$/) {
                                $$line = $1.'_';
                                if (length($$line) + length($newword) > 75) {
                                        $$line .= '?=';
                                        push(@$lines,$$line."\n");
                                        $$line = ' '.$word;
                                }
                                else { $$line .= $newword }
                                return 0;
                        }
                }
                if (length($$line) > 0 && length($$line) + length($word) > 75) {
                        push(@$lines,$$line."\n");
                        $$line = '';
                }
                $$line .= ' '.$word;
        }
        sub _encode {
                my ($str,$noprint) = @_;
                $str =~ s{[\?\=\_$noprint]}{sprintf("=%02X",ord($&))}eog;
                $str;
        }
}
#######################################
sub QP_ENCODE {
        my $text = shift;
        my $schneiden = shift || '';
        my $blanks = shift || '';
        $text =~ s/([^ \t\n!-<>-~])/sprintf("=%02X", ord($1))/eg;
        $text =~ s/([ \t]+)$/
                join('', map { sprintf("=%02X", ord($_)) } split('', $1))/egm;
        $text =~ s/ /=20/g if $blanks;
        my $gebrochen = '';
        if (!$schneiden) {
                $gebrochen .= "$1=\n"
                        while $text =~ s/(.*?^[^\n]{73} (?:
                         [^=\n]{2} (?! [^=\n]{0,1} $)
                        |[^=\n]    (?! [^=\n]{0,2} $)
                        |          (?! [^=\n]{0,3} $)
                    ))//xsm;
        }
        return "$gebrochen$text";
}
10 print "Hallo"
20 goto 10

View full thread Problem mit sendmail (HTML-Mail erzeugen und senden)