ईमेल अटैचमेंट कैसे भेजें?


283

मुझे यह समझने में समस्या हो रही है कि पायथन का उपयोग करके अनुलग्नक को कैसे ईमेल किया जाए। मैंने सफलतापूर्वक सरल संदेशों को ईमेल किया है smtplib। क्या कोई यह समझा सकता है कि ईमेल में अनुलग्नक कैसे भेजा जाए। मुझे पता है कि अन्य पोस्ट ऑनलाइन हैं लेकिन पायथन शुरुआत के रूप में मुझे उन्हें समझना मुश्किल है।


5
यहां एक सरल कार्यान्वयन है जो कई फ़ाइलों को संलग्न कर सकता है, और यहां तक ​​कि उन्हें एम्बेड करने के लिए छवियों के मामले में भी संदर्भित करता है। datamakessense.com/…
एड्रियनबीआर

मुझे यह उपयोगी drupal.org/project/mimemail/issues/911612 पता चला है कि छवि संलग्नक को संबंधित प्रकार के बच्चे के हिस्से से जुड़ा होना चाहिए। यदि आप छवि को रूट MIME भाग से जोड़ते हैं, तो चित्र संलग्न आइटम सूची में दिखाई दे सकते हैं, और आउटलुक 365 जैसे क्लाइंट में पूर्वावलोकन किए जा सकते हैं।
हिंची

@ AdrianBR क्या होगा अगर मेरे पास एक पीडीएफ फाइल के रूप में एक छवि है। Png के पिक्सेल समस्याएँ हैं जब ज़ूम करना तो png मेरे लिए अच्छा नहीं है।
पिनोकियो

जवाबों:


416

यहाँ एक और है:

import smtplib
from os.path import basename
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate


def send_mail(send_from, send_to, subject, text, files=None,
              server="127.0.0.1"):
    assert isinstance(send_to, list)

    msg = MIMEMultipart()
    msg['From'] = send_from
    msg['To'] = COMMASPACE.join(send_to)
    msg['Date'] = formatdate(localtime=True)
    msg['Subject'] = subject

    msg.attach(MIMEText(text))

    for f in files or []:
        with open(f, "rb") as fil:
            part = MIMEApplication(
                fil.read(),
                Name=basename(f)
            )
        # After the file is closed
        part['Content-Disposition'] = 'attachment; filename="%s"' % basename(f)
        msg.attach(part)


    smtp = smtplib.SMTP(server)
    smtp.sendmail(send_from, send_to, msg.as_string())
    smtp.close()

यह पहले उदाहरण के समान ही है ... लेकिन इसे छोड़ना आसान होना चाहिए।


7
परिवर्तनशील चूक से सावधान रहें: stackoverflow.com/questions/101268/hidden-features-of-python/…
ग्रिंगो ने

11
@ user589983 यहां किसी अन्य उपयोगकर्ता की तरह एक संपादन का सुझाव क्यों नहीं दिया जाएगा? मैं करने के लिए शेष संदर्भ बदल दिया है fileमें f
ओली

9
पायथन 3 डेवलपर्स के लिए सूचना: मॉड्यूल "email.Utils" का नाम बदलकर "email.utils" किया गया है
gecco

7
python2.5 के लिए + इसके बजाय MIMEApplication का उपयोग करना आसान है - टी लूप की पहली तीन पंक्तियों को कम करता है:part = MIMEApplication(open(f, 'rb').read())
mata

5
भेजे गए ईमेल में विषय नहीं दिखाया गया था। संदेश ['विषय'] = विषय में लाइन बदलने के बाद ही काम किया। मैं अजगर 2.7 का उपयोग करता हूं।
ल्यूक

70

यहाँ Oliअजगर 3 के लिए संशोधित संस्करण है

import smtplib
from pathlib import Path
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate
from email import encoders


