Я перенаправляю входящую почту в PHP-скрипт, сразу сохраняя RAW-сообщение в базе данных MySQL. Он работает очень хорошо, за исключением того, что ~ 0,7% писем приходит с усеченным телом сообщения.
Я нашел кого-то, чьи электронные письма не работали, и попросил их отправить электронное письмо НА мою учетную запись gmail И на сервер. У Gmail проблем не было, я все сообщение видел. Но мой сервер обрезал необработанное сообщение следующим образом:
Delivered-To: asdasd@gmail.com
Received: by 10.152.1.193 with SMTP id 1csp3490lao;
Mon, 20 Oct 2014 05:33:31 -0700 (PDT)
Return-Path: <sender@test.com>
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 <asdasd@gmail.com>
(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?= <sender@test.com>
To: "test" <test@asdasd.com>
References: <CAEMnOreG=99=qxBdSav5WP303BA@mail.gmail.com>
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--
Мой сервер обрезает сообщение непосредственно перед первым иностранным символом. Сохраненные необработанные данные содержат заголовки, пустую строку, «Det h» и ничего больше.
Когда я перенаправляю вышеуказанное электронное письмо в PHP-скрипт в оболочке (/blah/email_in.php < bademail.txt
), и он отлично хранит сообщение. Поэтому я не думаю, что мой скрипт виноват, он правильно хранит необработанный STDIN.
Я использовал cPanel, чтобы «Установить адрес по умолчанию» на «Канал в программу». Я не знаю, полностью ли обходит этот параметр EXIM, но я где-то читал, что EXIM обрабатывает конвейерный транспорт, поэтому мое первое предположение состоит в том, что EXIM искажает плохо отформатированное сообщение и блокирует поток первым символом Unicode. ä.
Чтобы подтвердить это, мне нужен способ передачи электронной почты В EXIM, по сути, обманывая EXIM, заставляя думать, что он только что получил электронное письмо, когда на самом деле он только что получил текстовый файл. Я нашел несколько руководств о том, как подключиться по telnet к порту 25 и т. Д., Но ничего, что сохраняло бы заголовки, составные границы, и это не имело смысла для unix n00b, как я, который полагается на cPanel.
Правильно ли я говорю, что вероятным виновником является EXIM?
Может ли кто-нибудь предложить способ проверить это или альтернативный подход?
Мой сервер работает под управлением EXIM + Dovecot на CentOS 6.5.
p.s. Моя единственная другая мысль - позволить серверу хранить почту в обычном режиме, и если эти сообщения волшебным образом хранятся правильно, использовать IMAP для извлечения / удаления сообщений, а не напрямую в канал ... кажется менее эффективным, чтобы добавить посредника IMAP, хотя этот подход, вероятно, более надежен.
вы можете захотеть попробовать сваки:
swaks --to user@example.com --server your-server.example.net -d your_mail_with_headers.txt
где конечно your_mail_with_headers.txt
это файл, содержащий ваше необработанное сообщение (заголовки, тело, MIME, ...)
Однако я не думаю, что проблема в конвейере eximʻa (обычно вещи проходят через каналы неизмененными, даже с двоичными строками); более вероятно, что ваш сценарий ведет себя по-разному в оболочке и при передаче по конвейеру (например, из-за LANG
или LC_ALL
переменные среды и т. д.)