Как отправить электронное письмо с вложением в формате pdf на Python?

Возможный дубликат:
Как отправлять вложения электронной почты с питоном

Я хотел бы отредактировать следующий код и отправить электронное письмо с вложением. Вложение представляет собой файл pdf, он находится в /home/myuser/sample.pdf в среде Linux. Что мне следует изменить ниже?

import smtplib  
fromaddr = '[email protected]'  
toaddrs  = '[email protected]'  
msg = 'Hello'  


# Credentials (if needed)  
username = 'myemail'  
password = 'yyyyyy'  

# The actual mail send  
server = smtplib.SMTP('smtp.gmail.com:587')  
server.starttls()  
server.login(username,password)  
server.sendmail(fromaddr, toaddrs, msg)  
server.quit()  

person alwbtc    schedule 12.08.2012    source источник
comment
Почти вопрос. Не могли бы вы объяснить, почему ни один из результатов поиска на первой странице файла прикрепленного файла smtplib не подходит?   -  person Jon Clements♦    schedule 12.08.2012
comment
Используйте модуль email, примеры в docs.python.org/library/email-examples.html   -  person Martijn Pieters    schedule 12.08.2012
comment
Попробуйте это руководство email_attachments. Он также использует MIME, как упоминалось в других ответах.   -  person NIlesh Sharma    schedule 12.08.2012
comment
@alwbtc: Самая первая ссылка этих результатов поиска (Джон Клементс) дает ответ. Вы ничего не пробовали / не исследовали? ссылка на примеры писем выше цитирует несколько примеров ... :)   -  person verisimilitude    schedule 12.08.2012
comment
Что плохого в том, чтобы задать этот вопрос здесь вместо того, чтобы искать в Google прикрепленный файл smtplib?   -  person alwbtc    schedule 12.04.2013
comment
Теперь это один из самых популярных приложений, когда вы прикрепляете файл smtplib в Google. :-)   -  person dan8394    schedule 03.03.2015
comment
Для вложений в формате PDF см. Это: stackoverflow.com/a/61418064/3167448   -  person Charlie Parker    schedule 25.04.2020


Ответы (2)


В этом случае вы создаете сообщение с пакетом электронной почты -

from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEImage import MIMEImage
msg = MIMEMultipart()
msg.attach(MIMEText(open("/home/myuser/sample.pdf").read()))

а затем отправьте сообщение.

import smtplib
mailer = smtplib.SMTP()
mailer.connect()
mailer.sendmail(from_, to, msg.as_string())
mailer.close()

Вот несколько примеров - http://docs.python.org/library/email-examples.html

ОБНОВЛЕНИЕ

Обновление ссылки, поскольку приведенное выше дает 404 https://docs.python.org/2/library/email-examples.html. Спасибо @Tshirtman


Update2: самый простой способ прикрепить pdf

Чтобы прикрепить pdf, используйте флаг pdf:

def send_email_pdf_figs(path_to_pdf, subject, message, destination, password_path=None):
    ## credits: http://linuxcursor.com/python-programming/06-how-to-send-pdf-ppt-attachment-with-html-body-in-python-script
    from socket import gethostname
    #import email
    from email.mime.application import MIMEApplication
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    import smtplib
    import json

    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    with open(password_path) as f:
        config = json.load(f)
        server.login('[email protected]', config['password'])
        # Craft message (obj)
        msg = MIMEMultipart()

        message = f'{message}\nSend from Hostname: {gethostname()}'
        msg['Subject'] = subject
        msg['From'] = '[email protected]'
        msg['To'] = destination
        # Insert the text to the msg going by e-mail
        msg.attach(MIMEText(message, "plain"))
        # Attach the pdf to the msg going by e-mail
        with open(path_to_pdf, "rb") as f:
            #attach = email.mime.application.MIMEApplication(f.read(),_subtype="pdf")
            attach = MIMEApplication(f.read(),_subtype="pdf")
        attach.add_header('Content-Disposition','attachment',filename=str(path_to_pdf))
        msg.attach(attach)
        # send msg
        server.send_message(msg)

вдохновения / кредиты для: http://linuxcursor.com/python-programming/06-how-to-send-pdf-ppt-attachment-with-html-body-in-python-script

person verisimilitude    schedule 12.08.2012
comment
Не знаю, изменилось ли это после ответа. Но теперь для меня подходит тип MIMEApplication для файлов PDF. - person spalac24; 22.05.2015
comment
Что такое file в приведенном вами коде? Это функция Python? - person Hamman Samuel; 03.03.2016
comment
Когда я это делаю, я получаю PDF-код в теле письма, а не в виде вложения. Есть ли причина, по которой это могло произойти? - person mnot; 24.06.2017
comment
ссылка не работает :( - person Tshirtman; 29.03.2018
comment
Говоря о python3.7x, эти классы MIME * теперь можно импортировать как: from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart - person user9074332; 28.11.2018
comment
file выдает ошибку. Что это? - person Serdia; 25.10.2019
comment
Я голосую -1, потому что непонятно, что такое file () - person Arash; 19.02.2020
comment
@HammanSamuel, @Serdia, @Arash: Извините за опечатку. Это должно было быть open вместо file - person verisimilitude; 19.02.2020
comment
что, если я хочу отправить svg файл? - person Charlie Parker; 24.04.2020
comment
Почему вы импортируете так много вещей, которые не используете? Из-за твоего ответа сложно понять, что мне действительно нужно. - person Charlie Parker; 24.04.2020
comment
@ spalac24, не могли бы вы дать свой ответ? Почему вы использовали MIMEApplication ? - person Charlie Parker; 24.04.2020
comment
ключевая команда: with open(path_to_pdf, "rb") as f: #attach = email.mime.application.MIMEApplication(f.read(),_subtype="pdf") attach = MIMEApplication(f.read(),_subtype="pdf") - person Charlie Parker; 25.04.2020
comment
Почему вы открываете розетку? Это python, а не C. Нет необходимости отправлять электронное письмо, так зачем отправлять вложение в формате pdf? - person theerrormagnet; 07.04.2021

Рекомендуемый способ - использовать модуль Python email для создания правильно отформатированных сообщений MIME. См. Документы

Для python 2
https://docs.python.org/2/library/email-examples.html

Для python 3
https://docs.python.org/3/library/email.examples.html

person Andreas Jung    schedule 12.08.2012
comment
эта ссылка теперь не работает - person Tshirtman; 29.03.2018
comment
что, если я хочу отправить svg файл? - person Charlie Parker; 24.04.2020