Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Sähköpostin dekoodaus

Sivun loppuun

ohjelmaohjelma [03.12.2021 16:23:39]

#

Minulla on uusi ongelma, ei sitten niin millään ratkea omin keinoin. Minulla on merkkijono, mutta kun siinä on ääkkösiä, niin se on kääntynyt muotoon "T=c3=a4mä on esimerkkin=c3=a4kym=c3=a4" Jos tämä ä(=c3=a4) olisi esimerkiksi vaikka ä"U+00E4" tai ä"\xe4" niin osaisin korjata ongelman itse. Mutta vaikka kuinka nettiä selaa, niin mistään ei löydä tietoa miten tämän saisi kuntoon. Kartoissa merkki ilmoitettu olevan heksadesimaali, mutta ei se ole. Tietysti voisin vaihtaa tämän merkin(replace), mutta saisin tehdä saman hyvin monelle erikoismerkille. Mikä avuksi??

Python3 Tkinter

neosofta [03.12.2021 16:52:04]

#

avainsana on Python String encode()

Grez [03.12.2021 16:52:05]

#

Oletan että tuo on sähköpostin otsikossa tms, jolloin pitäisi olla normaalisti myös tieto, mikä enkoodaus on kyseessä ja tällä perusteella pitäisi löytyä tieto miten se puretaan.

Eli jos käytät valmista sähköpostienlukutyökalua, niin sen pitäisi osata hoitaa tuollainen dekoodaus "viran puolesta". Jos ei hoida -> työkalu vaihtoon.

Jos olet koodaamassa itse tyhjästä sähköpostienlukutyökalua, niin kannattaa tutustua kaikkiin relevantteihin standardeihin ja tukea niitä. Ei oikein toimi että teet yksi kerrallaan ja kokeilet että joko nyt toimisi, koska kaikki mahdolliset yhdistelmät ei kuitenkaan välttämättä ihan heti tule vastaan.

Tuosta koodauksesta on helppo arvata että kyseessä on RFC2047 mukainen Quoted Printable siirtokoodaus utf-8 merkistökoodauksella. Eli se merkittäisiin =?UTF-8?Q? alulla ja ?= lopulla.

Eli siis jos vaikka email subject on =?UTF-8?Q?T=c3=a4m=c3=a4_on_esimerkkin=c3=a4kym=c3=a4?= niin tuon pitäisi kääntyä per RFC2047: Tämä on esimerkkinäkymä

Metabolix [03.12.2021 17:54:14]

#

Hävisikö oma salasana vai onko tämä sähköpostiohjelman teko Pythonilla jokin kurssityö, kun tämä on jo toinen samoja asioita kyselevä nimimerkki? Edellisen alku löytyy tästä.

Kuten Grez totesi, kannattaa selvittää ne standardit eikä arvailla. Grez kertoi jo otsikoista. Jos kyseessä on sähköpostin sisältö, niin viestin (tai sen osan) otsikkotiedoissa (Content-Transfer-Encoding) kerrotaan, miten sisältö on enkoodattu. Kohtaamasi enkoodaus on quoted-printable-enkoodaus, jonka käsittelyyn on Pythonissa quopri-moduuli.

Sähköpostin käsittelyyn on Pythonissa valmiita kirjastoja kuten email.message, joita kannattaa varmasti käyttää.

ohjelmaohjelma [03.12.2021 17:56:25]

#

Kiitos, olette varmaan oikeassa, kannattaa hoitaa ongelma kunnolla. Tässä infoa tilanteesta tarkemmin. Kyse on siis liitteen nimestä. Otsikot ja tekstit kääntyy oikein hienosti, olen havainnut ongelman vain liitteen nimessä, kun siinä on tuo =?UTF-8..... Miten saan tämän korjattua oikein, alla tarkemmat tiedot