def send_mail(send_from, send_to, subject, message, files=[],
              server="localhost", port=587, username='', password='',
              use_tls=True):
    """Compose and send email with provided info and attachments.

    Args:
        send_from (str): from name
        send_to (list[str]): to name(s)
        subject (str): message title
        message (str): message body
        files (list[str]): list of file paths to be attached to email
        server (str): mail server host name
        port (int): port number
        username (str): server auth username
        password (str): server auth password
        use_tls (bool): use TLS mode
    """
    msg = MIMEMultipart()
    msg['From'] = send_from
    msg['To'] = COMMASPACE.join(send_to)
    msg['Date'] = formatdate(localtime=True)
    msg['Subject'] = subject

    msg.attach(MIMEText(message))

    for path in files:
        part = MIMEBase('application', "octet-stream")
        with open(path, 'rb') as file:
            part.set_payload(file.read())
        encoders.encode_base64(part)
        part.add_header('Content-Disposition',
                        'attachment; filename="{}"'.format(Path(path).name))
        msg.attach(part)

    smtp = smtplib.SMTP(server, port)
    if use_tls:
        smtp.starttls()
    smtp.login(username, password)
    smtp.sendmail(send_from, send_to, msg.as_string())
    smtp.quit()

धन्यवाद, लेकिन यह भी मूल होना अच्छा होगा: एक संलग्न फ़ाइल के लिए वाक्यविन्यास (इसका उपयोग करते हुए पथ)
जिनसोव

ऐसा लगता है कि आप अपनी फ़ाइलों को बंद नहीं करते हैं, यह कचरा एकत्र या बाहर निकलने पर बंद हो जाएगा लेकिन यह बुरी आदत है। f के साथ खुला () f: सही तरीका है।
कॉम्टे

कोड काम नहीं करता है। प्रारूप में गलत चर नाम च (os.path.basename (च)) प्रारूप (os.path.basename (पथ)) होना चाहिए
क्रिस

1
send_to को सूची [str] होनी चाहिए
Subin

2
मेरे लिए सबसे अच्छा जवाब है, लेकिन एक छोटी सी त्रुटि है: import pathlibसाथ बदलेंfrom pathlib import Path
एलावे81

65

यह वह कोड है जिसका मैंने उपयोग किया है:

import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email import Encoders


SUBJECT = "Email Data"

msg = MIMEMultipart()
msg['Subject'] = SUBJECT 
msg['From'] = self.EMAIL_FROM
msg['To'] = ', '.join(self.EMAIL_TO)

part = MIMEBase('application', "octet-stream")
part.set_payload(open("text.txt", "rb").read())
Encoders.encode_base64(part)

part.add_header('Content-Disposition', 'attachment; filename="text.txt"')

msg.attach(part)

server = smtplib.SMTP(self.EMAIL_SERVER)
server.sendmail(self.EMAIL_FROM, self.EMAIL_TO, msg.as_string())

कोड ओली के पद के समान ही है। सबको शुक्रीया

बाइनरी फ़ाइल ईमेल अटैचमेंट समस्या पोस्ट से आधारित कोड ।


2
अच्छा उत्तर। अच्छा होगा यदि इसमें वह कोड भी हो जो नमूना बॉडी टेक्स्ट जोड़ता है।
स्टीवन ब्लूएन

4
कृपया ध्यान दें, ईमेल लाइब्रेरी के आधुनिक रिलीज में - मॉड्यूल आयात अलग हैं। उदाहरण:from email.mime.base import MIMEBase
वरुण बालुपुरी

27
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEImage import MIMEImage
import smtplib

msg = MIMEMultipart()
msg.attach(MIMEText(file("text.txt").read()))
msg.attach(MIMEImage(file("image.png").read()))

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

यहां से अपनाया गया ।


बिल्कुल नहीं, जो मैं देख रहा हूँ। फ़ाइल को ईमेल के मुख्य भाग के रूप में भेजा गया था। लाइन 6 और 7 पर भी गायब ब्रैकेट्स हैं। मुझे लगता है कि हम हालांकि करीब हो रहे हैं
रिचर्ड

2
ईमेल सादा पाठ हैं, और यही इसका smtplibसमर्थन करता है। अनुलग्नक भेजने के लिए, आप उन्हें MIME संदेश के रूप में एन्कोड करते हैं और उन्हें एक सादे ईमेल में भेजते हैं। एक नया अजगर ईमेल मॉड्यूल है, हालांकि: docs.python.org/library/email.mime.html
कैट्रील

@katrienlalex एक कामकाजी उदाहरण मेरी समझ में मदद करने के लिए एक लंबा रास्ता तय करेगा
रिचर्ड

