Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 692e001f

Von Moritz Bunkus vor etwa 12 Jahren hinzugefügt

Via SMTP Zeilen normalisiert verschicken

Der SMTP-Standard (RFC 821) verlangt, dass Zeilen nicht länger als
1000 Zeichen sind und mit <CRLF> abgeschlossen werden.

Anhänge kommen in der "sub print" aber als ein großer Blob an, der
zwar schon nach Zeilen aufgespalten ist, aber trotzdem zu groß ist,
sodass der annehmende Server teilweise komische Dinge mit der Eingabe
tut.

Also wirklich nur Zeile für Zeile schicken sowie dafür sorgen, dass
alle Zeilen auch wirklich mit <CRLF> aka \r\n abgeschlossen werden.

Unterschiede anzeigen:

SL/Mailer/SMTP.pm
49 49
sub print {
50 50
  my $self = shift;
51 51

  
52
  $self->{smtp}->datasend(@_);
52
  # SMTP requires at most 1000 characters per line. Each line must be
53
  # terminated with <CRLF>, meaning \r\n in Perl.
54

  
55
  # First, normalize the string by removing all \r in order to fix
56
  # possible wrong combinations like \n\r.
57
  my $str = join '', @_;
58
  $str    =~ s/\r//g;
59

  
60
  # Now remove the very last newline so that we don't create a
61
  # superfluous empty line at the very end.
62
  $str =~ s/\n$//;
63

  
64
  # Split the string on newlines keeping trailing empty parts. This is
65
  # requires so that input like "Content-Disposition: ..... \n\n" is
66
  # treated correctly. That's also why we had to remove the very last
67
  # \n in the prior step.
68
  my @lines = split /\n/, $str, -1;
69

  
70
  # Send each line terminating it with \r\n.
71
  $self->{smtp}->datasend("$_\r\n") for @lines;
53 72
}
54 73

  
55 74
sub send {

Auch abrufbar als: Unified diff