Я прочитал МНОГО мест, где люди пытались решить эту проблему, и ни одно из них не помогло мне. У меня есть следующий сценарий
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
msg = MIMEMultipart('alternative')
msg['Subject'] = "[Test Email]"
msg['From'] = "email@domain.biz"
msg['To'] = "email@domain.com"
text = "sample Email"
html = "<html><body>sampleEmail</body></html>"
textPart = MIMEText(text, 'plain')
htmlPart = MIMEText(html, 'html')
msg.attach(textPart)
msg.attach(htmlPart)
s = smtplib.SMTP("localhost")
s.set_debuglevel(1)
s.sendmail("email@domain.biz","email@domain.com", msg.as_string())
s.quit()
Когда я запускаю сценарий на сервере a (назовите его domain.com), все работает, как ожидалось. Когда я запускаю сценарий на сервере b (назовите его domain.biz), я получаю отказ в ретрансляционном доступе. На сервере b я попытался настроить свой собственный экземпляр postfix для domain.biz (и безуспешно), и я мог что-то испортить.
Все, что я прочитал, говорит о том, что локальный SMTP-сервер не позволяет ретранслировать на (или от?) Этот адрес. Кто-то посоветовал мне убедиться smtpd_recipient_restrictions
включает permit_mynetworks
:
sudo postconf smtpd_recipient_restrictions
который напечатал:
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
Так что все выглядит хорошо (может быть проблема в reject_unauth_destination?).
Затем они сказали, что убедитесь, что IP-адрес включен в mynetworks, поэтому:
sudo postconf mynetworks
который печатает:
mynetworks = 10.0.0.0/16, 192.168.1.0/24, 127.0.0.0/8, 55.55.55.0/24, .domain.com, .domain.biz, .ip-55-55-55-55.ip.secureserver.net
Как видите, я добавил все домены, которые только мог придумать. (примечание 55.55.55.55 не настоящий IP).
В сообщении об ошибке говорится:
python2.7 emailTest.py
send: 'ehlo localhost.localdomain\r\n'
reply: '250-domain.biz\r\n'
reply: '250-PIPELINING\r\n'
reply: '250-SIZE 10240000\r\n'
reply: '250-VRFY\r\n'
reply: '250-ETRN\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250-8BITMIME\r\n'
reply: '250 DSN\r\n'
reply: retcode (250); Msg: domain.biz
PIPELINING
SIZE 10240000
VRFY
ETRN
ENHANCEDSTATUSCODES
8BITMIME
DSN
send: 'mail FROM:<email@domain.biz> size=565\r\n'
reply: '250 2.1.0 Ok\r\n'
reply: retcode (250); Msg: 2.1.0 Ok
send: 'rcpt TO:<email@domain.com>\r\n'
reply: '554 5.7.1 <email@domain.com>: Relay access denied\r\n'
reply: retcode (554); Msg: 5.7.1 <email@domain.com>: Relay access denied
send: 'rset\r\n'
reply: '250 2.0.0 Ok\r\n'
reply: retcode (250); Msg: 2.0.0 Ok
Traceback (most recent call last):
File "emailTest.py", line 122, in <module>
s.sendmail("email@domain.biz","email@domain.com", msg.as_string())
File "/usr/local/lib/python2.7/smtplib.py", line 734, in sendmail
raise SMTPRecipientsRefused(senderrs)
smtplib.SMTPRecipientsRefused: {'email@domain.com': (554, '5.7.1 <email@domain.com>: Relay access denied')}
Дополнительная информация main.cf:
> sudo postconf mydestination
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, mail.$mydomain, www.$mydomain, ftp.$mydomain
> sudo postconf relay_domains
relay_domains = $mydestination
> sudo postconf mynetworks_style
mynetworks_style = subnet
> sudo postconf relayhost
relayhost =
>sudo postconf mydomain
mydomain = domain.biz
Я также пробовал:
sudo postconf relayhost
relayhost = [mail.$mydomain]
Журнал Postfix говорит:
> sudo tail -10 /var/log/maillog
...
Jan 21 12:26:36 ip-50-62-42-49 postfix/smtpd[3875]: connect from localhost[::1]
Jan 21 12:26:36 ip-50-62-42-49 postfix/trivial-rewrite[3877]: warning: do not list domain domain.biz in BOTH mydestination and virtual_alias_domains
Jan 21 12:26:36 ip-50-62-42-49 postfix/smtpd[3875]: NOQUEUE: reject: RCPT from localhost[::1]: 554 5.7.1 <email@domain.com>: Relay access denied; from=<email@domain.biz> to=<email@domain.com> proto=ESMTP helo=<localhost.localdomain>
Jan 21 12:26:36 ip-50-62-42-49 postfix/smtpd[3875]: lost connection after RSET from localhost[::1]
Jan 21 12:26:36 ip-50-62-42-49 postfix/smtpd[3875]: disconnect from localhost[::1]
sudo postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 1
html_directory = no
inet_interfaces = all
inet_protocols = all
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
masquerade_domains = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, mail.$mydomain, www.$mydomain, ftp.$mydomain
mydomain = domain.biz
myhostname = domain.biz
mynetworks = 10.0.0.0/16, 192.168.1.0/24, 127.0.0.0/8, 55.55.55.0/24, .domain.com, .domain.biz, .ip-55-55-55-55.ip.secureserver.net
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES
relayhost = [mail.$mydomain]
sample_directory = /usr/share/doc/postfix-2.6.6/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
unknown_local_recipient_reject_code = 550
virtual_alias_domains = domain.biz
virtual_alias_maps = hash:/etc/postfix/virtual
Я изменил IP-адреса и ip-адреса.
ОБНОВИТЬ:
После нескольких недель попыток заставить это работать и благодаря всеобщей помощи я нашел решение. Я пытался использовать localhost в качестве relayhost, но поскольку это сервер, размещенный Godaddy, все реле должны проходить через назначенный relayhost. Все, что мне нужно было сделать, это изменить расположение SMTP. Строка теперь такая:
s = smtplib.SMTP("dedrelay.secureserver.net")
Есть несколько областей, которые вам (возможно) потребуется настроить в /etc/postfix/main.cf. Если вы, например, используете smtp-сервер вашего веб-хоста в качестве ретранслятора, вам следует поискать раздел с «relayhost =».
В соответствии с Какой способ доставки: прямой или косвенный:
По умолчанию Postfix пытается доставлять почту напрямую в Интернет. В зависимости от ваших местных условий это может быть невозможно или нежелательно. Например, ваша система может быть отключена в нерабочее время, может быть защищена брандмауэром или может быть подключена через поставщика, который не разрешает прямую почтовую рассылку в Интернет. В таких случаях вам необходимо настроить Postfix для косвенной доставки почты через хост-ретранслятор.
Примеры (укажите только один из следующих):
/etc/postfix/main.cf: relayhost = (default: direct delivery to Internet) relayhost = $mydomain (deliver via local mailhub) relayhost = [mail.$mydomain] (deliver via local mailhub) relayhost = [mail.isp.tld] (deliver via provider mailhub)
Форма, заключенная в [], исключает поиск DNS MX. Не волнуйтесь, если вы не знаете, что это значит. Просто не забудьте указать [] вокруг имени хоста mailhub, которое вам дал ваш провайдер, иначе почта может быть доставлена неправильно.
В вашей конфигурации по умолчанию должно быть что-то вроде указанного выше. Выберите допустимую конфигурацию на основе ваших настроек и закомментируйте остальные.
Я также предлагаю просмотреть другие разделы, касающиеся реле и конфигурации сети, чтобы узнать, соответствуют ли ваши настройки спецификации: Базовая конфигурация Postfix