1
क्या आप सुनिश्चित हैं कि उपरोक्त उदाहरण काम नहीं करता है? मेरे पास SMTP सर्वर काम नहीं है, लेकिन मैंने देखा msg.as_string()और यह निश्चित रूप से MIME मल्टीपार्ट ईमेल के शरीर जैसा दिखता है। विकिपीडिया MIME बताते हैं: en.wikipedia.org/wiki/MIME
कैट्रील

1
Line 6, in <module> msg.attach(MIMEText(file("text.txt").read())) NameError: name 'file' is not defined
बेंजामिन

7

अजगर 3 के साथ एक और तरीका (यदि कोई खोज रहा है):

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

fromaddr = "sender mail address"
toaddr = "receiver mail address"

msg = MIMEMultipart()

msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "SUBJECT OF THE EMAIL"

body = "TEXT YOU WANT TO SEND"

msg.attach(MIMEText(body, 'plain'))

filename = "fileName"
attachment = open("path of file", "rb")

part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % filename)

msg.attach(part)

server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(fromaddr, "sender mail password")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()

अपने Gmail खाते पर " कम सुरक्षित ऐप्स " की अनुमति देना सुनिश्चित करें


6

Gmail संस्करण, पायथन 3.6 के साथ काम कर रहा है (ध्यान दें कि आपको अपनी जीमेल सेटिंग्स को बदलने की आवश्यकता होगी: इसमें से smt के माध्यम से ईमेल भेजने में सक्षम हो:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from os.path import basename


def send_mail(send_from: str, subject: str, text: str, 
send_to: list, files= None):

    send_to= default_address if not send_to else send_to

    msg = MIMEMultipart()
    msg['From'] = send_from
    msg['To'] = ', '.join(send_to)  
    msg['Subject'] = subject

    msg.attach(MIMEText(text))

    for f in files or []:
        with open(f, "rb") as fil: 
            ext = f.split('.')[-1:]
            attachedfile = MIMEApplication(fil.read(), _subtype = ext)
            attachedfile.add_header(
                'content-disposition', 'attachment', filename=basename(f) )
        msg.attach(attachedfile)


    smtp = smtplib.SMTP(host="smtp.gmail.com", port= 587) 
    smtp.starttls()
    smtp.login(username,password)
    smtp.sendmail(send_from, send_to, msg.as_string())
    smtp.close()

उपयोग:

username = 'my-address@gmail.com'
password = 'top-secret'
default_address = ['my-address2@gmail.com'] 

send_mail(send_from= username,
subject="test",
text="text",
send_to= None,
files= # pass a list with the full filepaths here...
)

किसी अन्य ईमेल प्रदाता के साथ उपयोग करने के लिए, बस smtp कॉन्फ़िगरेशन बदलें।


4

सबसे सरल कोड जो मुझे मिल सकता है:

#for attachment email
from django.core.mail import EmailMessage

    def attachment_email(request):
            email = EmailMessage(
            'Hello', #subject
            'Body goes here', #body
            'MyEmail@MyEmail.com', #from
            ['SendTo@SendTo.com'], #to
            ['bcc@example.com'], #bcc
            reply_to=['other@example.com'],
            headers={'Message-ID': 'foo'},
            )

            email.attach_file('/my/path/file')
            email.send()

यह आधिकारिक Django प्रलेखन पर आधारित था


3
आपके मामले में आपको ईमेल भेजने के लिए django को स्थापित करना होगा ... यह ठीक से सवाल का जवाब नहीं देता है
कॉम्टे

@comte 'coz python का उपयोग केवल Django के लिए ही किया जाता है, है ना?
शुभ अंक

5
@Austex कि मेरी बात है;; यह एक फाइल को संपादित करने के लिए लिब्रे ऑफिस स्थापित करने जैसा है ...
comte

मुझे यह मददगार और ज्ञानवर्धक लगता है। केवल एक मॉड्यूल आयात किया जाता है, और इसका उपयोग MIME हुप्स की तुलना में काफी सरल और सुरुचिपूर्ण है, जो दूसरों के माध्यम से कूदते हैं। आपके उदाहरण में, इसके विपरीत, लिबरऑफिस नोटपैड की तुलना में उपयोग करना अधिक कठिन है।
Bjorks नंबर एक प्रशंसक

4

अन्य उत्तर उत्कृष्ट हैं, हालांकि मैं अभी भी एक अलग दृष्टिकोण साझा करना चाहता था अगर कोई विकल्प तलाश रहा है।

यहां मुख्य अंतर यह है कि इस दृष्टिकोण का उपयोग करके आप अपने संदेश को प्रारूपित करने के लिए HTML / CSS का उपयोग कर सकते हैं, जिससे आप रचनात्मक हो सकते हैं और अपने ईमेल को कुछ स्टाइल दे सकते हैं। हालाँकि आप HTML का उपयोग करने के लिए लागू नहीं हैं, फिर भी आप केवल सादे पाठ का उपयोग कर सकते हैं।

ध्यान दें कि यह फ़ंक्शन कई प्राप्तकर्ताओं को ईमेल भेजना स्वीकार करता है और कई फ़ाइलों को संलग्न करने की अनुमति भी देता है।

मैंने केवल पायथन 2 पर यह कोशिश की है, लेकिन मुझे लगता है कि इसे 3 पर भी ठीक काम करना चाहिए:

import os.path
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

def send_email(subject, message, from_email, to_email=[], attachment=[]):
    """
    :param subject: email subject
    :param message: Body content of the email (string), can be HTML/CSS or plain text
    :param from_email: Email address from where the email is sent
    :param to_email: List of email recipients, example: ["a@a.com", "b@b.com"]
    :param attachment: List of attachments, exmaple: ["file1.txt", "file2.txt"]
    """
    msg = MIMEMultipart()
    msg['Subject'] = subject
    msg['From'] = from_email
    msg['To'] = ", ".join(to_email)
    msg.attach(MIMEText(message, 'html'))

    for f in attachment:
        with open(f, 'rb') as a_file:
            basename = os.path.basename(f)
            part = MIMEApplication(a_file.read(), Name=basename)

        part['Content-Disposition'] = 'attachment; filename="%s"' % basename
        msg.attach(part)

    email = smtplib.SMTP('your-smtp-host-name.com')
    email.sendmail(from_email, to_email, msg.as_string())

आशा है कि ये आपकी मदद करेगा! :-)


