Назад | Перейти на главную страницу

Exim не подписывает почту, отправляемую PHP через SMTP

Я изо всех сил пытался заставить Exim подписывать мои письма, которые я отправляю, с классом Zend2 Mailer. У класса есть возможность отправлять через SMTP; это здорово, так как у меня все настроено на уровне MTA.

Тем не мение. Отправка почты от клиента (Thunderbird) будет подписана. Письмо, отправленное с помощью класса рассылки Zend2, не будет. Начнем с моей версии Exim.

Exim version 4.76 #1 built 19-Jul-2011 02:56:59
Copyright (c) University of Cambridge, 1995 - 2007
Berkeley DB: Berkeley DB 4.7.25: (November 12, 2010)
Support for: crypteq IPv6 Perl OpenSSL move_frozen_messages Content_Scanning DKIM Old_Demime
Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmnz
Authenticators: cram_md5 plaintext
Routers: accept dnslookup ipliteral manualroute queryprogram redirect
Transports: appendfile/maildir/mailstore/mbx autoreply lmtp pipe smtp
Size of off_t: 8
Configuration file is /etc/exim.conf

Затем идет настройка DKIM. Я попытался найти домен с помощью метода ниже вместо использования $sender_address_domain переменная. В другом сообщении об ошибке сервера я видел, что команда DATA может исказить конверт, что приведет к неправильному адресу отправителя. Однако со мной этого не произошло. Оба разрешаются фактическому отправителю / от адреса.

[rob@server ~]$ exim -bP transports | grep dkim
dkim_canon = relaxed
dkim_domain = ${lc:${domain:$h_from:}}
dkim_private_key = ${if exists{/etc/virtual/$sender_address_domain/dkim.private.key}{/etc/virtual/$sender_address_domain/dkim.private.key}{0}}
dkim_selector = x
dkim_sign_headers = MIME-Version:Date:Message-ID:Subject:From:To
dkim_strict = 0

Ключи есть. Конфигурация работает, что подтверждается отправкой почты с помощью Thunderbird.

Тогда я спросил себя, действительно ли эти письма проходят через SMTP-сервер? Результат; да, они делают. Я проверил /var/log/exim/mainlog. Теперь я также заметил, что письма от Thunderbird не получают лога «получение почты». Не знаю почему? Может ли кто-нибудь уточнить это, если знает, почему? PHP подключается с использованием метода входа в систему SMTP с той же информацией SMTP, что и Thunderbird. Те же порты, домен, имя пользователя, пароль.

https://framework.zend.com/manual/2.4/en/modules/zend.mail.smtp.options.html#zend-mail-smtp-options

# This is the mail recieved from the PHP code.
2016-11-15 08:28:52 1c6YAm-000154-6p <= mailbox@mydomain.com H=mydomain.com [ipv4.addr] P=esmtpa A=login:mailbox@mydomain.com S=22098 id=26412cc5accb22e5ce03925c7ac38a7c95c398cb19d5736fa41fb565c8dc1254@mydomain.com T="Another day at the office with DKIM..." from <mailbox@mydomain.com> for mygmail@gmail.com

# Here it is outbound for its destination. Not signed to be noted.
2016-11-15 08:28:52 1c6YAm-000154-6p => mygmail@gmail.com F=<mailbox@mydomain.com> R=lookuphost T=remote_smtp S=22157 H=gmail-smtp-in.l.google.com [ipv6.addr] X=UNKNOWN:ECDHE-RSA-AES128-GCM-SHA256:128 C="250 2.0.0 OK 1479194932 yr4si27147042wjc.210 - gsmtp"

# This is send with Thunderbird. This gets signed...
2016-11-15 08:31:47 1c6YDa-0001CM-UY => mygmail@gmail.com F=<mailbox@mydomain.com> R=lookuphost T=remote_smtp S=762 H=gmail-smtp-in.l.google.com [ipv6.addr] X=UNKNOWN:ECDHE-RSA-AES128-GCM-SHA256:128 C="250 2.0.0 OK 1479195107 s17si1915514wme.47 - gsmtp"

Эти письма также не отклоняются и их нельзя найти в журнале паники. Они оба получены моей учетной записью Gmail:

# This is the mail send from thunderbird. With DKIM signing.

Delivered-To: mygmail@gmail.com
Received: by 10.80.186.18 with SMTP id g18csp1289759edc;
        Mon, 14 Nov 2016 23:31:47 -0800 (PST)
