email attachement with non-ascii characters will be renamed - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: Networking (https://python-forum.io/forum-12.html) +--- Thread: email attachement with non-ascii characters will be renamed (/thread-25650.html) |
email attachement with non-ascii characters will be renamed - Erich1959 - Apr-06-2020 I have created code to send an email with an attachement and it works fine as long as there are no non-ascii characters in the file name and it works fine if there are only ascii-characters in the file-name - e.g. file "KOEST.txt" will be sent and is correctly named "KOEST.txt" in the InBox at the receivers end; but if the file-name contains a non-ascii-character - e.g. file "KÖST.TXT" it is sent but in the InBox at the receivers and that file is suddenly called "attych3r.txt" (and if I send the same message again the file gets another name - but never "KÖST.txt". I'm using Python 3.8 in Windows 7 and a domino-Server with an IBM-Notes-Client and I do not think that the server or the client could be the problem because we have sent messages with attachments like that from a scanner and file-names like "KÖST.txt" were never a problem and were sent to my InBox with the attachment correctly named "KÖST.txt". I have already searched with Google but could not find a solution - the non-ascii-characters are not a problem in the "subject" and in the "body" (the module "email" changes everything automatically to UTF-8)but file-names with a non-ascii-character seem to be a problem. I have already searched in 4 really complete books to Python 3.x and also in the documentation - but all the examples I could find told me what I already knew but it seems nobody ever tried to send an attachement with non-ascii-characters. I'd be really grateful if somebody could solve the problem ... import smtplib import os # damit os.path.join funktioniert from email.message import EmailMessage # vgl. https://stackoverflow.com/questions/954 ... on-smtplib # Variablen zum Testen definieren (das File muss im angegebenen Ordner stehen) ordner = r'G:\Posteingang\Ordner_Test' file = 'KÖST.txt' # - Attachement wird umbenannt??? # file = 'KOEST.txt' # - Attachement wird NICHT umbenannt path = os.path.join(ordner, file) # stellt Dateinamen + Pfad in die Variable # me == the sender's email address me = " EINGEBEN " # Mail-Adresse des Absenders! # you == the recipient's email address you = " EINGEBEN " # Mail-Adresse des Empfängers! msg = EmailMessage() # muss VOR Verwendung von msg stehen msg["From"] = me msg["Subject"] = file # Umlaute im Subject sind kein Problem?! msg["To"] = you msg.set_content("This is the message body") # msg.add_attachment(open(filename, "r").read(), filename=path) msg.add_attachment(open(path, "r").read(), filename=file) # Attachement mit Umlaut wird umbenannt! # s = smtplib.SMTP('smtp.sendgrid.net', 587) s = smtplib.SMTP( EINGEBEN ) # (" Mail-Server", Port) # s.login(USERNAME, PASSWORD) s.send_message(msg) RE: email attachement with non-ascii characters will be renamed - Mateusz - Apr-07-2020 Try something like this: filename=file.encode('utf-8') RE: email attachement with non-ascii characters will be renamed - Erich1959 - Apr-07-2020 That is not possible - if I try to change line 27 to msg.add_attachment(open(path, "r").read(), filename=file.encode('utf-8'))then I only get a lot of error-messages like this: C:\Users\ESchuett>"C:/Program Files (x86)/Python38-32/python.exe" g:/Posteingang/Python-Forum/sendmail_2020-04-07.py Traceback (most recent call last): File "g:/Posteingang/Python-Forum/sendmail_2020-04-07.py", line 27, in <module> msg.add_attachment(open(path, "r").read(), filename=file.encode('utf-8')) # Attachement mit Umlaut wird umbenannt! File "C:\Program Files (x86)\Python38-32\lib\email\message.py", line 1156, in add_attachment self._add_multipart('mixed', *args, _disp='attachment', **kw) File "C:\Program Files (x86)\Python38-32\lib\email\message.py", line 1144, in _add_multipart part.set_content(*args, **kw) File "C:\Program Files (x86)\Python38-32\lib\email\message.py", line 1171, in set_content super().set_content(*args, **kw) File "C:\Program Files (x86)\Python38-32\lib\email\message.py", line 1101, in set_content content_manager.set_content(self, *args, **kw) File "C:\Program Files (x86)\Python38-32\lib\email\contentmanager.py", line 37, in set_content handler(msg, obj, *args, **kw) File "C:\Program Files (x86)\Python38-32\lib\email\contentmanager.py", line 191, in set_text_content _finalize_set(msg, disposition, filename, cid, params) File "C:\Program Files (x86)\Python38-32\lib\email\contentmanager.py", line 118, in _finalize_set msg.set_param('filename', File "C:\Program Files (x86)\Python38-32\lib\email\message.py", line 731, in set_param [ctype, _formatparam(param, value, requote)]) File "C:\Program Files (x86)\Python38-32\lib\email\message.py", line 59, in _formatparam value.encode('ascii') AttributeError: 'bytes' object has no attribute 'encode' RE: email attachement with non-ascii characters will be renamed - Mateusz - Apr-07-2020 Right, my bad. Go back with your previous version. What is your output of print(msg)before send? Because I tried your code (without sending so far). Do you have information about 'utf-8' and filename is correct? See below my output From: EINGEBEN Subject: KÖST.txt To: EINGEBEN MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============9220985300008811412==" --===============9220985300008811412== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit This is the message body --===============9220985300008811412== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="KÖST.txt" MIME-Version: 1.0 --===============9220985300008811412==--Take a loook on other sending emails implementations here: https://stackoverflow.com/questions/3362600/how-to-send-email-attachments http://code.activestate.com/recipes/578150-sending-non-ascii-emails-from-python-3/ RE: email attachement with non-ascii characters will be renamed - Erich1959 - Apr-07-2020 The output from "print(msg) reads like that: Microsoft Windows [Version 6.1.7601] Copyright © 2009 Microsoft Corporation. Alle Rechte vorbehalten. C:\Users\XXX>"C:/Program Files (x86)/Python38-32/python.exe" g:/Posteingang/Python-Forum/sendmail.py From: ( = sent from) Subject: KÖST.txt To: ( = sent to) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0917264486==" --===============0917264486== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit This is the message body --===============0917264486== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="KÖST.txt" MIME-Version: 1.0 --===============0917264486==-- but the problem as far as I can see it is that the filename is printed correct even if there are non-ascii-characters included (if I include somewhere "print (filename)" the console shows "KÖST.txt". Only if the message is sent the filename is changed to "attych3r.txt" and I think that could be a bug in the email-module which is new in Python 3.x because in the subject and in the body of the same message I could use "KÖST.txt" and it is shown correctly when the message is sent in the Inbox. I have just now tried no. 5 ( = Another way with python 3 (If someone is searching):" but as in all other examples it is the same problem - "KÖST.txt" will be printed in Python and if the message is sent it is shown correctly in the "subject" and in the "body" but an attachment with the name "KÖST.txt" is renamed in the message. I really appreciate your help but I think it's a bug in the email-module. Heureka - I have just tried (a bit modified for our mail-server) http://code.activestate.com/recipes/578150-sending-non-ascii-emails-from-python-3/ and it works fine - the attachment "KÖST.txt" is sent and is shown in the InBox as "KÖST.txt". Thank you very much for your help! |