2

would you mind helping me, please! I use all code's from this page How to send email attachments with Python

but it didn't work =(

This is last version which i used

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

filepath = 'D:/files/1.jpg'
fromaddr = "name@gmail.com"
toaddr = "name2@gmail.com"
password = '********'
mail_adr = 'smtp.gmail.com'
mail_port = 587

# Compose attachment
part = MIMEBase('application', "octet-stream")
part.set_payload(open(filepath, "rb").read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % os.path.basename(filepath))

# Compose message
msg = MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = toaddr
msg.attach(part)

# Send mail
smtp = SMTP_SSL()
smtp.set_debuglevel(1)
smtp.connect(mail_adr, mail_port)
smtp.login(fromaddr, password)
smtp.sendmail(fromaddr, toaddr, msg.as_string())
smtp.quit()

and here are the errors I fall

connect: ('smtp.gmail.com', 587)
connect: ('smtp.gmail.com', 587)
Traceback (most recent call last):
  File "C:/Users/Oleg/Desktop/444.py", line 31, in <module>
    smtp.connect(mail_adr, mail_port)
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\smtplib.py", line 335, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\smtplib.py", line 1037, in _get_socket
    server_hostname=self._host)
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\ssl.py", line 401, in wrap_socket
    _context=self, _session=session)
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\ssl.py", line 808, in __init__
    self.do_handshake()
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\ssl.py", line 1061, in do_handshake
    self._sslobj.do_handshake()
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\ssl.py", line 683, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: UNKNOWN_PROTOCOL] unknown protocol (_ssl.c:749)
Oleg Mazunin
  • 31
  • 2
  • 3
  • This isn't your problem, but the `encoders.encode_base64(part)` isn't doing anything but wasting time. You encode the part, then throw away the encoded part by not assigning it to a variable. – kindall Jun 17 '17 at 18:31
  • You need to use [TLS](https://stackoverflow.com/a/399240/7976758), not [SSL](https://stackoverflow.com/a/27661365/7976758). – phd Jun 17 '17 at 19:05
  • I don't understand why I get this error, can anyone explain? ImportError: cannot import name 'Encoders' – Oleg Mazunin Jun 17 '17 at 20:47
  • 1
    It's **encoders**, not **Encoders**. Python is case-sensitive language. – phd Jun 17 '17 at 21:14

1 Answers1

-2

Have you tried emailpy? (I am the author)

It supports any attachment format unless your email provider restricts it.

Example:

import emailpy
emailManager = emailpy.EmailManager('yourcooladdress@domain.com', 'youremailpassword') # this may take a few seconds to generate
emailManager.send(['sendsomething@gmail.com', 'anotheremail@hotmail.com'],  \
subject = 'Subject here', body = 'body text here', html = 'some html here', \
attachments = ['file1.png', 'file2.txt', 'file3.py'], \
nofileattach = {'file.txt': 'hi, this is some data'}) 
# send email to sendsomething@gmail.com and anotheremail@hotmail.com with subject "Subject here"
#, body "body text here", html "some html here", and some attachments: 
# "file1.png", "file2.txt", "file3.py". Also, it adds a file called file.txt
# that has the contents "hi, this is some data"

The emailpy docs can either be downloaded on its PyPI page, or from here

All email servers have been successfully tested with emailpy, and there will be no errors with emailpy if you use it on python 3.x (emailpy is not supported in python 2, mainly because of the syntax)