Welcome, guest | Sign In | My Account | Store | Cart
# -*- coding: utf-8 -*-

'''
Simple Python 3 module for sending emails
with attachments through an SMTP server.

@author: Krystian Rosiński
'''

import os
import smtplib
import getpass
#import mimetypes

from email.utils import formataddr
from email.utils import formatdate
from email.utils import COMMASPACE

from email.header import Header
from email import encoders

from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
#from email.mime.application import MIMEApplication


def send_email(sender_name: str, sender_addr: str, smtp: str, port: str,
               recipient_addr: list, subject: str, html: str, text: str,
               img_list: list=[], attachments: list=[],
               fn: str='last.eml', save: bool=False):

    passwd = getpass.getpass('Password: ')

    sender_name = Header(sender_name, 'utf-8').encode()

    msg_root = MIMEMultipart('mixed')
    msg_root['Date'] = formatdate(localtime=1)
    msg_root['From'] = formataddr((sender_name, sender_addr))
    msg_root['To'] = COMMASPACE.join(recipient_addr)
    msg_root['Subject'] = Header(subject, 'utf-8')
    msg_root.preamble = 'This is a multi-part message in MIME format.'

    msg_related = MIMEMultipart('related')
    msg_root.attach(msg_related)

    msg_alternative = MIMEMultipart('alternative')
    msg_related.attach(msg_alternative)

    msg_text = MIMEText(text.encode('utf-8'), 'plain', 'utf-8')
    msg_alternative.attach(msg_text)

    msg_html = MIMEText(html.encode('utf-8'), 'html', 'utf-8')
    msg_alternative.attach(msg_html)

    for i, img in enumerate(img_list):
        with open(img, 'rb') as fp:
            msg_image = MIMEImage(fp.read())
            msg_image.add_header('Content-ID', '<image{}>'.format(i))
            msg_related.attach(msg_image)

    for attachment in attachments:
        fname = os.path.basename(attachment)

        with open(attachment, 'rb') as f:
            msg_attach = MIMEBase('application', 'octet-stream')
            msg_attach.set_payload(f.read())
            encoders.encode_base64(msg_attach)
            msg_attach.add_header('Content-Disposition', 'attachment',
                                  filename=(Header(fname, 'utf-8').encode()))
            msg_root.attach(msg_attach)

    mail_server = smtplib.SMTP(smtp, port)
    mail_server.ehlo()

    try:
        mail_server.starttls()
        mail_server.ehlo()
    except smtplib.SMTPException as e:
        print(e)

    mail_server.login(sender_addr, passwd)
    mail_server.send_message(msg_root)
    mail_server.quit()

    if save:
        with open(fn, 'w') as f:
            f.write(msg_root.as_string())

if __name__ == '__main__':
    # Usage:
    sender_name = 'Imię Nazwisko'
    sender_addr = 'imie.nazwisko@gmail.com'
    smtp = 'smtp.gmail.com'
    port = '587'
    recipient_addr = ['adres1@hotmail.com', 'adres2@yahoo.com']
    subject = 'Żółta kartka'
    text = "Wiadomość testowa"
    html = """
        <html>
        <head>
        <meta http-equiv="content-type" content="text/html;charset=utf-8" />
        </head>
        <body>
        <font face="verdana" size=2>{}<br/></font>
        <img src="cid:image0" border=0 />
        </body>
        </html>
        """.format(text)  # template
    img_list = ['python_powered.png']  # -> image0, image1, image2, ...
    attachments = ['załącznik.zip']

    send_email(sender_name, sender_addr, smtp, port,
               recipient_addr, subject, html, text,
               img_list, attachments, fn='my.eml', save=True)

Diff to Previous Revision