2
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
import mimetypes
import email.mime.application

smtp_ssl_host = 'smtp.gmail.com'  # smtp.mail.yahoo.com
smtp_ssl_port = 465
s = smtplib.SMTP_SSL(smtp_ssl_host, smtp_ssl_port)
s.login(email_user, email_pass)


msg = MIMEMultipart()
msg['Subject'] = 'I have a picture'
msg['From'] = email_user
msg['To'] = email_user

txt = MIMEText('I just bought a new camera.')
msg.attach(txt)

filename = 'introduction-to-algorithms-3rd-edition-sep-2010.pdf' #path to file
fo=open(filename,'rb')
attach = email.mime.application.MIMEApplication(fo.read(),_subtype="pdf")
fo.close()
attach.add_header('Content-Disposition','attachment',filename=filename)
msg.attach(attach)
s.send_message(msg)
s.quit()

स्पष्टीकरण के लिए, आप इस लिंक का उपयोग कर सकते हैं यह ठीक से समझाता है https://medium.com/@sdoshi579/to-send-an-email-along-with-attachment-use-smtp-7852e77623


2
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
import smtplib

msg = MIMEMultipart()

password = "password"
msg['From'] = "from_address"
msg['To'] = "to_address"
msg['Subject'] = "Attached Photo"
msg.attach(MIMEImage(file("abc.jpg").read()))
file = "file path"
fp = open(file, 'rb')
img = MIMEImage(fp.read())
fp.close()
msg.attach(img)
server = smtplib.SMTP('smtp.gmail.com: 587')
server.starttls()
server.login(msg['From'], password)
server.sendmail(msg['From'], msg['To'], msg.as_string())
server.quit()

2
नमस्ते, आपका स्वागत है, कृपया हमेशा बेहतर समझ के लिए एक प्रश्न का उत्तर देते समय अपने उत्तर की व्याख्या पोस्ट करें
अली

0

नीचे मैंने SoccerPlayer की पोस्ट से जो कुछ भी पाया है उसका संयोजन यहां दिया गया है और निम्नलिखित लिंक जो मेरे लिए एक xlsx फ़ाइल संलग्न करना आसान बनाता है। यहां मिला

file = 'File.xlsx'
username=''
password=''
send_from = ''
send_to = 'recipient1 , recipient2'
Cc = 'recipient'
msg = MIMEMultipart()
msg['From'] = send_from
msg['To'] = send_to
msg['Cc'] = Cc
msg['Date'] = formatdate(localtime = True)
msg['Subject'] = ''
server = smtplib.SMTP('smtp.gmail.com')
port = '587'
fp = open(file, 'rb')
part = MIMEBase('application','vnd.ms-excel')
part.set_payload(fp.read())
fp.close()
encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment', filename='Name File Here')
msg.attach(part)
smtp = smtplib.SMTP('smtp.gmail.com')
smtp.ehlo()
smtp.starttls()
smtp.login(username,password)
smtp.sendmail(send_from, send_to.split(',') + msg['Cc'].split(','), msg.as_string())
smtp.quit()

0

मेरे कोड से आप जीमेल का उपयोग करके ईमेल अटैचमेंट भेज सकते हैं:

" अपना SMTP EMAIL यहाँ " पर अपना gmail पता सेट करें "

" अपना SMTP पासवर्ड HERE_ पर अपना gmail खाता पासवर्ड सेट करें "

MESSAGE_ भाग प्राप्त करने के लिए ___EMAIL में आपको गंतव्य ईमेल पता सेट करना होगा।

अलार्म अधिसूचना विषय है,

किसी ने कमरे में प्रवेश किया है, संलग्न चित्र शरीर है

["/home/pi/webcam.jpg"] एक छवि अनुलग्नक है।

#!/usr/bin/env python
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders
import os

USERNAME = "___YOUR SMTP EMAIL HERE___"
PASSWORD = "__YOUR SMTP PASSWORD HERE___"

def sendMail(to, subject, text, files=[]):
    assert type(to)==list
    assert type(files)==list

    msg = MIMEMultipart()
    msg['From'] = USERNAME
    msg['To'] = COMMASPACE.join(to)
    msg['Date'] = formatdate(localtime=True)
    msg['Subject'] = subject

    msg.attach( MIMEText(text) )

    for file in files:
        part = MIMEBase('application', "octet-stream")
        part.set_payload( open(file,"rb").read() )
        Encoders.encode_base64(part)
        part.add_header('Content-Disposition', 'attachment; filename="%s"'
                       % os.path.basename(file))
        msg.attach(part)

    server = smtplib.SMTP('smtp.gmail.com:587')
    server.ehlo_or_helo_if_needed()
    server.starttls()
    server.ehlo_or_helo_if_needed()
    server.login(USERNAME,PASSWORD)
    server.sendmail(USERNAME, to, msg.as_string())
    server.quit()

sendMail( ["___EMAIL TO RECEIVE THE MESSAGE__"],
        "Alarm notification",
        "Someone has entered the room, picture attached",
        ["/home/pi/webcam.jpg"] )

बहुत समय से मिले नहीं! यह देखने के लिए अच्छा है कि आप अपने कोड को ठीक से जिम्मेदार ठहरा रहे हैं और सीधे उत्तर में शामिल हैं। हालाँकि, यह आम तौर पर एक ही उत्तर कोड को कई प्रश्नों पर कॉपी-पेस्ट करने के लिए होता है। यदि वे वास्तव में एक ही समाधान के साथ हल किए जा सकते हैं, तो आपको प्रश्नों को ध्वजांकित करने के बजाय ध्वजांकित करना चाहिए ।
दास_गीक

0

आप अपने ई-मेल में जिस तरह के अटैचमेंट चाहते हैं, उसे भी निर्दिष्ट कर सकते हैं, उदाहरण के लिए मैंने पीडीएफ का उपयोग किया था:

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('me@gmail.com', config['password'])
        # Craft message (obj)
        msg = MIMEMultipart()

        message = f'{message}\nSend from Hostname: {gethostname()}'
        msg['Subject'] = subject
        msg['From'] = 'me@gmail.com'
        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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.