我正在嘗試從我們的 AWS EC2 執行個體取得電子郵件報告。我們正在使用 Exchange Online(Microsoft 線上服務的一部分)。我特別設定了一個使用者帳戶SMTP 中繼,並且我已經設定了 Postfix 來滿足透過該伺服器中繼訊息的所有要求。但是,除非寄件者位址與驗證位址完全匹配,否則 Exchange Online 的 SMTP 伺服器將拒絕郵件(錯誤訊息為550 5.7.1 Client does not have permissions to send as this sender
)。
透過仔細配置,我可以將我的服務設定為以該用戶身份發送。但我不太喜歡小心——我寧願讓 postfix 強制解決這個問題。有沒有辦法做到這一點?
答案1
這就是在 postfix 中真正做到的方法。
此設定變更本地發起和中繼的 SMTP 郵件流量的寄件者位址:
/etc/postfix/main.cf:
sender_canonical_classes = envelope_sender, header_sender
sender_canonical_maps = regexp:/etc/postfix/sender_canonical_maps
smtp_header_checks = regexp:/etc/postfix/header_check
重寫來自伺服器本身的電子郵件的信封位址
/etc/postfix/sender_canonical_maps:
/.+/ [email protected]
從 SMTP 中繼電子郵件中的位址重寫
/etc/postfix/header_check:
/From:.*/ REPLACE From: [email protected]
例如,如果您使用所有多功能設備和多個應用程式使用的本地中繼 smtp 伺服器,那麼這非常有用。
如果您使用 Office 365 SMTP 伺服器,則任何寄件者位址與經過驗證的使用者本身的電子郵件不同的郵件都將被拒絕。上面的配置可以防止這種情況發生。
答案2
可選的通用的表指定從伺服器傳遞(發送)郵件時應用的位址對映。
這與以下相反典範映射,在伺服器收到郵件時應用。
(注意:FROM 和 TO 位址都符合以取代任何通用表和規範表。)
郵件發送時使用規格表伺服器收到其他答案已經解釋過。
當郵件發送時,您可以重寫 FROM 位址從伺服器發送使用smtp_generic_maps
。
根據後綴文檔:
/etc/postfix/main.cf:
smtp_generic_maps = hash:/etc/postfix/generic
/etc/postfix/generic:
[email protected] [email protected]
@localdomain.local [email protected]
然後做:
sudo postmap /etc/postfix/generic
sudo /etc/init.d/postfix reload
參考:
答案3
更新:根據一位 IT 朋友的建議,我在所有伺服器上運行 postfix,而不是製作一台雲端郵件伺服器。到目前為止,這是我的解決方案:
/etc/postfix/main.cf
# output of hostname -f - mail from local users appears to come from here
myhostname = domU-01-02-03-04-05-06.compute-1.internal
# Local delivery - include all 127.0.0.1 aliases from /etc/hosts
mydestination = $myhostname, $mydomain, rest_of_entries_from_hosts
# Needed for address translation to work
myorigin = $mydomain
# Talking to MS Online
# :submission = port 587
relayhost = [smtp.mail.microsoftonline.com]:submission
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = # Yes, leave empty
smtp_tls_security_level = encrypt
smtp_generic_maps = hash:/etc/postfix/generic
# Enable if you need debugging, but it does leak credentials to the log
#debug_peer_level = 2
#debug_peer_list = smtp.mail.microsoftonline.com
# Only listen on the local interfaces (not the public)
inet_interfaces = localhost
# I left out a bunch of CentOS defaults. postconf -n is your friend.
# These are included
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
/etc/postfix/sasl_passwd
# Run postmap /etc/postfix/sasl_passwd after editing
# Also, chown root:root; chmod 600
smtp.mail.microsoftonline.com [email protected]:YourP@ssw0rd
/etc/postfix/generic
# Run postmap /etc/postfix/generic
# I've seen local mail come from either source
# output of dnsdomainname
@compute-1.internal [email protected]
# output of hostname -f
@domU-01-02-03-04-05-06.compute-1.internal [email protected]
/etc/aliases
# Run newaliases after changing
# Lot of stuff here. Mostly, just make sure the graph points to root, such as
mailer-daemon: postmaster
postmaster: root
# And the important part - your email or distribution group
root: [email protected]
/etc/passwd
# Sometimes it helps to expand the name, so email comes from 'root at aws host 5'
# rather than just 'root'
# Was
#root:x:0:0:root:/root:/bin/bash
# Is
root:x:0:0:root on aws host 5:/root:/bin/bash
我高興的事:
- 許多郵件被傳送到 root,並且一行指示
alias
誰接收它。 - 所有來自本機使用者的郵件都會轉換為來自
[email protected]
,因此它會透過 MS Online SMTP 伺服器。 - postfix 有比 sendmail 更好的文件。
我不高興的事:
- 每個主機都需要進行自訂更改,並且需要執行幾個步驟。我寫了一個 bash 腳本來提供幫助。
- 名稱
passwd
技巧並不總是有效,而且很難確定郵件來自哪個伺服器。 - 每封發送的郵件都會在日誌中放置三個警告:
warning: smtp.mail.microsoftonline.com[65.55.171.153] offered null AUTH mechanism list
AUTH
(SMTP 伺服器在 之前STARTTLS
但之後發送空列表AUTH LOGIN
)。certificate verification failed for smtp.mail.microsoftonline.com: num=20:unable to get local issuer certificate
(憑證有一些設定選項,但我不確定續訂憑證時郵件傳送是否會中斷)certificate verification failed for smtp.mail.microsoftonline.com: num=27:certificate not trusted
(與#2相同)
感謝 serverfault 社群分享有關郵件伺服器的強烈意見。
答案4
與正規表示式相比,一個更簡單的答案(根據@Jasper的答案)是使用靜態查找:
sender_canonical_maps = static:[email protected]
static
總是傳回相同的值(https://www.postfix.org/DATABASE_README.html#types)