--- revision 16 2012-06-27 15:51:51
+++ revision 17 2012-09-16 07:50:17
@@ -8,8 +8,8 @@
 '''
 
 import os
+import smtplib
 import getpass
-import smtplib
 #import mimetypes
 
 from email.utils import formataddr
@@ -25,30 +25,14 @@
 from email.mime.image import MIMEImage
 #from email.mime.application import MIMEApplication
 
+
 def send_email(sender_name: str, sender_addr: str, smtp: str, port: str,
-               recipient_addr: list, subject: str, message: str,
-               attachments: list=[], logo: str=None, save: bool=False):
-    """
-    Usage:
-    
-    send_email(sender_name = 'Imię Nazwisko',
-               sender_addr = 'imie.nazwisko@gmail.com',
-               smtp = 'smtp.gmail.com',
-               port = '587',
-               recipient_addr = ['adres1@hotmail.com', 'adres2@yahoo.com'],
-               subject = 'Żółta kartka',
-               message = 'Wiadomość testowa',
-               attachments = ['załącznik.zip'],
-               logo = 'python_powered.png',
-               save = True)
-    """
+               recipient_addr: list, subject: str, html: str, text: str,
+               img_list: list=[], attachments: list=[],
+               fn: str='last.eml', save: bool=False):
 
     passwd = getpass.getpass('Password: ')
-    
-    text = message
-    html = msg(message, logo)
-    email = sender_addr
-    
+
     sender_name = Header(sender_name, 'utf-8').encode()
 
     msg_root = MIMEMultipart('mixed')
@@ -57,28 +41,28 @@
     msg_root['To'] = COMMASPACE.join(recipient_addr)
     msg_root['Subject'] = Header(subject, 'utf-8')
     msg_root.preamble = 'This is a multi-part message in MIME format.'
-    
+
     msg_related = MIMEMultipart('related')
     msg_root.attach(msg_related)
-    
+
     msg_alternative = MIMEMultipart('alternative')
     msg_related.attach(msg_alternative)
-    
+
     msg_text = MIMEText(text.encode('utf-8'), 'plain', 'utf-8')
     msg_alternative.attach(msg_text)
-    
+
     msg_html = MIMEText(html.encode('utf-8'), 'html', 'utf-8')
     msg_alternative.attach(msg_html)
 
-    if logo:
-        with open(logo, 'rb') as fp:
-            msg_image = MIMEImage(fp.read()) 
-            msg_image.add_header('Content-ID', '<image>')
+    for i, img in enumerate(img_list):
+        with open(img, 'rb') as fp:
+            msg_image = MIMEImage(fp.read())
+            msg_image.add_header('Content-ID', '<image{}>'.format(i))
             msg_related.attach(msg_image)
-            
+
     for attachment in attachments:
         fname = os.path.basename(attachment)
-        
+
         with open(attachment, 'rb') as f:
             msg_attach = MIMEBase('application', 'octet-stream')
             msg_attach.set_payload(f.read())
@@ -86,33 +70,47 @@
             msg_attach.add_header('Content-Disposition', 'attachment',
                                   filename=(Header(fname, 'utf-8').encode()))
             msg_root.attach(msg_attach)
-            
+
     mail_server = smtplib.SMTP(smtp, port)
     mail_server.ehlo()
-    mail_server.starttls()
-    mail_server.ehlo()
-    mail_server.login(email, passwd)
+
+    try:
+        mail_server.starttls()
+        mail_server.ehlo()
+    except smtplib.SMTPException as e:
+        print(e)
+
+    mail_server.login(sender_addr, passwd)
     mail_server.send_message(msg_root)
     mail_server.quit()
 
     if save:
-        with open('last.eml', 'w') as f:
+        with open(fn, 'w') as f:
             f.write(msg_root.as_string())
 
-def msg(message: str, logo: str) -> 'HTML message':
-    
-    spam = '''
+if __name__ == '__main__':
+    # Usage:
+    sender_name = 'Imię Nazwisko'
+    sender_addr = 'imie.nazwisko@gmail.com'
+    smtp = 'smtp.gmail.com'
+    port = '587'
+    recipient_addr = ['adres1@hotmail.com', 'adres2@yahoo.com']
+    subject = 'Żółta kartka'
+    text = "Wiadomość testowa"
+    html = """
         <html>
         <head>
         <meta http-equiv="content-type" content="text/html;charset=utf-8" />
         </head>
         <body>
-        <font face="verdana" size=2>{}<br/><br/>{}</font>
+        <font face="verdana" size=2>{}<br/></font>
+        <img src="cid:image0" border=0 />
         </body>
         </html>
-        '''
-    
-    img_src = '<img src="cid:image" border=0 />' if logo else ''
-    spam = spam.format(message.replace('\n', '<br/>'), img_src)
-    
-    return spam
+        """.format(text)  # template
+    img_list = ['python_powered.png']  # -> image0, image1, image2, ...
+    attachments = ['załącznik.zip']
+
+    send_email(sender_name, sender_addr, smtp, port,
+               recipient_addr, subject, html, text,
+               img_list, attachments, fn='my.eml', save=True)

History