Pull to refresh

Comments 6

1. Как это реализовать на CentOS 5?
2. Через что отправляете письма? PHP — mail()?
1. Размещение конфигов будет в других директориях и еще opendkim нужно поставить (yum например).
2. Вся почта идет через Exim, не только mail().
А зачем opendkim нужно запускать? Я ключи еще dkim-filter генерировал, а сейчас использую только exim4 без каких-либо dkim пакетов, и работает.
Если доменов много, то делаю так (у меня на Ubuntu 10.04 стоит dk-milter и OpenDKIM):
/etc/default/opendkim
# Command-line options specified here will override the contents of
# /etc/opendkim.conf. See opendkim(8) for a complete list of options.
#DAEMON_OPTS=""
#
# Uncomment to specify an alternate socket
# Note that setting this will override any Socket value in opendkim.conf
SOCKET="inet:10035@localhost" # listen on loopback on port 8891 - Ubuntu default


/etc/opendkim.conf
# This is a basic configuration that can easily be adapted to suit a standard
# installation. For more advanced options, see opendkim.conf(5) and/or
# /usr/share/doc/opendkim/examples/opendkim.conf.sample.

##
## opendkim.conf -- configuration file for OpenDKIM filter
##
ADSPAction              Continue
ADSPNoSuchDomain        Yes
AutoRestart             Yes
AutoRestartRate         10/1h
Canonicalization        simple/simple
ExternalIgnoreList      refile:/etc/mail/opendkim/trusted-hosts
InternalHosts           refile:/etc/mail/opendkim/trusted-hosts
KeyTable                refile:/etc/mail/opendkim/keyTable
LogWhy                  Yes
On-Default              accept
On-BadSignature         accept
On-DNSError             tempfail
On-InternalError        accept
On-NoSignature          accept
#On-Security             tempfail
On-Security             accept
PidFile                 /var/run/opendkim/dkim-milter.pid
SignatureAlgorithm      rsa-sha1
SigningTable            refile:/etc/mail/opendkim/signingTable
Socket                  inet:10035@127.0.0.1
Syslog                  Yes
SyslogSuccess           Yes
TemporaryDirectory      /tmp
UMask                    000
UserID                  opendkim:postfix
#X-Header                Yes


/etc/default/dk-filter
USER="postfix"
GROUP="mail"
SOCKET="inet:10034@127.0.0.1"

SIGNING_DOMAIN="/etc/mail/domainkeys/domains"
KEYFILE="/etc/mail/domainkeys/keys"
SELECTOR_NAME="mail"
SIGNER=yes
VERIFIER=yes
CANON=simple
#REJECTION="bad=r,dns=t,int=t,no=a,miss=r"
REJECTION="bad=r,dns=t,int=a,no=a,miss=r"
HOSTLIST="/etc/mail/domainkeys/trusted-hosts"
EXTRA_ARGS="-A -H -k -l -D -i ${HOSTLIST} -I ${HOSTLIST}"
#========================================================
MODES=
if [ x${SIGNER:0:1} == "xy" -o x${SIGNER:0:1} == "xY" ]; then
    MODES=${MODES}s
fi
#if [ x${VERIFIER:0:1} == "xy" -o x${VERIFIER:0:1} == "xY" ]; then
#    MODES=${MODES}v
#fi
[ ! -z "$MODES" ] && MODES="-b $MODES"
#========================================================
DAEMON_OPTS="-d ${SIGNING_DOMAIN} -s ${KEYFILE} -S ${SELECTOR_NAME} ${MODES} -c ${CANON} -C ${REJECTION} ${EXTRA_ARGS}"


Ну, и генерация ключиков
#!/bin/bash

if [ -z $1 ]; then
    echo "The domainname is not specified"
    exit 1
fi

PREFIX=/etc/mail
#PREFIX=/opt/postfixadmin-hooks/mail

# Location of OpenSSL binary (whereis -b openssl)
OPENSSL=/usr/bin/openssl
DOMAIN=$1
USE_DKIM=1
USE_DOMAINKEYS=1
SELECTOR=mail
MAILTMPFFILE=/tmp/mail-`date "+%s"`
POSTMASTER="postmaster@example.com"
ADMINMAIL="tech@example.com"
SENDMAIL="/usr/sbin/sendmail"

# Create the directories for keys
if [ -d ${PREFIX}/.privatekeys/${DOMAIN} ]; then
    echo "Directory for private keys for the domain ${DOMAIN} exists."
    exit 1
else
    mkdir --mode=755 -p ${PREFIX}/.privatekeys/${DOMAIN}
fi

if [ -d ${PREFIX}/.publickeys/${DOMAIN} ]; then
    echo "Directory for private keys for the domain ${DOMAIN} exists."
    exit 1
else
    mkdir --mode=755 -p ${PREFIX}/.publickeys/${DOMAIN}
fi

if [[ ${USE_DKIM} -eq "1" || ${USE_DOMAINKEYS} -eq "1" ]]; then
    echo "Generating the private key for ${DOMAIN}"
    ${OPENSSL} genrsa -out ${PREFIX}/.privatekeys/${DOMAIN}/${SELECTOR} 1024 > /dev/null
    echo "Generating the public key for ${DOMAIN}"
    ${OPENSSL} rsa -in ${PREFIX}/.privatekeys/${DOMAIN}/${SELECTOR} -out ${PREFIX}/.publickeys/${DOMAIN}/${SELECTOR}.public.key -pubout -outform PEM > /dev/null
    # Prepare the key
    keydata=$(grep -v '^-' ${PREFIX}/.publickeys/${DOMAIN}/${SELECTOR}.public.key)
    pubkey=$(echo ${keydata} | sed 's/ //g')