if msg.is_multipart():
                # iterate over email parts
                for part in msg.walk():
                    # extract content type of email
                    content_type = part.get_content_type()
                    content_disposition = str(part.get("Content-Disposition"))
                    try:
                        # get the email body
                        body = part.get_payload(decode=True).decode()
                    except:
                        pass
                    if content_type == "text/plain" and "attachment" not in content_disposition:
                        # print text/plain emails and skip attachments
                        print(body)
                    elif "attachment" in content_disposition:
                        # download attachment
                        filename = part.get_filename()
                        if filename:
                            folder_name = clean(subject)
                            if not os.path.isdir(folder_name):
                                # make a folder for this email (named after the subject)
                                os.mkdir(folder_name)
                            filepath = os.path.join(folder_name, filename)
                            # download attachment and save it
                            open(filepath, "wb").write(part.get_payload(decode=True))

Metabolix [03.12.2021 18:06:05]

#

”Tarkemmista tiedoista” puuttuvat kaikkein olennaisimmat tiedot, eli missä kohti tuo ongelmallinen teksti on, mitä se teksti ihan tarkalleen sisältää (alusta loppuun) ja mistä se tulee (eli minkä kirjaston mitä luokkia ovat nämä msg, part ym.).

ohjelmaohjelma [03.12.2021 22:21:51]

#

Tämä on ihan käsittämättömän vaikeaa, miten ihmeessä kukaan voi ymmärtää näitä juttuja:-(

neosofta [03.12.2021 23:10:16]

#

ohjelmaohjelma kirjoitti:

...,miten ihmeessä kukaan voi ymmärtää näitä juttuja...

no tässä olis esim. yks 6-vuotias, nyt 7-vuotias

ohjelmaohjelma [04.12.2021 10:14:50]

#

Olen siis vain liian vanha tähän:-D

Minä pohdin ja pohdin ja tulin siihen tulokseen yön valvottuani, että jotakin on kuitenkin keksittävä. Tosiaan vain tuon yhden merkkijonon kanssa oli ongelmia, kaikki muut liitteet ovat tulostuneet oikein, vaikka niissä erikoismerkkejä on ollutkin.

Minä siis tein näin:

Tein ohjelman, joka tunnistaa liitteen nimestä "filename = part.get_filename()" merkkijonon "=?UTF-8?Q?"
Tämän jälkeen ohjelmani käy merkkijonoa läpi ja korvaa jokaisen esim "=c3=a4" merkin taulukosta, joka sisältää kaikki "UTF-8 encoding table and Unicode characters" taulukon merkit.

Ohjelma toimii nyt, vaikka uusia ongelmia voi seurata. Tiedän, että tämä olisi pitänyt tehdä jotenkin fiksummin, mutta minä olen ehkä vain liian huono ohjelmoijaksi tai vanha:-)

Kiitos kuitenkin, kun täällä yritetään aina auttaa:-)

Metabolix [05.12.2021 13:37:12]

#

Ehdotin Pythonin valmiiden luokkien käyttämistä, mutta valitsit sitten kuitenkin sen lähestymissuunnan, että käsittelet kovakoodatusti muutaman UTF-8-merkin ja olet pulassa heti, kun mukana on vieraita merkkejä tai kun enkoodaus onkin vaikka ISO-8859-1.

Jos on pakkomielle tehdä vaikeimman kautta, olisi silti melko helppoa vaikka poimia tuosta enkoodauksen nimi (UTF-8) ja muuttaa sitten =-merkinnät ensin tavuiksi ja dekoodata merkeiksi oikealla merkistökoodauksella.

Jos haluat saada helpommin ja paremmin toimivaa koodia, hieman vanhentuneita mutta helposti käytettäviä Pythonin valmiita funktioita voi soveltaa ongelmaasi vaikka näin:

import email.header
def real_decode_header(s):
	return str(email.header.make_header(email.header.decode_header(s)))

# Esimerkki:
otsikko = "=?UTF-8?Q?T=c3=a4m=c3=a4_on_esimerkkin=c3=a4kym=c3=a4?="
teksti = real_decode_header(otsikko)
print(teksti)

Ehkä myös parempia ratkaisuja löytyy, mutta kuten edellisessä vastauksessa totesin, on hieman epäselvää, mitä luokkia edes käytät tällä hetkellä ja miten niiden siis kuuluisi toimia. (Sekin on ehkä mahdollista, että tiedostonimen automaattisessa purkamisessa on bugi ja siitä pitäisi raportoida käyttämäsi kirjaston kehittäjille.)

ohjelmaohjelma [06.12.2021 08:13:58]

#

