Chạy script khi nhận email


8

Tôi chạy một máy chủ thư Postfix / Dovecot để sử dụng cá nhân. Chỉ có một số hộp thư thực tế, về cơ bản là postmaster@domain.comusername@domain.com.

Tôi thường xuyên sử dụng virtualtệp để tạo hộp thư ảo được chuyển tiếp đến username@domain.com. Tôi có một số trong số này cho các tài khoản vứt đi như mua một lần từ các cửa hàng trực tuyến, trò chơi trực tuyến tôi muốn thử mà không phải lo lắng về thư rác đang diễn ra, v.v. Để làm như vậy, tôi SSH và chạy các lệnh sau:

sudo vim /etc/postfix/virtual
# add a line that looks like:
# # username_servicename@domain.com      username@domain.com
sudo postmap virtual
sudo service postfix restart

Tôi làm điều này với tần suất đủ để tôi muốn tự động hóa quá trình ở một mức độ nào đó. Tôi đã xem xét đơn giản là viết một tập lệnh shell lấy hộp thư ảo và hộp thư thực làm đối số và tự thực hiện các thay đổi, nhưng tôi hy vọng điều gì đó thậm chí còn thuận lợi hơn.

Tôi muốn có thể gửi email từ username@domain.commột số hộp thư khác trên máy chủ với tên hộp thư ảo là phần thân của thư. Vấn đề sẽ là các sudocuộc gọi nhưng tôi có thể tạo một người dùng mới có trách nhiệm duy nhất là xử lý việc này sẽ xử lý việc đó.

Chủ yếu là câu hỏi này: làm thế nào tôi có thể tạo một sự kiện sẽ được kích hoạt bởi một email? Có một dịch vụ ở đâu đó làm điều này? Tôi có thể định cấu hình Postfix hoặc Dovecot để nghe email đó và chạy các lệnh trong sự kiện đó không?


Bạn đã kiểm tra liên kết này ?
kirill-a

@ kirill-a không tôi không có. Có vẻ như điều đó có thể được dự định để giải quyết vấn đề này, và bây giờ tôi cuối cùng cũng có lý do chính đáng để học PHP
Adam Smith

Bạn không cần phải học PHP: chỉ cần thay thế tập lệnh shell của riêng bạn thành tập lệnh PHP và bạn đã hoàn thành.
MariusMatutiae

@MariusMatutiae nếu bạn hoặc kirill-a muốn viết một câu trả lời về chủ đề này (giả sử nó hoạt động) Tôi sẽ vui vẻ trao tiền thưởng
Adam Smith

@ kirill - một ping lịch sự cho nhận xét của tôi, ở trên.
Adam Smith

Câu trả lời:


8

Quy trình đúng để thực thi tập lệnh (tôi sử dụng tập lệnh shell) khi nhận được thư mail là như sau. Nó liên quan đến việc sửa đổi tệp cấu hình của postfix , master.cf (trong Debian của tôi, được đặt trong / etc / postfix ) bằng cách thêm dòng sau:

 my_shell_script unix - n n - - pipe flags=F user=MY_USERNAME argv=/path/to/my/shell/script ${sender} ${size} ${recipient}

hướng dẫn postfix để chạy tập lệnh (bạn cần làm cho nó có thể thực thi được) khi một số sự kiện xảy ra.

Để chỉ định thời điểm thực thi tập lệnh, bạn thực hiện như sau: giả sử bạn muốn tập lệnh được thực thi khi username@domain.com nhận được tin nhắn. Đặt dòng sau

 username@domain.com FILTER my_shell_script:dummy

bên trong tệp /etc/postfix/address.txt ; bạn sẽ cần tạo một cơ sở dữ liệu thích hợp cho postfix để sử dụng tệp này mà bạn thực hiện bằng phương tiện

  postmap /etc/postfix/address.txt

tạo ra một tệp có tên là /etc/postfix/address.db . Bây giờ hãy quay lại tệp /etc/postfix/main.cf và thêm dòng sau:

 smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/access, permit_mynetworks, reject_unauth_destination

Bây giờ khởi động lại postfix ,

  postfix reload

và bạn nên đi thật tốt


2
Ý bạn là 'check_recipient_access băm: / etc / postfix / address' ở đây? Bạn đã sử dụng "quyền truy cập" trong đó tôi nghĩ bạn có nghĩa là "địa chỉ", dựa trên hướng dẫn của bạn.
Lee Fuller

3
Điều này có giống nhau không nếu bạn đang chạy virtual_mailboxes cho các miền ảo khác nhau? Tôi đã làm theo các hướng dẫn này nguyên văn - và nếu tôi không khai báo virtual_alias, tôi sẽ bị trả lại. Nếu tôi làm, nó sẽ gửi tin nhắn đến hộp thư nhưng không kích hoạt tập lệnh.
Lee Fuller

Tôi đã không làm điều này để làm việc. Câu trả lời này đã có hiệu quả: serverfault.com/questions/322657/ấc
jlh 19/03/19

Từ những gì tôi hiểu, giải pháp này cũng có một vấn đề là nó sẽ chỉ kích hoạt các tin nhắn nhận được qua SMTP. sendmailtrực tiếp trên máy chủ sẽ không kích hoạt này.
Philip Couling

@PhilipCouling Xem câu trả lời này: unix.stackexchange.com/a/179407 . Bạn có thể sử dụng pickuptùy chọn.
Stephan

4

Tôi có thể thấy hai giải pháp rõ ràng.

