Realizarea unui sistem tehnic cu răspuns automat folosind SMSDTMF [307086]

ROMÂNIA

MINISTERUL APĂRĂRII NAȚIONALE

ACADEMIA TEHNICĂ MILITARĂ

Facultatea de Sisteme Electronice și Informatice Militare

Specializarea “Trasmisiuni”

PROIECT DE SEMESTRU

Tema : ”Realizarea unui sistem tehnic cu răspuns automat folosind SMS/DTMF”

Stud.Sg.Maj: [anonimizat]:

Lt.Col.conf.dr.ing: POPESCU Florin

BUCUREȘTI

2018

Capitoul 1.Introducere

Proiectul presupune efectuarea unui cercetări pentru realizarea unui sistem tehnic cu răspuns automat folosind serviciul de mesaje scurte deoarece tehnologia mobilă este una dintre cele mai dezvoltate si mai complexe aplicații de telecomunicații.

[anonimizat] a tuturor abonaților telefonici noi din întreaga lume. [anonimizat].

În ultimele decade comunicațiile digitale au cunoscut o creștere rapidă. [anonimizat], [anonimizat], serviciile multimedia au schimbat modul de viață al oamenilor.

Dezvoltarea comunicațiilor și a tehnologiilor de procesare a informației a deschis mai multe piețe pentru noile servicii de comunicații. Datorită cererii de servicii de comunicație fără fir în continuă creștere acestea s-au dezvoltat continuu.

[anonimizat], este un serviciu de telecomunicații care permite trimiterea de mesaje scurte între telefoanele mobile. SMS-[anonimizat], pe toate rețelele wireless la nivel global și poate atinge aproape toate cele 4-6 [anonimizat].

Noțiunile prezentate în primul capitol sunt prezentate generalitați privind accesul informațiilor la distanță. Aceste noțiuni au rolul de a oferi o perspectivă asupra funcționalității și a modului de utilizare a serviciului de mesaje scurte.

[anonimizat], [anonimizat], [anonimizat], [anonimizat].

Capitolul trei este dedicat exclusiv parții de implementarea a proiectului. [anonimizat]/DTMF. Trimiterea imaginii prin intermediul aplicației Qpython3 contul de Gmail.Pentru realizarea sistemului am instalat programul Python 3 [anonimizat]-Python(OpenCV) pe care îl utilizez pentru a prelucra imaginea și a [anonimizat] o bază de date care îmi este necesară pentru a [anonimizat], [anonimizat], printr-un SMS pe telefonul mobil.

[anonimizat].

Capitolul 2. [anonimizat], conceput la sfârșitul anilor 1980, iar implementarea sa a inceput în decembrie 1989 de către Guido van Rossun la CWI(Centrum Wiskunde&Informatica) din Olanda. Preia ceea ce scrii (în mod normal denumit cod), îl transformă în instrucțiuni pentru calculatorul tău și le execută. Metoda prin care interacționăm cu interpretorul Python este prin utilizarea consolei sistemului de operare (OS, prescurtare de la Operating System).

O consolă (sau ‘terminal’, sau ‘linie de comandă’) este o formă de a interacționa cu sistemul tău de operare în mod text, așa cum ‘desktop’-ul, în combinație cu mouse-ul tău, este metoda grafică de interacțiune cu sistemul tău.

Python-ul este un limbaj de programare foarte popular, oferind posibilitatea programării structurate, dar și orientate pe obiect, incluzând și elemente din paradigma funcțională.

Este un limbaj de scripting, ceea ce înseamnă că este interpretat și nu compilat, economisind mult timp în procesul de dezvoltare și debugging. Limbajul combină o putere remarcabilă cu o sintaxă foarte clară. Are module, clase, excepții, tipuri dinamice și garbage collection.

API-ul Python oferă module pentru o gamă foarte mare de funcționalități, de la cele de bază pentru lucrul cu șiruri și fișiere, până la cele pentru lucrul cu procese, threaduri, sockets, serializare etc. Multe dintre aceste module oferă o interfață foarte similară programării la nivel de sistem din C (ceea ce se studiază la SO), astfel încât funcțiile Python au același nume si aproximativ aceiași parametrii ca cei pentru funcțiile din C pentru apeluri de sistem. Există o varietate de API-uri, cele mai populare la momentul actual fiind cele pentru aplicatii web, AI bots, data science si grafice, de exemplu: wit.ai, flask, NumPy, SciPy, pandas, plotly, Matplotlib, Python & RaspberryPi.

Implementarea principală a Python, CPython (în C) a fost concepută pentru a fi portabilă: funcționează pe Linux, Unix, Windows, Mac OS X. Programele pot fi executate, de asemenea, și pe mașina virtuală Java prin folosirea compilatorului Jython, care le transformă în bytecode Java și permite folosirea de clase Java în cadrul acestora. Similar, există IronPython pentru .NET.

Python este un limbaj ce oferă foarte multe funcționalități și are o curbă de învățare rapidă atât pentru programatorii ce cunosc deja limbaje precum C și Java, cât și pentru începători. Deși este un limbaj interpretat, acest lucru nu a stat în calea popularității sale și folosirii în numeroase proiecte. Puteți utiliza Python atât pentru scripturi, dezvoltarea unor infrastructuri de testare, cât și pentru aplicații web și machine learning/data mining.[1]

Python este un limbaj de scripting orientat la nivel înalt, interpretat, interactiv și orientat spre obiect. Python este proiectat pentru a fi ușor de citit. Utilizează frecvent cuvinte cheie în limba engleză, în timp ce celelalte limbi utilizează semne de punctuație. Are mai puține construcții sintactice decât alte limbi.

interpretat – Python-ul este procesat de către interpret în timpul rulării. Nu este nevoie să compilați programul înainte de a executa;

interactiv – puteți să stați într-un prompt Python și să interacționați direct cu interpretul pentru a vă scrie programele;

orientat pe obiecte – Python-ul acceptă stilul orientat pe obiect sau tehnica de programare care încapsulează codul în obiecte;

limbă a începătorului–Python-ul este un limbaj excelent pentru programatorii de nivel începător și sprijină dezvoltarea unei game largi de aplicații, de la procesarea textului simplu la browserele jocurilor.

Caracteristicile lui Python includ:

ușor de învățat – Python-ul are câteva cuvinte cheie, o structură simplă și o sintaxă bine definită. Acest lucru permite unui elev să preia limba rapid;

codul Python ușor de citit este mai clar definit și vizibil pentru ochi;