fi

# Process dk-milter
if [ ${USE_DKIM} -eq "1" ]; then
    if [ -d ${PREFIX}/opendkim/keys/${DOMAIN} ]; then
	echo "DKIM directory for private keys for the domain ${DOMAIN} exists."
	exit 1
    else
	mkdir --mode=755 -p ${PREFIX}/opendkim/keys/${DOMAIN}
	install --owner=opendkim --group=opendkim --mode=400 ${PREFIX}/.privatekeys/${DOMAIN}/${SELECTOR} ${PREFIX}/opendkim/keys/${DOMAIN}/${SELECTOR}
	echo "${SELECTOR}._domainkey.${DOMAIN} ${DOMAIN}:${SELECTOR}:${PREFIX}/opendkim/keys/${DOMAIN}/${SELECTOR}" >> ${PREFIX}/opendkim/keyTable
	echo "*@${DOMAIN} ${SELECTOR}._domainkey.${DOMAIN}" >> ${PREFIX}/opendkim/signingTable
	/usr/sbin/service opendkim restart
    fi
else
    echo "DKIM signature is not used. Skipping."
fi

# Process Domainkeys
if [ ${USE_DOMAINKEYS} -eq "1" ]; then
    if [ -d ${PREFIX}/domainkeys/privatekeys/${DOMAIN} ]; then
	echo "Domainkeys directory for private keys for the domain ${DOMAIN} exists."
	exit 1
    else
	mkdir --mode=755 -p ${PREFIX}/domainkeys/privatekeys/${DOMAIN}
	install --owner=postfix --group=root --mode=400 ${PREFIX}/.privatekeys/${DOMAIN}/${SELECTOR} ${PREFIX}/domainkeys/privatekeys/${DOMAIN}/${SELECTOR}
	echo "*@${DOMAIN}:${PREFIX}/domainkeys/privatekeys/${DOMAIN}/${SELECTOR}" >> ${PREFIX}/domainkeys/keys
	echo "${DOMAIN}" >> ${PREFIX}/domainkeys/domains
	/usr/sbin/service dk-filter restart
    fi
else
    echo "Domainkeys signature is not used. Skipping."
fi

echo "From: Postfix Admin <${POSTMASTER}>" >> ${MAILTMPFFILE}
echo "To: ${ADMINMAIL}" >> ${MAILTMPFFILE}
echo "Subject: Domain ${DOMAIN} was added, DNS intervention is needed" >> ${MAILTMPFFILE}
echo "MIME-Version: 1.0" >> ${MAILTMPFFILE}
echo "Content-Type: text/plain; charset=us-ascii" >> ${MAILTMPFFILE}
echo "X-Priority: 1" >> ${MAILTMPFFILE}
echo "X-MSMail-Priority: High" >> ${MAILTMPFFILE}
echo "" >> ${MAILTMPFFILE}
echo "Publish these NS records:" >> ${MAILTMPFFILE}
echo "_domainkey.${DOMAIN}              IN      TXT \"o=-\"" >> ${MAILTMPFFILE}
echo "_adsp._domainkey.${DOMAIN}        IN      TXT \"dkim=all\"" >> ${MAILTMPFFILE}
echo "${SELECTOR}._domainkey.${DOMAIN}  IN      TXT \"v=DKIM1; k=rsa; p=${pubkey}\"" >> ${MAILTMPFFILE}
echo "" >> ${MAILTMPFFILE}
echo "" >> ${MAILTMPFFILE}
echo "" >> ${MAILTMPFFILE}
echo "--" >> ${MAILTMPFFILE}
echo "Thanks," >> ${MAILTMPFFILE}
echo "Postfix Administrator                         mailto:${POSTMASTER}" >> ${MAILTMPFFILE}

cat ${MAILTMPFFILE} | ${SENDMAIL} -f ${POSTMASTER} -t
unlink ${MAILTMPFFILE}


Связка работает с постфиксом, но двумя взмахами напильника можно приловчить на Exim тоже.
Да, кстате… Товарищи, если шлёте почту на буржуев, то не забывайте про Feedback Loops:
mail.live.com/mail/services.aspx#JMRPP
feedbackloop.yahoo.net/
fbl.hostedemail.com/
postmaster.aol.com/SupportRequest.php
feedback.comcast.net/

После этого к вам начнут поступать отчёты в т.н. формате ARF (вложения типа message/feedback-report).
Также немаловажно переваривать bounce-messages (т.е. отлупы о том, что письма не доставлены адресату по тем или иным причинам (не верно указан адрес получателя, на получателе закончилось место и т.д. — можно заюзать тот же перловский Mail::DeliveryStatus::BounceParser ).

И сообщите им же, что вы хотите слать МНОГО почты:
postmaster.aol.com/cgi-bin/whitelist/whitelist_guides.pl
help.yahoo.com/l/us/yahoo/mail/postmaster/bulkv2.html
Порадовало, комментарий может потягаться с самой статьёй.
У вас exim сам подписывает сообщения, и никакой ему opendkim не нужен. В вашем случае, opendkim понадобился только для генерации ключей (хоть и можно было обойтись без него) Вот тут написано:
As of version 4.70, Exim has native support for DKIM.
Only those users with full accounts are able to leave comments. Log in, please.