2009-05-28 36 views
43

Tôi đã chơi xung quanh với mô-đun email trong python nhưng tôi muốn có thể biết cách nhúng hình ảnh được bao gồm trong html.Gửi các email html nhiều phần có chứa hình ảnh được nhúng

Vì vậy, ví dụ nếu cơ thể là một cái gì đó giống như

<img src="../path/image.png"></img> 

Tôi muốn nhúng image.png vào email, và các thuộc tính src nên được thay thế bằng content-id. Có ai biết làm thế nào để làm điều này?

Trả lời

102

Dưới đây là ví dụ tôi đã tìm thấy.

Recipe 473810: Send an HTML email with embedded image and plain text alternate:

HTML là phương pháp lựa chọn cho những người có nhu cầu để gửi email với nội dung phong phú, bố trí và đồ họa. Thường thì nó là mong muốn nhúng đồ họa trong thư để người nhận có thể hiển thị trực tiếp thông báo thư, mà không cần thêm lượt tải xuống.

Một số tác nhân thư không hỗ trợ HTML hoặc người dùng của họ muốn nhận được tin nhắn văn bản đơn giản . Người gửi HTML thư phải bao gồm văn bản thuần túy thư thay thế cho những người dùng này.

Công thức này sẽ gửi một thông báo HTML ngắn với một hình ảnh được nhúng duy nhất và một văn bản thuần tuý thay thế .

# Send an HTML email with an embedded image and a plain text message for 
# email clients that don't want to display the HTML. 

from email.MIMEMultipart import MIMEMultipart 
from email.MIMEText import MIMEText 
from email.MIMEImage import MIMEImage 

# Define these once; use them twice! 
strFrom = '[email protected]' 
strTo = '[email protected]' 

# Create the root message and fill in the from, to, and subject headers 
msgRoot = MIMEMultipart('related') 
msgRoot['Subject'] = 'test message' 
msgRoot['From'] = strFrom 
msgRoot['To'] = strTo 
msgRoot.preamble = 'This is a multi-part message in MIME format.' 

# Encapsulate the plain and HTML versions of the message body in an 
# 'alternative' part, so message agents can decide which they want to display. 
msgAlternative = MIMEMultipart('alternative') 
msgRoot.attach(msgAlternative) 

msgText = MIMEText('This is the alternative plain text message.') 
msgAlternative.attach(msgText) 

# We reference the image in the IMG SRC attribute by the ID we give it below 
msgText = MIMEText('<b>Some <i>HTML</i> text</b> and an image.<br><img src="cid:image1"><br>Nifty!', 'html') 
msgAlternative.attach(msgText) 

# This example assumes the image is in the current directory 
fp = open('test.jpg', 'rb') 
msgImage = MIMEImage(fp.read()) 
fp.close() 

# Define the image's ID as referenced above 
msgImage.add_header('Content-ID', '<image1>') 
msgRoot.attach(msgImage) 

# Send the email (this example assumes SMTP authentication is required) 
import smtplib 
smtp = smtplib.SMTP() 
smtp.connect('smtp.example.com') 
smtp.login('exampleuser', 'examplepass') 
smtp.sendmail(strFrom, strTo, msgRoot.as_string()) 
smtp.quit() 
+0

Phần lớn cảm ơn, tôi đã cố gắng rất nhiều giải pháp, Đây là một trong những hoạt động hoàn hảo! – wukong

+0

@Andrew Hare: Có hai chế độ xem nhiều phần (hai phiên bản msgText). Tôi không thấy loại nội dung được chỉ định cho từng loại nội dung. Làm thế nào để hệ thống nhận biết được kết xuất cho Html? –

+0

Tôi đã thêm msgText.replace_header ('Content-Type', 'text/html') cho phiên bản msgText thứ hai. –

1

Đối với phiên bản Python 3.4 trở lên

Câu trả lời được chấp nhận là tuyệt vời, nhưng cũ. Tôi nghĩ rằng nó cần một bản cập nhật.

Đây là cách bạn có thể làm điều đó trong các phiên bản mới hơn Python (3.4 trở lên):

from email.message import EmailMessage 
from email.utils import make_msgid 
import mimetypes 

msg = EmailMessage() 

# generic email headers 
msg['Subject'] = 'Hello there' 
msg['From'] = 'ABCD <[email protected]>' 
msg['To'] = 'PQRS <[email protected]>' 

# set the plain text body 
msg.set_content('This is a plain text body.') 

# now create a Content-ID for the image 
image_cid = make_msgid(domain='xyz.com') 
# if `domain` argument isn't provided, it will 
# use your computer's name 

# set an alternative html body 
msg.add_alternative("""\ 
<html> 
    <body> 
     <p>This is an HTML body.<br> 
      It also has an image. 
     </p> 
     <img src="cid:{image_cid}"> 
    </body> 
</html> 
""".format(image_cid=image_cid[1:-1]), subtype='html') 
# image_cid looks like <[email protected]> 
# to use it as the img src, we don't need `<` or `>` 
# so we use [1:-1] to strip them off 


# now open the image and attach it to the email 
with open('path/to/image.jpg', 'rb') as img: 

    # know the Content-Type of the image 
    maintype, subtype = mimetypes.guess_type(img.name)[0].split('/') 

    # attach it 
    msg.get_payload()[1].add_related(img.read(), 
             maintype=maintype, 
             subtype=subtype, 
             cid=image_cid) 


# the message is ready now 
# you can write it to a file 
# or send it using smtplib 
Các vấn đề liên quan