Kiitos sinulle. Poimin tuon neuvosi talteen ja jos törmään jatkossa ongelmiin tämän asian tiimoilta, niin tutkin koodiasi ja otan sen käyttöön.
Niin, ehkä koodissa mitä käytin oli jokin vika, sillä se aiheutti ongelmia vain tässä yhdessä tilanteessa. Suomenkieli taitaa olla sellainen kieli, että muu maailma ei ajattele ohjelmia sen kielen näkökulmasta.

ohjelmaohjelma [15.12.2021 17:44:57]

#

Törmäsin vielä yhteen ongelmaan aihepiiriin liittyen:

Kyse on nyt siitä, että yritän kääntää html kieltä tekstiksi:

if content_type == "text/html":
	body = part.get_payload(decode=True)
	soup=BeautifulSoup(body,features="lxml")
	metaTag=soup.find_all('meta')

if metaTag is not None:
	soup=BeautifulSoup(body, features="html.parser")
#body=soup.get_text('\n')
body=soup.get_text() #Tämä hakee vain tekstiä!!!!

Tämä toimii aika hyvin, mutta ei kuitenkaan riittävän hyvin.
Jos avaan bodyn selaimella, niin teksti on selkeää ja oikein ryhmitelty.
Tämä ohjelmanpätkä muuntaa html kielen tekstiksi, mutta siinä on puutteita.
Tietyissä viesteissä rivinvaihtoa ei tapahdu, mutta sen voi korjata tuolla koodissa olevalla #body=soup.get_text('\n') rivillä, mutta sitten se rivittää
kaikki muutkin rivit, jossa tarvetta ei olisi. Tämän lisäksi joissain viesteissä voi tulla silti muotoilukoodeja häiritsemään tekstin muodostusta.
Jäin miettimään, että löytyisikö tähän jokin parempi keino purkaa html viestejä?
Siis en halua käyttää selainta viestien tulkitsemiseen.

Metabolix [15.12.2021 19:49:12]

#

Vastaus HTML-kysymykseen löytyy edellisestä samanlaisesta keskustelusta. Lyhyesti: Ei ole yleispätevää hyvää keinoa tehdä selaimen työtä muuten kuin käytännössä tekemällä selain. Kaikki muut viritelmät toimivat väärin ainakin jossain tilanteessa, todennäköisesti ainakin taulukoiden ja muun monimutkaisen asettelun kohdalla. Mahdollisia viritelmiä on tietysti monta ja niistä voi etsiä omaan tarkoitukseen vähiten huonoa. Linkin takaa löytyy viritelmä, jota voi ainakin helposti kehittää itse.

Kysyn vielä uudestaan: mikä koulutehtävä tämä on, kun idea, tietolähde, ongelmat ja jopa sanat (kuka sanoo "muotoilukoodi"?) ovat ihan samoja kuin kaverilla hetki sitten?

ohjelmaohjelma [16.12.2021 14:06:55]

#

Koulutehtävä ei ole kyseessä. Olen vain kiinnostunut ohjelmoinnista ja käyn mm. näillä sivuilla tutkimassa kiinnostavia asioita. Sitten välillä iskee tällainen pakkomielle ja haluan vajavaisilla kyvyilläni ratkaista ongelmia ja joskus tarvitsen siihen viisaampien apua. En tiedä mitään termeistä, joten apinoin viisaiden sanoja:-D

Kävin katsomassa linkkiäsi, mutta minulla ei ole kokemusta näistä luokista, olen yrittänyt pärjätä ilman niitä. En siis osaa hyödyntää tuota, mutta jo se auttaa, että tiedän olevan mahdollista muuttaa html kieltä tekstiksi, täydellistä sen ei siis tarvitsisi olla.

ohjelmaohjelma [16.12.2021 16:40:14]

#

Vielä... löysin tällaisen, aloin juuri tutkimaan sitä.

html2text
html2text is a Python script/module that converts a page of HTML into clean, easy-to-read plain ASCII text. Better yet, that ASCII also happens to be valid Markdown (a text-to-HTML format).

ohjelmaohjelma [16.12.2021 17:46:36]

#

No nyt pääsin testaamaan tätä jo useamman kerran ja näyttää siltä, että tämä toimii:-)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta