web-development-kb-asia.site

Gửi thư qua sendmail từ python

Nếu tôi muốn gửi thư không qua SMTP, mà là qua sendmail, có thư viện nào cho python đóng gói quy trình này không?

Tốt hơn nữa, có một thư viện tốt trừu tượng hóa toàn bộ lựa chọn 'sendmail -versus- smtp' không?

Tôi sẽ chạy tập lệnh này trên một loạt các máy chủ unix, chỉ một số trong số đó đang nghe trên localhost: 25; một vài trong số này là một phần của các hệ thống nhúng và không thể được thiết lập để chấp nhận SMTP.

Là một phần của Thực hành tốt, tôi thực sự muốn thư viện tự xử lý các lỗ hổng tiêm tiêu đề - vì vậy chỉ cần bỏ một chuỗi vào popen('/usr/bin/sendmail', 'w') gần với kim loại hơn tôi muốn.

Nếu câu trả lời là 'hãy viết một thư viện,' vậy thôi ;-)

70
Nate

Tiêu đề tiêm không phải là một yếu tố trong cách bạn gửi thư, đó là một yếu tố trong cách bạn xây dựng thư. Kiểm tra gói email , xây dựng thư với nó, tuần tự hóa nó và gửi nó đến /usr/sbin/sendmail bằng cách sử dụng mô đun quy trình con :

from email.mime.text import MIMEText
from subprocess import Popen, PIPE

msg = MIMEText("Here is the body of my message")
msg["From"] = "[email protected]"
msg["To"] = "[email protected]"
msg["Subject"] = "This is the subject."
p = Popen(["/usr/sbin/sendmail", "-t", "-oi"], stdin=PIPE)
p.communicate(msg.as_string())
116
Jim

Đây là một hàm python đơn giản sử dụng sendmail unix để gửi thư.

def sendMail():
    sendmail_location = "/usr/sbin/sendmail" # sendmail location
    p = os.popen("%s -t" % sendmail_location, "w")
    p.write("From: %s\n" % "[email protected]")
    p.write("To: %s\n" % "[email protected]")
    p.write("Subject: thesubject\n")
    p.write("\n") # blank line separating headers from body
    p.write("body of the mail")
    status = p.close()
    if status != 0:
           print "Sendmail exit status", status
34
Pieter

Câu trả lời của Jim không hoạt động với tôi trong Python 3.4. Tôi đã phải thêm một đối số universal_newlines=True Bổ sung vào subrocess.Popen()

from email.mime.text import MIMEText
from subprocess import Popen, PIPE

msg = MIMEText("Here is the body of my message")
msg["From"] = "[email protected]"
msg["To"] = "[email protected]"
msg["Subject"] = "This is the subject."
p = Popen(["/usr/sbin/sendmail", "-t", "-oi"], stdin=PIPE, universal_newlines=True)
p.communicate(msg.as_string())

Nếu không có universal_newlines=True Tôi nhận được

TypeError: 'str' does not support the buffer interface
10
MEI

Điều khá phổ biến là chỉ sử dụng lệnh sendmail từ Python bằng os.popen

Cá nhân, đối với các tập lệnh tôi không tự viết, tôi nghĩ chỉ cần sử dụng giao thức SMTP là tốt hơn, vì nó sẽ không yêu cầu cài đặt nói rằng một bản sao sendmail chạy trên windows.

https://docs.python.org/l Library/smtplib.html

3
tovare

Câu hỏi này rất cũ, nhưng đáng lưu ý rằng có một hệ thống gửi thư điện tử và xây dựng thư được gọi là Marrow Mailer (trước đây là TurboMail) đã có sẵn từ trước khi tin nhắn này được hỏi.

Hiện tại nó đang được chuyển sang hỗ trợ Python 3 và được cập nhật như một phần của bộ Marrow .

3
amcgregor