o pipe de email para o programa causa problemas com caracteres unicode?

3

Estou enviando e-mails recebidos para um script PHP, imediatamente armazenando o e-mail RAW em um banco de dados MySQL. Funciona muito bem, exceto que ~ 0,7% dos e-mails chegam com um corpo de mensagem truncado.

Encontrei alguém cujos e-mails estavam falhando e mandei um e-mail para minha conta do Gmail e para o servidor. Gmail não teve problemas, eu vi a mensagem inteira. Mas meu servidor cortou a mensagem bruta assim:

Delivered-To: [email protected]
Received: by 10.152.1.193 with SMTP id 1csp3490lao;
        Mon, 20 Oct 2014 05:33:31 -0700 (PDT)
Return-Path: <[email protected]>
Received: from vps123.blahblah.com (vps123.blahblah.com. [74.124.111.111])
        by mx.google.com with ESMTPS id fb7si7786786pab.30.2014.10.20.05.33.30
        for <[email protected]>
        (version=TLSv1 cipher=RC4-SHA bits=128/128);
        Mon, 20 Oct 2014 05:33:30 -0700 (PDT)
Message-ID: <14FBD481E1074C79AF3D@acerDator>
From: =?utf-8?Q?sende=C3=A4r?= <[email protected]>
To: "test" <[email protected]>
References: <[email protected]>
Subject: Message body will contain only Det h
Date: Mon, 20 Oct 2014 14:33:24 +0200
MIME-Version: 1.0
Content-Type: multipart/alternative;
    boundary="----=_NextPart_000_0018_01CFEC72.CE424470"
X-Priority: 3
X-MSMail-Priority: Normal
Importance: Normal
X-Mailer: Microsoft Windows Live Mail 14.0.8117.416
X-MimeOLE: Produced By Microsoft MimeOLE V14.0.8117.416
X-Source: 
X-Source-Args: 
X-Source-Dir: 

Det här är ett flerdelat meddelande i MIME-format.

------=_NextPart_000_0018_01CFEC72.CE424470
Content-Type: text/plain;
    charset="utf-8"
Content-Transfer-Encoding: quoted-printable

This email will not be received correctly. EXIM may not handle =
some poorly formed emails. For example ...

    Det h=E4r =E4r ett flerdelat meddelande i MIME-format.

... is directly above this quoted-printable wrapper, thanks to the =
Swedish email client Microsoft Windows Live (circa 2009), adding UTF-8 =
chars where there should only be ascii. At least, that's what I think =
the problem is.

------=_NextPart_000_0018_01CFEC72.CE424470--

Meu servidor corta a mensagem imediatamente antes do primeiro caractere estrangeiro. Os dados brutos armazenados contêm os cabeçalhos, uma linha em branco, "Det h" e nada mais.

Quando eu canalizo o email acima para o script PHP no shell ( /blah/email_in.php < bademail.txt ), e ele armazena a mensagem perfeitamente. Então eu não acho que meu script é a culpa, ele armazena o STDIN bruto corretamente.

Eu usei o cPanel para "Set Default Address" para "Pipe to a program". Eu não sei se essa configuração ignora o EXIM completamente, mas eu li em algum lugar que o EXIM manipula o transporte de pipe, então meu primeiro palpite é que o EXIM está desconcertando uma mensagem mal formatada e sufocando o fluxo no primeiro caractere unicode ä .

Para confirmar isso, eu preciso de uma maneira de mandar um e-mail para INTO EXIM, basicamente enganando o EXIM pensando que ele acabou de receber um e-mail quando na verdade ele acabou de receber um arquivo txt. Eu encontrei vários tutoriais sobre como fazer telnet para a porta 25, etc, mas nada que preservaria os cabeçalhos, multipartidos limites, nem que fizesse sentido para um unix n00b como eu, que depende do cPanel.

Estou certo de que o EXIM é o provável culpado?
Alguém pode sugerir uma maneira de testar isso, ou uma abordagem alternativa?

Meu servidor executa o EXIM + Dovecot no CentOS 6.5.

p.s. Meu único outro pensamento é deixar o servidor armazenar mensagens normalmente, e se essas mensagens forem magicamente armazenadas corretamente, usar o IMAP para recuperar / excluir as mensagens, em vez de ir diretamente para o pipe ... parece menos eficiente para adicionar o intermediário IMAP, embora essa abordagem seja provavelmente mais robusta.

    
por neokio 22.10.2014 / 14:17

1 resposta

2

você pode querer tentar swaks :

  swaks --to [email protected] --server your-server.example.net -d your_mail_with_headers.txt 

onde é claro que your_mail_with_headers.txt é o arquivo contendo sua mensagem bruta (cabeçalhos, corpo, MIME, ...)

No entanto, eu não acho que o encanamento exim deva ser o problema (as coisas geralmente passam através de pipes não modificados, até mesmo seqüências binárias); é mais provável que o script se comporte de maneira diferente no shell e quando canalizado (por exemplo, devido a LANG ou LC_ALL variáveis de ambiente, etc.)

    
por 26.10.2014 / 23:47

Tags