2016-11-01 7 views
1

많은 게시물을 확인했지만 해결 방법을 찾을 수 없습니다. 사진이 포함 된 이메일을 보낼 수는 있지만 메일에 첨부 된 사진도 포함되어 있으며 사진이 필요합니다. 나는 '관련'유형, '혼합'과 함께 많은 변형을 시도했다. 또한 Python 프로그램 (Jinja2 템플릿이 아닌) 안에 html 코드가 있지만 작동하지 않습니다.Python : 이미지와 첨부 파일이 모두 포함 된 멀티 파트 html 전자 메일이 전송되었습니다.

list_of_images = get_graphs() #list with file names 

# here if I put "related" - images are sent ONLY as attachments 
mail = MIMEMultipart() 
for filename in list_of_images: 
    fp = open(filename, 'rb') 
    msg_img = MIMEImage(fp.read()) 
    fp.close() 
    msg_img.add_header('Content-ID', '<{}>'.format(filename)) 
    msg_img.add_header('Content-Disposition', 'inline', filename=filename) 
    mail.attach(msg_img) 
#Jinja2 for html template 
env = Environment(loader=FileSystemLoader('.')) 
main = env.get_template('images.tpl') 
html = main.render(pictures=list_of_images) 
msgHtml = MIMEText(html, 'html') 
mail.attach(msgHtml) 

mail['Subject'] = "TEST" 
mail['From'] = "[email protected]" 
mail['To'] = "[email protected]" 
s = smtplib.SMTP("localhost") 
s.sendmail(mail['From'], "[email protected]", mail.as_string()) 
s.quit() 

신사 템플릿 :

<html> 
<body> 
{% for image in pictures %} 
<img src="cid:{{image}}"> 
{% endfor %} 
</body> 
</html> 

답변

1

먼저 HTML을 연결하거나 다중/관련 콘텐츠 형식에 "시작"매개 변수를 지정합니다. RFC2387을 인용

:

시작 매개 변수는 주어진 경우, 화합물 개체의 "루트"의 내용-ID입니다. 존재하지 않으면 "root"는 의 Multipart/Related entity의 첫 번째 본문 부분입니다. "루트"는 응용 프로그램이 먼저 처리하는 요소입니다 ( ).

mail = MIMEMultipart("related", start="<HTML>", type="text/html") 
... 
msgHtml.add_header('Content-ID', '<HTML>') 

는 적어도 구글 메일에서, 중 먼저 HTML을 배치하거나이 "시작"추가 매개 변수가 있습니다 :

따라서, 귀하의 예제에서, 당신은 루트 요소를 표시하기 위해 이러한 변경 작업을 수 인라인으로 표시 할 이미지

전체 예제 :

from jinja2 import Template 
from email.mime.text import MIMEText 
from email.mime.multipart import MIMEMultipart 
from email.mime.image import MIMEImage 
from glob import glob 
from getpass import getpass 
import smtplib 

me = '[email protected]' 
you= '[email protected]' 
auth = ('[email protected]', getpass()) 
mx= ('smtp.gmail.com', 465) 

list_of_images = glob('*.jpg') 

mail = MIMEMultipart("related") 
#Jinja2 for html template 
main = Template(''' 
    <html><body> 
    {% for image in pictures %}<img src="cid:{{image}}">{% endfor %} 
    </body></html>''') 
html = main.render(pictures=list_of_images) 
msgHtml = MIMEText(html, 'html') 
mail.attach(msgHtml) 

for filename in list_of_images: 
    fp = open(filename, 'rb') 
    msg_img = MIMEImage(fp.read()) 
    fp.close() 
    msg_img.add_header('Content-ID', '<{}>'.format(filename)) 
    msg_img.add_header('Content-Disposition', 'inline', filename=filename) 
    mail.attach(msg_img) 

mail['Subject'] = "TEST" 
mail['From'] = me 
mail['To'] = you 

s = smtplib.SMTP_SSL(*mx) 
s.login(*auth) 
s.sendmail(me, you, mail.as_string()) 
s.quit() 
+0

답 롭 주셔서 감사합니다! – Yuliya

+0

이미지 부분 앞에 html 부분을 이동하면 문제가 해결됩니다. 그러나, "시작"옵션을 사용하는 경우 나를 위해 작동하지 않고 계속해서 이미지와 첨부 파일을 보냈습니다. – Yuliya