X-Received: by 10.194.248.5 with SMTP id yi5mr384988wjc.11.1479195107193;
        Mon, 14 Nov 2016 23:31:47 -0800 (PST)
Return-Path: <mailbox@mydomain.com>
Received: from myserver.com (myserver.com. [ipv6.addr])
        by mx.google.com with ESMTPS id s17si1915514wme.47.2016.11.14.23.31.47
        for <mygmail@gmail.com>
        (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
        Mon, 14 Nov 2016 23:31:47 -0800 (PST)
Received-SPF: pass (google.com: domain of mailbox@mydomain.com designates ipv6.addr as permitted sender) client-ip=ipv6.addr;
Authentication-Results: mx.google.com;
       dkim=pass header.i=@mydomain.com;
       spf=pass (google.com: domain of mailbox@mydomain.com designates ipv6.addr as permitted sender) smtp.mailfrom=mailbox@mydomain.com;
       dmarc=pass (p=NONE dis=NONE) header.from=mydomain.com
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mydomain.com; s=x;
    h=Content-Transfer-Encoding:Content-Type:MIME-Version:Date:Message-ID:Subject:From:To; bh=zaNQl8a2eAEHfPVmKMA7RmtMqJ/6huDk4u6pr/tWrqQ=;
    b=xcDHIzzTWS8hPMxjqbZM0I6b/act/LlweTuNcnZJ9ttEF1dAm37Lzy8zOJz2E2aDTkcQOdCQuC+VyIaXTRzTMJXyzJTUXTgPUPOePsR5XYqqsE0iQRMkDl/Ah650kBHD5drqIrFJwCw5g0aL9OECqTyRO9kwL0DQJX/mKcTkLtiiIs7Z7G77ZwWhJpFm/duoQARtZZ1UZFu42/Vbl+V8vSoWbXoZBpg+WBGucWJoGq+hb5zILxwsMPcbrIu+avBjjoUdLVP9YMFiPC3nK+7zOGBWOO7x6QoHQmO8uo0P88E52Sm9ZJGgLQOCfFCMjCnv4IMemj/GSe25Sf8PKah/Xg==;
Received: from 159-032-128-083.dynamic.caiway.nl ([83.128.32.159] helo=[192.168.1.108])
    by myserver.com with esmtpsa (UNKNOWN:AES128-SHA:128)
    (Exim 4.76)
    (envelope-from <mailbox@mydomain.com>)
    id 1c6YDa-0001CM-UY
    for mygmail@gmail.com; Tue, 15 Nov 2016 08:31:46 +0100
To: Rob van der Lee <mygmail@gmail.com>
From: Rob van der Lee <mailbox@mydomain.com>
Subject: Dit is een verzonden mail via account
Message-ID: <2ccd7be7-bbd1-0fdc-a8d4-a4f6f652bfc2@mydomain.com>
Date: Tue, 15 Nov 2016 08:31:46 +0100
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101
 Thunderbird/45.4.0
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 7bit

Dit is echt een test.

И вот письмо, которое отправляется с PHP, не подписывается.

Delivered-To: mygmail@gmail.com
Received: by 10.80.186.18 with SMTP id g18csp1288906edc;
        Mon, 14 Nov 2016 23:28:52 -0800 (PST)
X-Received: by 10.28.170.134 with SMTP id t128mr2009669wme.29.1479194932632;
        Mon, 14 Nov 2016 23:28:52 -0800 (PST)
Return-Path: <mailbox@mydomain.com>
Received: from myserver.com (myserver.com. [ipv6.addr])
        by mx.google.com with ESMTPS id yr4si27147042wjc.210.2016.11.14.23.28.52
        for <mygmail@gmail.com>
        (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
        Mon, 14 Nov 2016 23:28:52 -0800 (PST)
Received-SPF: pass (google.com: domain of mailbox@mydomain.com designates ipv6.addr as permitted sender) client-ip=ipv6.addr;
Authentication-Results: mx.google.com;
       spf=pass (google.com: domain of mailbox@mydomain.com designates ipv6.addr as permitted sender) smtp.mailfrom=mailbox@mydomain.com;
       dmarc=pass (p=NONE dis=NONE) header.from=mydomain.com
Received: from mydomain.com ([37.97.128.104])
    by myserver.com with esmtpa (Exim 4.76)
    (envelope-from <mailbox@mydomain.com>)
    id 1c6YAm-000154-6p
    for mygmail@gmail.com; Tue, 15 Nov 2016 08:28:52 +0100
Date: Tue, 15 Nov 2016 07:28:52 +0000
To: mygmail@gmail.com
From: Rob van der Lee <mailbox@mydomain.com>
Sender: Rob van der Lee <mailbox@mydomain.com>
Subject: Another day at the office with DKIM...
MIME-Version: 1.0
Content-Type: multipart/alternative;
 boundary="=_7ebb8a8d12984c5cc3f5fbf995b1b4ad"
Message-ID: <26412cc5accb22e5ce03925c7ac38a7c95c398cb19d5736fa41fb565c8dc1254@mydomain.com>

This is a message in Mime Format.  If you see this, your mail reader does not support this format.

--=_7ebb8a8d12984c5cc3f5fbf995b1b4ad
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

... content of mail in text and then html, left it out since not relevant.

Для меня просто не имеет смысла, почему Exim не подписывает это письмо. Как видно из файла журнала, оба письма отправляются через T=remote_smtp и в соответствии с моей конфигурацией MTA все исходящие письма, отправляемые через remote_smtp, должны быть подписаны.

Не считая того факта, что почта действительно отправляется и достигает почтового ящика. Надеюсь, я смогу извлечь из этого урок.

Обновить:

В соответствии с предложением Даниэля я попытался разрешить домен, обработав SMTP-запрос, внутри, в отличие от того, чтобы позволить моему провайдеру обрабатывать это за меня. Это не помогает, сообщение все равно отправляется без подписи.

Журналы также выглядят так же, как указано выше.

Dig Запрос старой ситуации:

;; QUESTION SECTION:
;mydomain.com.      IN  NS

;; ANSWER SECTION:
mydomain.com.   86400   IN  NS  ns1.transip.nl.
mydomain.com.   86400   IN  NS  ns2.transip.eu.
mydomain.com.   86400   IN  NS  ns0.transip.net.

Dig Запрос новой ситуации:

;; QUESTION SECTION:
;mydomain.com.      IN  NS

;; ANSWER SECTION:
mydomain.com.   14400   IN  NS  ns2.myserver.com.
mydomain.com.   14400   IN  NS  ns1.myserver.com.

Обновить до ответа:

Я также сделал сообщение об ошибке в трекере ошибок Exim. Думал получить помощь экспертов; Джереми Харрис указал мне правильное направление.

Jeremy Harris 2016-11-15 14:58:55 GMT

First, if you're running Exim 4.76 - update it.

Then, assuming the problem still exists:  restart your daemon with a commandline
debug option, collecting output.  Feed it a test mail.  Examine the debug output,
which shows the processing flow for the message.  Compare with your config and
work out where it differs from what you expected.

Я сделал то, что он мне сказал. Обновился, затем выяснилось, что проблема все еще сохраняется. Накормил режим отладки 2 почты. Один подписан, другой без подписи.

Я начал внимательно сравнивать и заметил, что тело обоих писем начало скармливаться PDKIM (библиотека dkim для Exim). Затем я заметил, что мое неподписанное письмо не закрывается после тела, как подписанное сообщение.

Я решил, что это связано с содержанием; поэтому со стороны PHP я отправляю письмо только с строкой текста. Это подписывалось ...

Решение? Перенос слов! Что я не думал об этом раньше! Я действительно не чувствую себя сейчас таким уж умным. Это потому, что я знал об этом заранее. В RFC 2646 spec рассказывает нам об этом.

Надеюсь, этот пост поможет кому-то другому. Это был хороший путь, и проблема была в моей реализации.

(Я не могу комментировать, поэтому это не означает ответ, но я надеюсь, что это поможет)

Некоторое время назад я работал над той же проблемой, и это вызвало у меня настоящую головную боль. В моем случае у меня было два сервера имен, один на удалении в хостинговой компании, а другой также работал на самом сервере для обработки внутреннего именования. (Как вам кажется, голландцы; TransIP VPS с Cpanel и домены, которые обрабатываются на стороне TransIP.)

Теперь на внешнем DNS я установил DKIM, так что он работал в большинстве ситуаций, но не для моей почтовой функции PHP, поэтому мне нужно было также установить его на внутреннем (Cpanel) DNS, чтобы заставить его работать для PHP.

(Также, когда я искал эту проблему, было что-то с 7-битным и 8-битным Content-Transfer-Encoding, но в моем случае это не имело значения)