ușor de întreținut – codul sursă al lui Python este destul de ușor de întreținut;

o bibliotecă largă standard–cea mai mare parte a bibliotecii Python este compatibilă pe platforme UNIX, Windows și Macintosh foarte portabil și cross-platform;

mod interactiv – Python-ul are suport pentru un mod interactiv care permite testarea interactivă și depanarea fragmentelor de cod;

portabil – Python-ul poate rula pe o mare varietate de platforme hardware și are aceeași interfață pe toate platformele;

extensibil–Puteți adăuga module de nivel inferior la interpretul Python. Aceste module permit programatorilor să adauge sau să personalizeze uneltele pentru a fi mai eficiente;

baze de date–Python-ul oferă interfețe pentru toate bazele de date comerciale majore;

GUI Programming – Python-ul acceptă aplicații GUI care pot fi create și portate la numeroasele apeluri de sistem, biblioteci și sisteme Windows, cum ar fi Windows MFC, Macintosh și sistemul X Window din Unix;

Scalable – Python-ul oferă o structură și un suport mai bun pentru programe mari decât scripting shell.[2]

2.2 Deschiderea unei console în Windows

Consola Windows este Command Prompt, numită cmd. O variantă simplă pentru a o obține este să utilizezi combinația Windows+R (unde Windows este tasta cu sigla Windows), care ar trebui să deschidă un dialog Run. Scrie apoi cmd și apasă Enter sau dă clic pe Ok. Poți de asemenea să o cauți în meniul de start. Ar trebui sa arate cam așa:

C:\Users\myusername>

Command Prompt-ul din Windows nu este la fel de puteric precum omologii lui din Linux și OS X, așa că ar fi posibil să dorești să apelezi Interpretorul Python (vezi mai jos) direct, sau utilizând programul IDLE cu care se livrează Python. Le poți găsi în meniul de Start.[1]

2.3Executarea unui program Python

În Windows, dacă extensia .py este deja înregistrată, un dublu-click pe numele scriptului este suficient. Se poate edita programul folosind GUI-uri ca IDLE (Python GUI) și Eclipse sau editat în notepad++ și executat din consolă (Start→Run→cmd).

Particularitățile principale de sintaxă:

Indentarea:

Indentarea în Python este mai mult decât parte a stilului de programare, este chiar parte din sintaxă;

linie nouă termină o declarație, pentru a continua o declarație pe mai multe linii, se foloseste caracterul “\”;

Un bloc de cod are toate liniile indentate cu același număr de spații (nu există begin și end sau {}). Instrucțiunile dintr-un bloc de cod vor fi grupate unele sub altele, pe același nivel de indentare;

Definițiile neindentate într-un program Python vor fi de obicei variabile globale, definiții de clase, proceduri, funcții sau părți ale main-ului;

După instrucțiuni nu este obligatoriu să puneți simbolul ';' precum în alte limbaje de programare, indentarea corespunzatoare fiind suficientă;

Este foarte important sa nu uitați simbolul ':' care precede o indentare.

a = 1

# Afisam numerele de la 1 la 10

while a <= 10:

print a,

a += 1

print "Numerele de la 1 la 10"

Comentarii:

O singură linie se poate comenta în Python folosind simbolul #;

