кодек charmap не может декодировать ошибку байта в файле gzip на python - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь отправить электронное письмо, содержащее файл в формате gzip, как вложение, используя python.

Но я получаю сообщение об ошибке при попытке отправить файл. Это исключение, которое я получаю:

Exception:  'charmap' codec can't decode byte 0x90 in position 75: character maps to <undefined>

Вот что я делаю в своем коде:

import gzip
destination = 'path/to/file'
to_addr = input("Enter the recipient's email address: ")
from_addr = 'cloudops@noreply.company.com'
subject = "Commpany AWS Billing Info "
content = "email to the user about the file"
msg = MIMEMultipart()
msg['From'] = from_addr
msg['To'] = to_addr
msg['Subject'] = subject
body = MIMEText(content, 'html')
msg.attach(body)
server = smtplib.SMTP('smtpout.us.companyworld.company.com', 25)
filename = destination
try:
    with open(filename, 'r') as f:
        part = MIMEApplication(f.read(), Name=basename(filename))
        part['Content-Disposition'] = 'attachment; filename="{}"'.format(basename(filename))
        msg.attach(part)
        server.send_message(msg, from_addr=from_addr, to_addrs=[to_addr])
    print("Email was sent to: %s" %  to_addr)
except Exception as e:
    print("Exception: ", e)
    print("Email was not sent.")

Файл, который я пытаюсь отправить, был создан в другой функции в следующих строках:

    import pandas
    read_sql = 'select * from somedb'
    mydb = mysql.connector.connect(user='x', password='x',host='x',database='aws_bill')
    results = pandas.read_sql_query(read_sql, mydb)
    results.to_csv(destination, index=False, encoding='utf8', compression='gzip')

Как я могу исправить эту проблему и отправить вложение?

1 Ответ

1 голос
/ 30 апреля 2019

Проблема в этой строке:

with open(filename, 'r') as f:

Вы открываете gzip-файл в текстовом режиме, поэтому Python пытается его декодировать; GZIP-файлы должны быть открыты в режиме двоичный , например:

with open(filename, 'rb') as f:
...