Nếu bạn đang sử dụng procmail làm MDA trên máy chủ của mình hoặc sẵn sàng chuyển đổi sang sử dụng nó, thì bạn có thể chạy bất kỳ tập lệnh tùy ý nào trên bất kỳ email tùy ý nào thông qua |hành động công thức (ống) của procmail . Hy vọng rằng nó sẽ không được bắt đầu với quyền root, nhưng thật dễ dàng để tạo một tập lệnh thực hiện phép thuật cần thiết và có thể được gọi bằng mật khẩu với quyền root bởi người dùng có liên quan. Đầu ra của tập lệnh thậm chí có thể được đưa trở lại vào cùng một email và email được gửi sau đó bằng cách biến công thức thành hành động lọc.

Một cách khác (cần ít bảo trì thực hành hơn) là tạo một hộp thư duy nhất và định cấu hình Postfix$recipient_delimiter là thứ thường không được sử dụng cho mục đích đó; ví dụ, .hoặc -. Lưu ý rằng receive_delimet là cài đặt toàn máy chủ. Giả sử bạn thiết lập hộp thư dummy@example.comvà thiết lập $recipient_delimeter = .. Điều này sau đó sẽ cho phép dummy.<anything>@example.comsẽ gửi đến hộp thư cục bộ tương ứng dummy@example.com. Để vô hiệu hóa một trong số này, hãy thêmdummy.<whatever>@example.comđến một bảng người nhận thích hợp với một hành động từ chối. Nhược điểm là nó sẽ là một hộp thư bắt tất cả cho tiền tố, vì vậy bạn sẽ muốn làm cho tiền tố khó bị vấp ngã do tai nạn hoặc tấn công từ điển. Ưu điểm là trong trường hợp bình thường (người gửi tôn trọng mong muốn của bạn và không bán lại địa chỉ email của bạn) phương pháp này không cần bảo trì và bạn luôn có thể thay đổi tiền tố của mình sau đó và liệt kê rõ ràng những kết hợp mà bạn muốn tiếp tục nhận thư .


Tôi không bị ràng buộc với Postfix vì bất kỳ lý do nào khác ngoài những gì tôi hiện có. Tuy nhiên, tôi muốn tìm một giải pháp hoạt động với MDA / MTA hiện tại của tôi. Về phần phân định: Tôi hầu như không tin rằng người gửi sẽ tôn trọng mong muốn của tôi và không bán lại địa chỉ email của tôi, hoặc tôi sẽ cung cấp cho họ địa chỉ thường trú :)
Adam Smith

@AdamSmith Sự khác biệt là, với thứ gì đó giống như sự thay thế thứ hai của tôi, bạn có thể vô hiệu hóa địa chỉ mà bạn đã cung cấp cho một thực thể cụ thể mà không gây ra vấn đề ở bất kỳ nơi nào khác và các địa chỉ trông có vẻ hợp lý ngay cả khi xác minh tự động câm. Đối với việc giữ MDA / MTA, procmail có thể được sử dụng như một sự thay thế thả xuống cho MDA Postfix; không cần thay thế Postfix như MTA của bạn.
một CVn

procmail không được duy trì nữa: xem lwn.net/Articles/416901 , một bài viết có tiêu đề: Báo cáo về cái chết của procmail không được phóng đại quá mức. Tốt hơn là chơi an toàn và làm theo đề xuất của @ kirill-a.
MariusMatutiae

procmail vẫn được sử dụng nhiều và (IMHO) vẫn là giải pháp tốt nhất để lọc ad hoc. Ghi chú của @ MariusMatutiae về việc nó thực sự đã chết chỉ áp dụng cho sự phát triển của nó. Tôi không thể nghĩ ra bất kỳ lỗi procmail nào mà tôi từng gặp phải và tôi đã làm những điều lố bịch như triển khai danh sách gửi thư đầy đủ trong đó. Có lẽ nó đã không nhận được sự phát triển hơn nữa bởi vì hướng duy nhất để thực hiện nó sẽ vượt ra ngoài phạm vi của nó (ví dụ: chống thư rác, được SpamAssassin phục vụ tốt hơn hoặc ví dụ như milter-greylist ).
Adam Katz

Và bạn đang nói điều này với tôi bởi vì ....?
MariusMatutiae

2

Trong trường hợp nếu liên kết đi xuống, đây là tóm tắt.

Đầu tiên, hãy đến master.cfvà đăng ký tập lệnh "myhook" của bạn bằng cách thêm dòng sau:

myhook unix - n n - - pipe flags=F user=www-data argv=/path/to/script.sh ${sender} ${size} ${recipient}

Ngoài ra, chỉnh sửa dòng smtp để báo cho Postfix chạy bộ lọc cho bất kỳ thư nào đến thông qua phân phối SMTP:

smtp inet n - - - - smtpd -o content_filter=myhook:dummy

Xin lưu ý rằng nếu bạn đang gửi thư bằng lệnh "sendmail", bộ lọc sẽ không kích hoạt. Trong trường hợp này, thêm tùy chọn sau phương thức phân phối "đón":

pickup fifo n - - 60 1 pickup -o content_filter=myhook:dummy

Khởi động lại hậu tố: postfix reload

Làm cho tập lệnh của bạn có thể đọc và thực thi được bởi bất kỳ ai: chmod +rx script.sh

Lưu ý rằng tập lệnh luôn được kích hoạt cho bất kỳ thư đến. Để chỉ định địa chỉ chính xác, xem câu trả lời @MariusMatutiae.


điều đó đã cho tôi "lỗi vận chuyển thư không xác định" ...
user1133275
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.