Pentru comentarii multi-line se folosesc trei ghilimele succesive """ sau ''' la inceputul și respectiv la sfârșitul zonei de comentat;

Comentariile cu ghilimele succesive din interiorul unui bloc de cod trebuie să fie pe același nivel de indentare cu acesta, altfel veți avea IndentationError la execuție. Comentariile cu # nu au această restrictive;[3]

if b > 3:

""" Comentariu """

a = b

Simple Mail Transfer Protocol & Internet Message Access Protocol

În cadrul proiectul am folosit pentru trimiterea imaginii protocolul SMTP cu ajutorul aplicației QPython3, iar pentru extragereaacesteia am utilizat protocolul IMAP.

Una dintre cele mai populare servicii de rețea, e-mailul este susținut de protocolul TCP / IP SMTP. Acesta oferă sistem de trimitere a mesajelor către alte computere și furnizarea unui schimb de mesaje între utilizatori.

SMTP suportă:

Trimiterea unui mesaj către unul sau mai mulți destinatari;

Trimiterea unui mesaj care include texte, voce, video sau grafică;

Trimiterea mesajelor către utilizatorii din rețea în afara Internetului.

Mail-ul electronic (e-mail) este una dintre cele mai populare servicii de rețea din zilele noastre. Majoritatea sistemelor de e-mail care trimit mesaje prin internet utilizează SMTP(Simple Mail Transfer Protocol) pentru a trimite mesaje de la un server la altul. Mesajele pot fi apoi preluate cu un client de poștă electronică utilizând fie POP (Post Office Protocol), fie IMAP (Internet Message Access Protocol).

SMTP este folosit ca mecanism comun pentru transportul mail-ului electronic între diferite host-uri din cadrul stivei Transmission Control Protocol/Internet Protocol (TCP / IP). Este un protocol de aplicație. Client SMTP deschide o conexiune TCP la un server SMTP de pe un host la distanță și încearcă să trimită mail prin întreaga conexiune. Serverul SMTP ascultă conexiunea TCP pe port specificat (25), iar clientul SMTP inițiază o conexiune pe acel port. Atunci când conexiunea TCP s-a realizat, cele două execută un simplu dialog de cerere-răspuns, definit de protocolul SMTP, în care clientul transmite adresele mail-ului inițiatorului și ale destinatarului printr-un mesaj. Când serverul acceptă aceste adrese de mail electronic, clientul transmite mesajul instantaneu de e-mail.

Mesajul trebuie să conțină un antet și textul ("Body") formatat în conformitate cu RFC 822. Mesajul care sosește prin SMTP este redirecționat către un server sau este livrat către mailbox de pe serverul local. POP3 sau IMAP permit utilizatorilor să descarce mail-ul stocat pe serverul local. Un mailbox reprezintă destinația la care sunt livrate mesajele, este echivalentul cutiei de scrisori în din sistemul poștal.

Modelul SMTP suportă metode de livrare a mail-ului: end-to-end și store-and-forward. Metoda end-to-end este utilizată între structuri,iar cealaltă este aleasă pentru a funcționa în cadrul structurilor care au rețele bazate pe TCP/IP și SMTP.

Un client SMTP va contacta direct serverul SMTP al host-ului de destinație pentru a livra e-mailul. Acesta va păstra item-ul mail-ului de transmis până când va fi copiat pe SMTP-ul al destinatarului. Acest lucru este diferit de principiul store-and-forward, care este comun în multe alte sisteme de corespondență electronică, în cazul în care item-ul mail-ului poate să treacă printr-un număr de host-uri intermediare în aceeași rețea în drum spre destinație și unde transmisia de la expeditor indică numai faptul că mail-ul a atins primul hop intermediar.

Standardul RFC 821 definește un protocol client-server. Clientul SMTP este cel care inițiază sesiunea (adică SMTP-ul de expediere) și serverul este cel care

răspunde (SMTP care primește) la cererea de sesiune. Deoarece clientul SMTP acționează frecvent ca un server pentru un program de trimitere prin poștă, este adesea mai simplu să se facă referire la client ca SMTP-expeditor și la server ca receptor-SMTP.

E-mail-ul este trimis printr-o serie de tranzacții de cerere-răspuns între un client și un server.

Câmpuri frecvent utilizate (cuvintele cheie) sunt următoarele:

to – destinatarii primari ai mesajului;

cc – destinatari secundari ("carbon-copy") ai mesajului;

from – identitatea expeditorului;

replay-to – căsuța poștală la care vor fi trimise răspunsurile. Acest câmp este adăugat de inițiator;

return-path – adresa și traseul către autorul inițial. Acest câmp este adăugat de sistemul de transport final care livrează mail-ul;

Subject – rezumatul mesajului. Utilizatorul furnizează de obicei rezumatul.

Serverul SMTP trimite și primește mail-uri de la alte host-uri utilizând SMTP. Serverul SMTP procesează toate mail-urile primite și trimise. Mail-ul de ieșire este afișat până când serverul SMTP poate confirma că a ajuns la destinație; mail-ul de intrare este pregătit, așteptând până când utilizatorii îl accesează folosind un client de mail POP3 sau IMAP4.

IMAP este un protocol pentru recuperarea mesajelor e-mail .Versiunea IMAP4 este similară cu cea din POP3, dar acceptă câteva caracteristici suplimentare. De exemplu, cu IMAP4, utilizatorul poate căuta prin mesajele sale e-mail-uri prin cuvintele cheie în timp ce mesajele se află încă pe serverul de mail,apoi utilizatorul poate să aleagă ce mesaje să descarce. IMAP utilizează SMTP ca mecanism de transport. Serverele IMAP sunt ca și oficiile poștale, în timp ce SMTP este ca și transportatorii poștali. IMAP utilizează TCP pentru a profita de serviciile fiabile de livrare a datelor, care sunt alocate pe portul TCP 143.

IMAP are multe funcții avansate, cum ar fi abilitatea de a adresa mail-ul nu prin numărul de sosire, ci prin utilizarea de atribute (de ex., "Descărcați ultimul mesaj de la Alex"). Această caracteristică permite căsuța poștală sau mailbox-ul să fie structurată mai degrabă ca un sistem de baze de date relaționale decât o succesiune de mesaje.[4]

Avantajele IMAP:

mesajele de e-mail nu sunt pierdute în cazul unui accident de sistem sau al unui PC furat, deoarece acestea sunt stocate online;

abilitatea de a seta flag-uri de stare a mesajului;

gestionarea cutiei poștale(mailbox) la distanță (list / create / rename / delete);

suport pentru actualizarea simultană în foldere comune pe diferiți clienți

abonarea selectivă a cutiilor poștale(mailbox) relevante;

libertatea de a previzualiza numai părți ale mesajului fără a descărca întregul e-mail;

utilizatorii pot decide când să descarce atașament;

Dezavantaje ale IMAP:

mesajele noi de intrare nu vor fi disponibile dacă nu există nicio conexiune de date. Mesajele existente nu sunt, de obicei, disponibile offline dacă nu sunt descărcate copii de cache;

cantitățile mari de e-mail și atașamente pot ajunge la capacitatea maximă și pot atinge limita de spațiu desemnată pentru contul IMAP de pe server.[5]

IMAP a fost proiectat cu scopul de a permite gestionarea completă a unui mailbox de către mai mulți clienți de e-mail, prin urmare, clienții în general lasă mesajele pe server până când utilizatorul le șterge în mod explicit. Un server IMAP are asignat de obicei portul 143, iar IMAPS are atribuit portul 993.

Practic, toți clienții și serverele moderne de e-mail acceptă IMAP. IMAP și POP3 sunt cele mai răspândite două protocoale standard pentru recuperarea e-mail-urilor, cu mulți furnizori de servicii webmail, cum ar fi Gmail, Outlook.com și Yahoo! Mail-ul oferă, de asemenea, suport pentru IMAP sau POP3.

Internet Message Access Protocol este un protocol la nivelul aplicație care permite unui client de e-mail să acceseze e-mailuri de pe un server de e-mail la distanță.

În concluzie, SMTP-ul este un protocol de aplicație din stiva de protocoale TCP / IP care permite suportul e-mailului pe internet.

Mesajul este trimis printr-o serie de tranzacții de cerere-răspuns între un client și un server. Tranzacțiile transmit mesajul, care este alcătuit din antet și corp, sursa SMTP și adresele de destinație.

Protocolul IMAP este utilizat de clienții mail pentru preluarea mesajelor e-mail stocate pe servere. Ultima versiune, IMAP4, este similară cu POP3, dar acceptă câteva caracteristici suplimentare; de exemplu, un utilizator poate căuta prin mesajele sale e-mail pentru cuvintele cheie în timp ce mesajele sunt încă pe serverul de e-mail. Utilizatorul poate alege apoi mesajele pe care le va descărca pe computerul său. În timp ce aplicațiile bazate pe IMAP pot funcționa în modul deconectat, acestea funcționează de obicei în modul online sau deconectat-resincronizare.[6]

Prelucrare de imagine

OpenCV ,,Open Source Computer Vision Library” este o bibliotecă de funcții open source, scrisă în C și C++. Librăria a fost proiectată astfel încât să ofere eficiență computațională pentru aplicații de computer vision în timp real. Biblioteca OpenCV conține peste 500 de funcții care acoperă domenii precum imagistica medicală, securitatea, calibrarea camerelor fotografice, vedere stereo sau robotică. Suplimentar OpenCV conține o un set complet de funcții de machine learning (MLL).

Scopul librariei este de a pune la dispozitie potențialilor utilizatori o infrastructură de procesare a imaginilor ușor de folosit ce poate fi utilizată în dezvoltarea rapidă a unor aplicații complexe.

Lansat oficial în 1999, proiectul OpenCV a fost la începuturi o inițiativă a cercetătorilor de la Intel pentru aplicații care folosesc intensiv procesorul. Din proiectul inițial făceau parte aspecte legate de urmărirea razelor de lumină și desenarea 3D a pereților. Principalii contributori la dezvoltarea proiectului au fost programatorii de la Intel ¸si o parte din experții în procesare și analiza imaginilor de la Intel Rusia. În faza de început a proiectului, obiectivele principale impuse au fost:

O cercetare amanunțită în domeniul prelucrării imaginilor oferind nu numai codul funcțional, dar și un cod optimizat pentru o platformă fundamentaă în domeniul prelucrării informației vizuale;

Standardizarea cunoștințelor de programare în domeniul prelucrării imaginilor astfel încât să se ofere programatorilor o platformă ușor de folosit și transferabilă;

Suport pentru aplicații comerciale avansate în prelucrarea imaginilor astfel încât să fie portabile ¸si optimizate.

Prima versiune, alpha de OpenCV a fost lansată în cadrul conferinței “IEEE Conference on Computer Vision and Pattern Recognition” din 2000, iar 5 versiuni beta au fost lansate între 2001 și 2005. Prima versiune 1.0 a fost lansată în 2006. La mijlocul anului 2008, OpenCV a obținut suport din partea corporației Willow Garage și este acum din nou sub dezvoltare. Versiunea 1.1 “pre-release” a fost lansată în octombrie 2008, iar o carte a fost scoasă de editura OReilly Media pe piața în aceeași lună.

Figura 2.1: Structura librăriei OpenCV

A doua versiune a fost scoasă pe piață în octombrie 2009. OpenCV 2 include schimbări majore în interfața C++, oferind noi funcții, o implementare mai bună a funcților existente, în special pentru sisteme multi-core. OpenCV poate rula pe Linux, Windows ¸si Mac OS X, având interfețe pentru Python, Matlab, Ruby și altele [6]. În această parte a lucrării vom inspecta principalele aspecte de funcționalitate pe care le oferă biblioteca OpenCV. Suplimentar există suport pentru C++ (bazat pe clase și mult mai apropiat de pachetul de image processing din Matlab) respectiv pentru Python.

2.5.1Structura

OpenCV conține peste 500 de funcții pentru numeroase domenii ce folosesc Computer VisionOpenCV și este structurată în 5 componente principale (cum este parțial prezentat și în figura 1.1):

CV: conține algoritmi de bază pentru prelucrarea imaginilor;

MLL: reprezintă libraria pentru “machine learning” și conține numeroși clasificatori statistici și funcții pentru clustering;

HighGUI: conține rutinele de I/O precum și funcțiile pentru încărcarea și stocarea imaginilor și filmelor;

CXCore: conține tipurile de date de bază;

CVAux: conține algoritmi experimentali (segmentare fundal/primplan, algoritmi de recunoaștere, algoritmi de tracking, modele Markov ascunse 1D și 2D, descriptori de textură).

OpenCV conține suport pentru câteva tipuri primitive de date, primitive nu din punctul de vedere al limbajului C, ci pentru că sunt structuri simple și pot fi privite ca date atomice.

Cel mai simplu tip este CvPoint. CvPoint-ul este o structură simplă cu doi membrii întregi: x și y. Tipuri similare sunt CvPoint2D32f care are 2 membrii x, y în virgulă mobilă, iar CvPoint3D32f ce are 3 membrii x, y, z de tipul float. Un alt tip de date, CvSize se aseamănă cu CvPoint, având doi membrii width și height. Pentru varianta în virgulă mobilă există tipul CvSize2D32f. CvRect se aseamănă cu cele 2 tipuri de mai sus (CvPoint și CvSize) și are patru membrii: x, y, width și height. CvScalar este un set de patru numere de precizie dublă. Atunci când nu există limitări de memorie, tipul CvScalar este folosit destul de des pentru reprezentarea numerelor reale. CvScalar are un singur membru val, care este un pointer către vectorul ce conține cele patru numere de dublă-precizie în virgulă mobilă. Toate aceste tipuri au metode constructor cu același nume ca al tipului. De exemplu tipul CvSize are constructorul cvSize(). Ținând cont de faptul că aceste metode sunt scrise în limbajul C, ele sunt pur și simplu funcții inline care au o listă de argumente și returnează structura dorită cu valorile setate corespunzător. Constructorii inline pentru aceste tipuri de date cvPoint(), cvSize(), cvRect() și cvScalar() sunt foarte utili pentru că fac codul ușor de scris și ușor de citit; de exemplu pentru desenarea unui dreptunghi alb între (10, 20) și (40, 50) este suficient apelarea de mai jos[7]:

cvRectangle(

Imagine,

cvPoint(10,20),

cvPoint(40,50),

cvScalar(255,255,255)

);

Figura 2.2 Tabel cu structuri(funcții), tipul și reprezentarea acestora

2.5.2 Filtare

Tradițional, în acest subcapitolul de “filtrare” se discută despre filtrare liniară respectiv neliniară, și despre extragerea contururilor respectiv mediere (sau netezire). Operația de filtrare (convoluție liniară cu un nucleu) poate fi implementată cu ajutorul funcției:

void cvFilter2D(

const CvArr* src,

CvArr* dst,

const CvMat* kernel,

CvPoint anchor=cvPoint(-1, -1))

Parametrii funcției au semnificația:

src: imaginea sursă;

dst: imaginea destinație ;

kernel: nucleul de convoluție este o matrice de tip float cu un singur canal care se aplică pe toate cele trei plane de culoare;

anchor: ancora nucleului va indica poziția relativă a punctului ce corespunde punctului curent față de colțul stânga sus al nucleului.Valoare implicită este (−1, −1) ce presupune ca nucleul se centrează pe punctul curent.

Acestă funcție aplică un filtru liniar unei imagini. Marginile imaginii se completează cu cel mai apropiat vecin disponibil (prin replicare).

Pentru netezire OpenCV-ul oferă funcția cvSmooth. Prototipul acestei funcții este:

void cvSmooth(

const CvArr* src,

CvArr* dst, int smoothType,

int param1,

int param2,

double param3,

double param4);

Parametrii funcției au semnificația următoare:

src: imaginea sursă;

dst: imaginea destinație;

smoothtype: determină tipul de netezire. Valorile predefinite sunt:

CV BLUR NO SCALE: implementează convoluție liniară cu un nucleu dreptunghiular de dimensiuni param1×param2, în care toate valorile sunt 1. Energia imaginii nu se pătrează (crește) în urma acestei operații;

CV BLUR – convoluție liniară cu nucleu dreptunghiular de dimensiuni param1×param2, în care toate valorile sunt 1, urmată de sclarea valorilor pentru conservarea energiei;

CV GAUSSIAN – convoluție liniară cu un nucleu gaussian de dimensiuni param1×param2;

CV MEDIAN – filtru median (filtru neliniar de ordine) pe o vecinătate de diametru param1×param1;

CV BILATERAL filtru bilateral aplicat pe o vecinătate de dimensiuni param1×param1, iar variantă color este dată de param3 și variantă spațială de param4.

param1 – primul parametru al operației de netezire și reprezintă diametrul orizontal al nucleului de filtrare. Trebuie să fie un număr pozitiv impar (1, 3, 5, etc.);

param2 – al doilea parametru al operației de netezire și reprezintă diametrul vertical al nucleului de filtrare. Este ignorat în cazul filtrării mediane și bliaterale. Trebuie să fie un număr pozitiv impar;

param3 – În cazul netezirii gaussiene are semnificația de deviație standard.

2.5.3Extragerea contururilor

Pentru detecția contururilor, bibliotecile OpenCV pun la dispozitie 3 metode: operatorii primari Laplace și Sobel și operatorul evoluat Canny.

Detecția de contururi folosind operatorul Sobel presupune convoluția imaginii cu două nuclee: unul care să facă mediere pe orizontală și să măsoare amplitudinea nucleelor pe verticală și unul care să netezească pe verticală și să caute muchii pe orizontală. Cele două imagini rezultante se compun (radical din suma patratelor).

Pentru a folosi operatorul Sobel se apeleaz˘a la funcția cvSobel. Sintaxa acesteia este:

void cvSobel(

const CvArr* src,

CvArr* dst,

int xorder,

int yorder,

int apertureSize);

Parametrii necesari sunt:

src: imaginea originală (sursă);

dst: imaginea finală (destinație). Reprezintă contururile imaginii inițiale;

xorder: ordinul derivatei pe direcția x;

yorder: ordinul derivatei pe direcția y ;

aperture size: dimensiunea kernelului aplicat. Poate fi 1, 3, 5 sau 7.

Nucleul Sobel pentru direcția x este:

Nucleul Sobel pentru direcția y este:

Operatorul Sobel poate fi aplicat pe directia x folosind următoarea sintaxă: cvSobel(imgine, destinatie, 1, 0, 3);

Trebuie menționat că de cele mai multe ori imaginea finală (destinație) conține valori mult mai mari decât imaginea sursă (în valoare absolută), și, pentru a evita depășirea de scală este nevoie ca imaginea destinație sa fie reprezentată pe 16b, dacă imaginea sursă este reprezentată pe 8b.

Detecția de contururi folosind operatorul Laplace are la bază derivata a doua:

dst(x, y) =

în timp ce Sobel presupune calculul derivatei întâi.

Pentru a folosi operatorul Laplace putem apela la functia de OpenCv cvLaplace. Sintaxa acesteia este:

void cvLaplace(

const CvArr* src,

CvArr* dst,

int apertureSize=3)

Parametrii:

src – imaginea originală (sursă);

dst – imaginea finala (destinație). Reprezintă contururile imaginii inițiale;

apertureSize – dimensiunea nucleului aplicat. Poate fi 1, 3, 5 sau7.

Nucleul Laplace aplicat, pentru o apertură de 1 este:

Și în acest caz, imaginea finală (destinație) poate conține valori mult mai mari decât imaginea sursă (în valoare absolută), și, pentru a evita depașirea de scală este nevoie ca imaginea desținatie să fie reprezentată pe 16b, dacă imaginea sursă este reprezentată pe 8b.

Detecția de contururi folosind operatorul Canny implementează un algoritm complex bazat pe extragere de contururi ce include netezire gaussiană pentru reducerea zgomotului, detecție de contururi cu operatorul Sobel, eliminarea valorilor non-maximale și binarizarea adaptivă contururilor continue [8]. Pentru a folosi operatorul Canny putem apela la funcția de OpenCv cvCanny. Sintaxa acesteia este:

void cvCanny(

const CvArr* image,

CvArr* edges,

double threshold1,

double threshold2,

int aperture size );

Semnificația parametrilor este:

image – imaginea originală (sursă);

edges – imaginea finala (destinație). Reprezintă contururile imaginii inițiale;

threshold1 – valoarea primului prag;

threshold2 – valoarea celui de-al doilea prag;

aperture size – dimensiunea nucleului aplicat. Poate fi 1, 3, 5 sau 7.

Valoarea cea mai mică dintre threshold1 și threshold2 este folosită pentru a uni contururile, iar valoarea cea mai mare este folosită pentru a determina segmentele de contururi puternice.

Baze de date

SQLite este o mică bibliotecă care implementează un motor de baze de date SQL încapsulat, oferă posibilitatea de a-l introduce în diverse sisteme și necesită zero-configurare. Aceasta în anul 2000 a fost proiectată în scopul lipsei de administrație necesară pentru operarea unui sistem de către D. Richard Hipp, iar în luna august, a fost lansat SQLite 1.0 cu GNU Database Manager. În anul 2011, Hipp și-a propus să adauge interfața UNIQI la SQLite DB și să dezvolte UNQLite (bază de date orientată pe documente).

Python oferă două interfețe populare pentru lucrul cu biblioteca de baze de date SQLite: PySQLite și APSW. Fiecare interfață vizează un set de nevoi diferite.

2.6.1 PySQLite

PySQLite oferă o interfață standardizată Python DBI API 2.0 la baza de date SQLite. Dacă aplicația dvs. trebuie să suporte nu numai baza de date SQLite, ci și alte baze de date, cum ar fi MySQL, PostgreSQL, Oracle etc., PySQLite este o alegere bună. PySQLite face parte din biblioteca Python Standard de la Python versiunea 2.5.

2.6.2 APSW

Dacă aplicația trebuie să accepte numai baza de date SQLite, trebuie să utilizați modulul APSW, cunoscut sub numele de Un alt Python SQLite Wrapper.

APSW oferă cel mai subțire strat peste biblioteca de baze de date SQLite. APSW este conceput pentru a imita SQLite C nativ, prin urmare, orice puteți face în SQLite C API, o puteți face și din Python.

Pe lângă acoperirea bibliotecii SQLite, APSW oferă multe caracteristici de nivel scăzut, inclusiv capacitatea de a crea agregate, funcții și collații definite de utilizator de la Python. Permite scrierea unei implementari de tabele virtuale utilizând Python. SQLite nu necesită un proces sau un sistem separat pentru a funcționa (Serverless).

Standardul Python pentru interfețele bazei de date este Python DB-API. Majoritatea interfețelor bazei de date Python respectă acest standard. Python Database API suportă o gamă largă de servere de baze de date, cum ar fi: GadFly, mSQL, MySQL, PostgreSQL, Microsoft SQL Server 2000, Informix, Interbase, Oracol,sybase,SQLite.

API-ul bazei de date oferă un standard minim pentru a lucra cu bazele de date utilizând structurile și sintaxa Python ori de câte ori este posibil. Python are un suport încorporat pentru SQLite. Acest API include următoarele :

importarea modulului API;

obținerea unei conexiuni cu baza de date;

emiterea de instrucțiuni SQL și proceduri stocate;

închiderea conexiunii.[8]

Caracteristici generale:

SQLite vine cu configurație zero, ceea ce înseamnă că nu este nevoie de configurare sau administrare;

bază de date completă SQLite este stocată într-un singur fișier disc pe platformă;

SQLite este foarte mic și greutate redusă, mai puțin de 400KiB complet configurabil sau mai puțin de 250KiB (1 Kibibyte = 210 bytes) cu caracteristici opționale omise;

SQLite este autonom, ceea ce înseamnă că nu există dependențe externe;

SQLite suportă majoritatea funcțiilor limbajului de interogare găsite în SQL92 (SQL2) standard;

SQLite este scris în ANSI-C și oferă API simplu și ușor de utilizat.

SQLite este disponibil pe UNIX (Linux, Mac OS-X, Android, iOS) și Windows (Win32,WinCE, WinRT).

Comenzile SQLite standard pentru a interacționa cu bazele de date relaționale sunt similare cu SQL. Ele sunt CREATE, SELECT, INSERT, UPDATE, DELETE și DROP. Aceste comenzi pot fi clasificate în grupuri pe baza naturii lor operaționale.

DDL – Data Definition Language

CREATE-creează un nou tabel, o vizualizare a unui tabel sau alt obiect din baza de date;

ALTER-modifică un obiect de bază de date existent, cum ar fi un tabel ;

DROP-șterge un tabel întreag, o vedere a unui tabel sau a altui obiect în bază de date.

DML – Data Manipulation Language

INSERT-crează o înregistrare;

UPDATE-modifică înregistrările;

DELETE-șterge înregistrările.

DQL – Data Query Language

SELECT-selectează anumite înregistrări dintr-unul sau mai multe tabele[8]

În concluzie, SQLite este un sistem open-source de gestiune de baze de date relaționale, conținut într-o bibliotecă de C. Este portabil, ușor de utilizat, compact și eficient. Este o bază de date incorporata în aplicația pe care o servește, se comportă ca o parte a programului pe care îl găzduiește. Avantajul de a avea un server de baze de date în interiorul programului este acela că nu mai este necesară nicio configurare de rețea. Clientul și serverul rulează același proces.[9]

Capitolul3. Partea practică- Implementare

Inițial, voi realiza o poza cu telefonul mobil unui autoturism pe care o voi trimite prin intermediul aplicației Qpython3(care se foloseste sistemul de operare Android) pe contul de Gmail.

Pentru realizarea sistemului am instalat programul Python 3 care îmi folosește la extragerea unei imagini de pe contul de Gmail, Visual Studio-Python(OpenCV) pe care îl utilizez pentru a prelucra imaginea și a extrage din aceasta caractere aparute, MySQL este o bază de date care îmi este necesară pentru a crea un tabel, unde voi introduce caracteristici tehnice ale obiectului identificat in imagine, iar la final le voi trimite, cu ajutorul programului Arduino, printr-un SMS pe telefonul mobil.

Aplicația Qpython

QPython este un motor de script în care rulează limbajul de programare Python pe dispozitivele Android. Permite dispozitivului dvs. Android să execute scripturi și proiecte Python. Conține interpretul, consola, editorul Python și librăria SL4A pentru Android.

Proiectul QPython include aplicațiile QPython și QPython3.Aplicația QPython utilizează Python 2.7.2, iar aplicația QPython utilizează Python 3.2.2.

3.1.1Interfața aplicației

Figura 3.1 Logo-ul aplicației Qpython3

După instalarea programului Qpython, îl deschidem în mod obișnuit prin atingerea pictogramei din meniu. Captură de ecran din partea de sus a acestui post arată ce ar trebui să vedeți când Qpython tocmai a început.

Figura 3.2 Ecranul principal al aplicației

Instrumentele disponibile aici:

Console – o consolă obișnuită Python, comunică direct cu interpretul;

Editor – Qpython are un editor de text, unde se poate scrie codul și se poate rula fără a părăsi aplicația;

Programs – aici putem găsi sprit-urile și proiectele;

Community – conduce la pagina qpython.org. Aici, putem să ne alăturăm, să întrebați și să răspundeți la întrebări din comunitatea Qpython.

3.1.2 Consola și editorul

Figura 3.3 Consola aplicației

Ținând apasăsat lung pe consola sau editorul, avem posibilitatea de a crea comanda rapidă pe ecranul principal al telefonului mobil, care ne permite să intrăm direct în consola sau editor.

După cum am mai spus, există o consolă obișnuită Python. Mulți oameni folosesc de obicei pentru a explora proprietățile obiectelor, pentru a consulta sintaxa și pentru a-și testa ideile. Puteți introduce comenzile direct și interpretul Python le va executa. Puteți deschide console suplimentare prin atingerea butonului plus (1) și a unei coliziuni în colțul din stânga sus pentru a comuta între console (2).

Figura3.4 Editorul aplicației

Editorul ne permite să introducem și să modificam textul. Aici putem să dezvoltăm scripturile, să le salvăm și să le executăm. Editorul acceptă sintaxa Python care evidențiază și afișează numerul de liniilor de cod.

În momentul în care tastăm, se poate controla cu ușurință nivelul de indentare (care este esențial pentru codul Python) utilizând două butoane din bara de instrumente (1). Următoarele butoane din bara de instrumente sunt Salvare și salvare ca (3), butonul pentru a ne deplasa la o anumită linie cerută de utilizator(2), apoi pe butoanele Executare (4), Anulare, Căutare, Fișiere recente și Setări(5). Există, de asemenea, două butoane deasupra: Deschidere și Nou (6).

Pentru a salva un fișier, nu trebuie sa uităm să adăugăm extensia .py la numele fișierului, deoarece editorul nu o face automat.

3.1.3 Programele

Programs conține script-urile și proiectele create. Ținînd apăsat lung pe script sau pe proiect, putem să crea comanda rapidă pentru script sau proiect. Odată ce am creat comenzile rapide pe ecranul telefonului,având posibilitatea de a rula direct script-ul sau proiectul de pe ecranul principal.

Script – este unic

Acestea se află în directorul /storage/emulated/0/qpypthon/scripts3, iar când apasăm pe script, putem alege următoarele acțiuni:

Run: rulați script-ul;

Open: Editați script-ul cu editorul încorporat;

Delete: Ștergeți script-ul.

Program – are nevoie de un director care ar trebui să conțină main.py ca script de lansare implicit al proiectului și resurse în același director, dacă dorim ca proiectul să fie găsit în Programs, iar când apasăm pe script, putem alege următoarele acțiuni:

Run: rulați script-ul;

Open: Editați script-ul cu editorul încorporat;

Delete: Ștergeți script-ul.

3.1.4 Comunitate

Se va redirecționa către qpython.org, inclusiv o sursă a acestei documentații, și există o legătură între comunitățile de utilizatori qpython, multe întrebări legate de utilizarea sau programarea qpython ar putea fi solicitate în comunitate.

Am realizat un exemplu simplu, am intrat în aplicația Qpython3, am deschis editorul și am introdus următorul cod:

import android

droid = android.Android ()

droid.makeToast ("Bună ziua!")

Când este executat, acesta afișează doar un mesajul "Bună ziua!" brusc pe ecran .[10]

Figura4.5 Rularea programului

Trimiterea unei imagini prin Gmail

Simple Mail Transfer Protocol (SMTP) este un protocol care gestionează trimiterea de e-mail și rutarea e-mail-urilor între serverele de poștă electronică. Utilizarea efectivă variază în funcție de complexitatea adresei de e-mail și a setărilor serverului de e-mail, iar instrucțiunile de aici se bazează pe trimiterea de e-mail prin Gmail.

Primul pas este crearea unui obiect SMTP, fiecare obiect folosit pentru conectarea cu un singur server. Primul argument este numele de gazdă al serverului, al doilea este portul. Portul utilizat variază în funcție de server, urmând să facem câțiva pași pentru a configura conexiunea corespunzătoare pentru trimiterea de e-mailuri.

Funcția starttls () pornește nivelul de securitate de transport, care este solicitat de Gmail. Este posibil ca alte sisteme de poștă electronică să nu utilizeze acest lucru sau să nu fie disponibile.

Începem prin importarea doar a claselor de care avem nevoie, acest lucru ne ajută și de faptul că trebuie să folosim ulterior numele complet al modulului. Biblioteca pe care o vom folosi pentru această sarcină este smtplib,facând mesajele și în plus, vom folosi biblioteca de e-mail, care conține o serie de funcții de ajutor care ne permit să construim mesajul nostru în forma corectă.

Biblioteca mimetypes servește la codificarea mesajului nostru și furnizează numit MIMEMultipart, care ne permite să definim diferitele părți ale unui mesaj de poștă electronică.

parte din biblioteca standard Python. Cu ajutorul serviciului SMTP Gmail vom putea trimite

3.2.1 Elemente de bază-email

Pentru a utiliza serviciul email în scopul de a trimite și primi mesaje, trebuie să accesăm un cont pe un server de e-mail cu un nume de utilizator și o parolă, în cazul de față vom folosi un cont de Gmail.

Pentru a utiliza funcționalitatea în Python pentru a trimite e-mailuri, trebuie să încărăm biblioteca stmplib:

import smtplib

Următorul pas este să realizăm un obiect care se asociază cu serverul. Vom folosi serverul Gmail, dar putem lucra cu orice serviciu de e-mail. Creați un obiect SMTP care are numele adresei URL smtp (unde puteți trimite mesaje) și numărul portului:

smtpObj = smtplib.SMTP('smtp.gmail.com', 587)

smtpObj.starttls()#crearea conexiunii cu serviciul Gmail

Conectarea contului de Gmail și parola:

EMAIL = "Adresa contului de Gmail expeditor"

PASSWORD = "Parola"

smtpObj.login(EMAIL, PASSWORD)

Pentru trimiterea unui mesaj prin intermediul Gmail avem nevoie de urmatoarele:

RECIPIENT = "Adresa contului de Gmail destinație"

SUBJECT = "Subiect"

BODY = "Mesajul"

MESSAGE = "Subject: " + SUBJECT + "\n" + BODY

smtpObj.sendmail(EMAIL, RECIPIENT, MESSAGE)

Ultimul lucru ce trebuie făcut, ceea ce înseamnă că ați terminat să trimiteți e-mailuri, este următorul:

smtpObj.quit()

3.2.2 Atașarea unei imagini

Pentru a indeplini acest obiectiv avem nevoie de urmatoarele module:

import smtplib

from email.mime.text import MIMEText

from email.mime.image import MIMEImage

from email.mime.multipart import MIMEMultipart

Informațiile necesare pentru a trimite imaginea, FILENAME reprezintă calea unde se află fișierul pe care dorim să îl trimitem:

EMAIL = "Adresa contului de Gmail expeditor"

PASSWORD = "Parola"

RECIPIENT = "Adresa contului de Gmail destinație"

FILENAME = "/storage/emulated/0/DCIM/Camera/numele_imaginii.jpg"

Obținerea datelor despre o imagine:

with open(FILENAME, 'rb') as f:

img = f.read()

Crearea unui e-mail utilizând MIMEMultipart:

msg = MIMEMultipart()

msg['Subject'] = "Subiect"

msg['From'] = EMAIL

msg['To'] = RECIPIENT

Adăugarea mesajului și a imaginii:

body = MIMEText('Mesajul')

msg.attach(body)

mime_image = MIMEImage(img, name=os.path.basename(FILENAME)) msg.attach(mime_image)

Ultima etapă o reprezintă elementele de bază prezentate anterior,și anume[11]:

smtpObj = smtplib.SMTP('smtp.gmail.com', 587)

smtpObj.starttls()

smtpObj.login(EMAIL, PASSWORD)

smtpObj.sendmail(EMAIL, RECIPIENT, msg.as_string())

smtpObj.quit()

Realizarea bazei de date:

O bază de date este o colecție organizată de date. O bază de date relațională, mai restrictivă, este o colecție de scheme, tabele, interogări, rapoarte, vizualizări și alte elemente. Designerii de baze de date organizează, de regulă, datele pentru a modela aspecte ale realității într-un mod care să susțină procese care necesită informații.

Datele sunt fie în memorie, fie în fișiere sau în baze de date. Python-ul are legături pentru multe sisteme de baze de date, inclusiv MySQL, Postregsql, Oracle, Microsoft SQL Server și Maria DB.

Unul dintre aceste sisteme de gestionare a bazelor de date (DBMS) se numește SQLite. SQLite a fost creat în anul 2000 și este unul dintre sistemele de management din domeniul bazelor de date.

SQL este un limbaj de programare special conceput pentru gestionarea datelor deținute într-o bază de date.

Figura4.6 Python vs. sistemul de baze de date

Datele sunt preluate dintr-un sistem de baze de date utilizând limbajul SQL.

SQLite este cel mai răspândit motor de baze de date SQL din lume. Codul sursă pentru SQLite este în domeniul public. Acesta este un motor de baze de date SQL autonom, fără server,fără configurație(configurație zero)și tranzacțonal.

Figura 4.7 SQLite, un sistem de management al bazelor de date relaționale

3.3.1ORM cu SqlAlchemy

SQLAlchemy este setul de instrumente pentru Python SQL și Object Relational Mapper, care oferă dezvoltatorilor de aplicații puterea completă și flexibilitatea SQL.

Acesta oferă o serie completă de modele bine cunoscute de persistență la nivel de întreprindere, proiectate pentru accesul la baze de date eficiente și performante, adaptate într-un limbaj simplu pe baza Python-ului.

SQLAlchemy consideră că baza de date este un motor de algebră relațională, nu doar o colecție de tabele. Rândurile pot fi selectate nu numai din tabele, ci și din alte legături selectate; oricare dintre aceste unități poate fi compusă într-o structură mai mare. ORM (Object Relational Mapper) este independent de sistemul de baze de date relaționale utilizat[12].

Figura 4.8 Comunicarea cu baza de date utilizând ORM și folosind numai obiectele și clasele Python.

Crearea unei clase pentru a popula ORM

Pentru crearea unei clase în scopul populării ORM, am realizat fișierele createORMPersoane.py și createORMNrInmatriculare.py.

Cele două fișiere vor defini clasa NumereInmatriculare și clasa Persoane.

Figura 4.9 Definirea clasei Figura4.10 Definirea clasei

NumereInmatriculare Persoane

Figura 4.11 Tabelele createORMNrInmatriculare.py vs. createORMPersoane.py

Figura 4.12 Clasa Python:crearea obiectelor

Clasele sunt folosite pentru a crea obiecte care au funcții și variabile.Putem crea obiecte virtuale în Python. Un obiect virtual poate conține variabile și metode. Un program poate avea mai multe tipuri diferite și este creat dintr-o clasă. Metoda __init __ () este numită constructor și este apelată întotdeauna când se creează un obiect. Variabilele deținute de clasă pentru createORMNrInmatriculare.py sunt ,,NrInmatriculare”, ,,Nume”, ,,Prenume”, ,,Marca”, ,,Culoare”, ,,AnFabricatie” și pentru createORMPersoane.py sunt ,,Nume”, ,,Prenume”, ,,Varsta”, ,,Permis”, ,,Cazier”. Aceste variabile sunt uneori numite atribute de clasă.

Introducerea datelor în baza de date

Tabela de baze de date este încă goală. Introducem datele în baza de date utilizând obiecte Python. Pentru că folosim ORM SqlAlchemy nu trebuie să scriem o singură interogare SQL. Aici, am creat obiectele Python pe care le populăm în ORM, iar codul l-am salvat sub numele addDataNrInmatriculare și addDataPersoane.

Figura 4.13 Popularea bazei de date

ORM va reprezenta obiectele Python într-o bază de date relațională. Aceasta înseamnă că nu avem nicio interacțiune directă din aplicație, în acea aplicație se interacționați cu obiectele. În cazul în care deschidem o bază de date cu SQLiteman sau o bază de date SQLite, găsim tabela a fost creată:

FIGURA

Solicitarea datelelor

Putem interoga toate elementele tabelului folosind codul de mai jos Fig.4.15, iar pentru a selecta un singur obiect, utilizați metoda filter (). Python-ul va vedea fiecare înregistrare ca un obiect unic așa cum este definit de clasa NumereInmatriculare și clasa Persoane, iar codul a fost salvat sub numele RulareExemplu.

Figura4.15 Interogarea bazei de date

Bibliografie:

[1] https://opentechschool

[2] https://www.tutorialspoint.com/python3/python_overview.htm

[3] Learning Python by Mark Lutz, O'Reilly Media, 5th Edition

[4] https://www2.rivier.edu

[5] Receiving Email with Internet Message Access Protocol (IMAP4) ,Conrad Chung, 2BrightSparks

[6] Opencv 2.0 c reference. on-line (2009)

[7] Bradski, G., Kaehler, A.: Learning OpenCV. OReilly Media, Inc (2008)

8 Canny, J.: A computational approach to edge detection. IEEE Transactions on Pattern Analysis and Machine Intelligence 8, 679–714 (1986)

[8] https://www.tutorialspoint.com/sqlite/

[9]Owens, M. The Definitive Guide to SQLite . Preluat de pe http://www.campusnewsjbp.com/campus_news/placement_papers/Sqlite.pdf

[10] http://www.qpython.org

[11] http://www.public.asu.edu

[12] https://pythonspot.com

Anexa1

Program pentru expedierea unui atașament cu ajutotul aplicației QPython3 pe contul de Gmail:

import smtplib

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

from email.mime.base import MIMEBase

from email import encoders

user='mircescu.diana17@gmail.com'

send='mircescu.diana17@gmail.com'

subject='Python'

msg=MIMEMultipart ()

msg ['From']=user

msg ['To']=send

msg ['Subject']=subject

body='Buna ziua'

msg.attach (MIMEText (body,'plain'))

filename='/storage/emulated/0/DCIM/Camera/image1.jpg'

attachment=open(filename,'rb')

part=MIMEBase ('application','octet-stream')

part.set_payload((attachment).read ())

encoders.encode_base64 (part)

part.add_header ('Content-Disposition', "attachment;

filename="+filename)

msg.attach (part)

text=msg.as_string ()

server=smtplib.SMTP ('smtp.gmail.com',587)

server.starttls ()

server.login (user,'*********')

server.sendmail (user,send,text)

server.quit ()

Similar Posts