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

Я изо всех сил пытался заставить Exim подписывать мои письма i ' m отправка с помощью класса 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 Request старой ситуации:

;; 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 Request новой ситуации:

;; 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 lib для Exim). Затем я заметил, что мое неподписанное письмо не закрывается после тела, как подписанное сообщение.

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

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

Надеюсь, этот пост поможет кому-то другому. Это был хороший путь, и проблема была в моей реализации. На server_A есть 3 экземпляра одного и того же приложения (прослушивают другой порт). Ниже моя конфигурация. http {upstream myapp1 {...

Я использую nginx для балансировки нагрузки в моем приложении торнадо. На server_A есть 3 экземпляра одного и того же приложения (прослушивают другой порт). Ниже представлена ​​моя конфигурация.

http {
    upstream myapp1 {
        server server_A_IP:8888;
        server server_A_IP:8887;
        server server_A_IP:8886;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}

Теперь у меня есть еще один server_B, и я также запускаю 3 экземпляра на этом сервере, поэтому я добавляю 3 строки в свой восходящий поток конфигурации.

   upstream myapp1 {
    server server_A_IP:8888;
    server server_A_IP:8887;
    server server_A_IP:8886;

    server server_B_IP:8888;
    server server_B_IP:8887;
    server server_B_IP:8886;
}

Это было бы некрасиво, если бы я запустил 10 экземпляров на каждом сервере или добавить большой сервер в апстрим.

Есть ли какой-нибудь правильный способ сделать это? Каков рекомендуемый способ балансировки нагрузки на несколько серверов? Спасибо!

0
задан 15 November 2016 в 10:20
1 ответ

Правильным способом было бы использовать специализированный инструмент для балансировки.

Другой способ, довольно простой, - иметь доменное имя, указывающее на несколько IP-адресов, и использовать это доменное имя в server директива.

http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server

Имя домена, которое разрешается в несколько IP-адресов, определяет несколько серверов одновременно.

Таким образом, вы должны использовать

upstream myapp1 {
    server upstream.example.net:8886;
    server upstream.example.net:8887;
    server upstream.example.net:8888;
}

и при необходимости добавлять IP-адреса в DNS.

0
ответ дан 5 December 2019 в 09:14

Теги

Похожие вопросы