Комментарии 6
1. Как это реализовать на CentOS 5?
2. Через что отправляете письма? PHP — mail()?
2. Через что отправляете письма? PHP — mail()?
А зачем opendkim нужно запускать? Я ключи еще dkim-filter генерировал, а сейчас использую только exim4 без каких-либо dkim пакетов, и работает.
Если доменов много, то делаю так (у меня на Ubuntu 10.04 стоит dk-milter и OpenDKIM):
/etc/default/opendkim
/etc/opendkim.conf
/etc/default/dk-filter
Ну, и генерация ключиков
Связка работает с постфиксом, но двумя взмахами напильника можно приловчить на 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
/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 для массовых рассылок