huawei network ekipmanlarında arşivlenmiş log dosyası
huawei network ekipmanlarında loglar yapılan konfigürasyon ayarlarına göre belirli bir tarihten veya log sayısından fazlası router üzerindeki hafıza ortamlarında tutulabilmektedir. nms üzerinde geçmişe ait log kaydı tutmuyorsanız ve/veya router üzerinde log analizi yapmak isterseniz işinize yarayacaktır.kısaca gerekli incelemelerin nasıl yapılacağına bakalım.
“display logfile-path” komutu ile log dosyalarının nerede tutulduğunu öğrenebiliriz.
<fcicek_huawei_test_router>display logfile-path
Info: Current log file path is "cfcard2:/log".
dosya konumu ögrenildikten sonra ilgili alan / dizine geçiş için cd komutunu kullanıyoruz.
<fcicek_huawei_test_router>cd cfcard2:/log
dizin içinde dosları inceleyelim.
<fcicek_huawei_test_router>dir
Directory of cfcard2:/log/
Idx Attr Size(Byte) Date Time FileName
0 -rw- 1,114,505 Apr 21 2016 08:58:50 log.log
1 -rw- 645,924 Apr 21 2016 08:58:50 log.dblg
2 -rw- 262,144 Aug 02 2013 00:49:44 logfilebuf.dat
3 -rw- 1,508 May 30 2014 07:29:40 scene.dblg.zip
4 -rw- 1,094,989 Feb 06 2016 01:11:28 2016-02-06.01-11-08.dblg.zip
5 -rw- 626,757 Feb 12 2016 14:29:06 2016-02-12.14-28-51.log.zip
6 -rw- 999,237 Mar 11 2016 01:11:18 2016-03-11.01-11-00.dblg.zip
7 -rw- 967,042 Feb 17 2016 06:29:10 2016-02-17.06-28-51.dblg.zip
8 -rw- 978,353 Feb 28 2016 04:29:10 2016-02-28.04-28-51.dblg.zip
9 -rw- 685,204 Mar 04 2016 12:59:08 2016-03-04.12-58-51.log.zip
10 -rw- 991,856 Mar 22 2016 01:11:30 2016-03-22.01-11-09.dblg.zip
11 -rw- 8,412,776 Apr 21 2016 08:51:28 2016-04-21.05-01-15-dst.35.logtmp
12 -rw- 960,961 Apr 02 2016 01:29:12 2016-04-02.01-28-51-dst.dblg.zip
13 -rw- 978,646 Apr 14 2016 01:11:20 2016-04-14.01-10-59-dst.dblg.zip
14 -rw- 1,097,927 Apr 21 2016 04:58:20 2016-04-21.04-57-57-dst.dblg.zip
15 -rw- 637,749 Apr 21 2016 05:01:30 2016-04-21.05-01-15-dst.log.zip
16 -rw- 8,393,002 Apr 21 2016 09:07:40 2015-11-05.19-58-51.34.logtmp
17 -rw- 1,138,966 Feb 28 2014 18:11:54 2014-02-28.18-11-31.dblg.zip
18 -rw- 449,312 Mar 01 2014 08:52:08 2014-03-01.08-51-55.log.zip
19 -rw- 1,040,497 Mar 13 2014 08:23:24 2014-03-13.08-23-03.dblg.zip
20 -rw- 1,068,521 Mar 25 2014 18:11:50 2014-03-25.18-11-30.dblg.zip
1,999,616 KB total (1,874,240 KB free)
geçmişe dönük arşivlenmiş logları görmek için “display logfile” komutu kullanılacaktır. yalnız burada dikkat edilmesi gereken noktada dosyanın tam yolunu yazmak gerektiği. bu farklı yazılımlarda değişebilir.
<fcicek_huawei_test_router>display logfile cfcard2:/log/2016-02-12.14-28-51.log.zip
Info: It may take several seconds, please wait ...
100% complete
################################################################
# This logfile is generated at slot 9
################################################################
################################################################
#Automatic record log end,current health information as follows:
Slot CPU Usage Memory Usage (Used/Total)
---------------------------------------------------------------
9 MPU(System Master) 9% 31% 571MB/1806MB
1 LPU 18% 46% 384MB/825MB
2 LPU 18% 45% 378MB/825MB
3 LPU 19% 46% 386MB/825MB
10 MPU 5% 26% 473MB/1806MB
#DateTime Stamp: 2016-01-26 16:58:51.980
################################################################
Jan 26 2016 17:00:14+02:00 fcicek_huawei_test_router LSPM/1/LDPVTUNNEL_DOWN:OID 1.3.6.1.4.1.2011.5.25.182.1.54.2 LDP virtual tunnel went Down. (VirtualTunnelIndex=3567058411)
Jan 26 2016 17:00:14+02:00 fcicek_huawei_test_router LSPM/1/LDPVTUNNEL_DOWN:OID 1.3.6.1.4.1.2011.5.25.182.1.54.2 LDP virtual tunnel went Down. (VirtualTunnelIndex=3567058317)
sqlite veritabanına verilerin kaydedilmesi ve flask frameworkunda bu verilerin mathplotlib ile grafiklerinin çizim örneği
öncelikle proje klasörümü ve kullanacağımız virtualenv yi oluşturulalım
fcicek@ferhatcicek:~$ mkdir system_usage
fcicek@ferhatcicek:~$ mkdir system_usage
fcicek@ferhatcicek:~$ cd system_usage/
fcicek@ferhatcicek:~/system_usage$ python -m venv env
projemizde sistem verilerini saklamak iin sqlite veritabanını kullancağız. kullanacağımız system_usage veritababı oluşturalım
fcicek@ferhatcicek:~/system_usage$ sqlite3 system_usage.db
sqlite> .quit
veritabanı dosyamızı oluşturduktan sonra sıra tablomuzu oluşturmaya geldi. bunu sql ortamında yapabiliriz ancak bu örnekte python ile oluşturacağız..
fcicek@ferhatcicek:~/system_usage$ nano sqlite_db_create.py
aynı isimli tablo varsa sileceğiz ve veri tabanımızla aynı isimli bir tablo oluşturacağız. örneğimizi basit tutmak adına anlık cpu ve hafıza verilerini tablomuzda tutacağımız için tablomuzda bu veriler için gerekli alanları oluşturacağız…
import sqlite3 as lite
import sys
con = lite.connect('system_usage.db')
with con:
cur = con.cursor()
cur.execute("DROP TABLE IF EXISTS system_usage")
cur.execute("CREATE TABLE system_usage(timestamp DATETIME, cpu NUMERIC, mem NUMERIC)")
kodumuz yazık şimdi virtualenv i aktif ederek kodumu çalıştıralım…
fcicek@ferhatcicek:~/system_usage$ source env/bin/activate
(env) fcicek@ferhatcicek:~/system_usage$ python sqlite_db_create.py
python kodumuz sonucu kontrol etmek istersek. clidan veritabanına bakıp tablonun durumunu inceleyebiliriz.
(env) fcicek@ferhatcicek:~/system_usage$ sqlite3 system_usage.db
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> .table
system_usage
sqlite> .quit
örneğimizde cpu ve hafıza verilerini saklayacağız. bunun için pythonde psutil paketini kullanacağız. psutil paketini yükleyelim
(env) fcicek@ferhatcicek:~/system_usage$ pip install psutil
psutil paketini daha önce kullanmamış olabilirsiniz.. programımızda kullanacağımız verileri içerecek basit bir uygulama yapalım.
import psutil
print('MEM % used:', psutil.virtual_memory()[2])
print('CPU % used:', psutil.cpu_percent(2))
programi çalıştıralım.
(env) fcicek@ferhatcicek:~/system_usage$ python psutil_system.py
MEM % used: 86.5
CPU % used: 2.0
anlık olarak cpu ve hazfıza kullanım bilgileriniz artık alabiliyoruz. bu bilgilerini şimdi de veritabanımıza ekleyelim.
bunun için program tarafımızdan sonlandırılana kadar 60 saniyede bir cpu ve hazfıza kullanım değerini okuyarak sqlite veritabanına ekleyecek basit bir kod yazalım.
(env) fcicek@ferhatcicek:~/system_usage$ nano data_logger.py
import time
import sqlite3
import psutil
dbname='system_usage.db'
ornekleme_zamani = 60
def sistem_bilgisi_oku():
mem = psutil.virtual_memory()[2]
cpu = psutil.cpu_percent(1)
if mem is not None and cpu is not None:
return cpu,mem
def veritabani_ekle (cpu, mem):
conn=sqlite3.connect(dbname)
curs=conn.cursor()
curs.execute("INSERT INTO system_usage values(datetime('now'), (?), (?))", (cpu, mem))
conn.commit()
conn.close()
def main():
while True:
cpu, mem = sistem_bilgisi_oku()
veritabani_ekle (cpu, mem)
time.sleep(ornekleme_zamani)
main()
artık verilerimizi bir veri tabanında turuyoruz. şimdi bunu web üzerinden bağlantı yapacak kullanıcılar için görselleştirelim. bunun için flask frameworkunu kullancağız. virtualenv altına flask ve ilişkili paketleri yükleyelim.
(env) fcicek@ferhatcicek:~/system_usage$ pip install flask
kullanıcı browser kullanarak sayfamıza bağlandığında, veritabanındaki en son cpu ve hafıza kullanım verisini sorgulayarak bu veriyi ekrana yazdıralım.
(env) fcicek@ferhatcicek:~/system_usage$ nano son_olcum.py
from flask import Flask, render_template, request
app = Flask(__name__)
import sqlite3
def getData():
conn=sqlite3.connect('system_usage.db')
curs=conn.cursor()
for row in curs.execute("SELECT * FROM system_usage ORDER BY timestamp DESC LIMIT 1"):
time = str(row[0])
cpu = row[1]
mem = row[2]
print(str(cpu))
print((str(mem))
conn.close()
return time, cpu, mem
@app.route("/")
def index():
time, cpu, mem = getData()
templateData = {
'time': time,
'cpu': cpu,
'mem': mem
}
return render_template('son_olcum.html', **templateData)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000, debug=True)
flask frameworkun tema yapısını kullanacağımız için templates dizinini oluşturup içinde gerekli dosyaları oluşturmamız gerekmektedir. python dosyamızda ilişkilendirilen tema dosyası son_olcum.html veiçerisinde kullanılacak verinin templateData olarak belirtildi.
(env) fcicek@ferhatcicek:~/system_usage$ mkdir templates
(env) fcicek@ferhatcicek:~/system_usage$ cd templates
(env) fcicek@ferhatcicek:~/system_usage/templates$ nano son_olcum.html
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>System Durum</title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</head>
<body>
<div class="container-fluid">
<div class="jumbotron">
<p class="lead">Son veri okuma : {{ time }} <a href="/"class="button">Güncelle</a></p>
<hr class="my-4">
<p class="lead">CPU Kullanım Oranı % : {{ cpu }}</p>
<p class="lead">Memory Kullanım Oranı % : {{ mem }} </p>
<hr class="my-4">
</div>
</div>
</body>
</html>
şimdi kodumuzu test edelim.
(env) fcicek@ferhatcicek:~/system_usage$ nano son_olcum.py
tarayıcımız ile http://sunucuip:5000 adresine bağlandığımız aşagıdaline benzer bir ekran ile karşılaşmamız gerekecek…

kodumuz biraz daha geliştirmenin zamanı geldi. cpu ve hafıza verilerini veritabanımızda tuttugumuz için bu veriyi bir grafik olarka ekrana yansıtabiliriz. bu işlem sırasında mathplotlib paketinde faydalanacağımız için öncelikle kurulumunu yapalım.
(env) fcicek@ferhatcicek:~/system_usage$ pip install matplotlib
şimdi kodumuza yapacağımız ilave , belirtilen örnekleme sayısınca veri tabanından veri çekip bunu grafiği oluşturup son kullanıcıya ileteceğiz. cpu ve hafiza grafiklerini çizdirmek için app.route metodundan faydalanacağız.
from flask.globals import session
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
import io
from flask import Flask, render_template, send_file, make_response, request
app = Flask(__name__)
import sqlite3
def sonKayit():
conn=sqlite3.connect('system_usage.db')
curs=conn.cursor()
for row in curs.execute("SELECT * FROM system_usage ORDER BY timestamp DESC LIMIT 1"):
time = str(row[0])
cpu = row[1]
mem = row[2]
conn.close()
return time, cpu, mem
def sonKayitDizi (orneklemeSayisi):
conn=sqlite3.connect('system_usage.db')
curs=conn.cursor()
curs.execute("SELECT * FROM system_usage ORDER BY timestamp DESC LIMIT "+str(orneklemeSayisi))
data = curs.fetchall()
tarihDizi = []
cpuDizi = []
hafizaDizi = []
for row in reversed(data):
tarihDizi.append(row[0])
cpuDizi.append(row[1])
hafizaDizi.append(row[2])
conn.close()
return tarihDizi, cpuDizi, hafizaDizi
def maksimumKayit():
conn=sqlite3.connect('system_usage.db')
curs=conn.cursor()
for row in curs.execute("select COUNT(cpu) from system_usage"):
maksimumKayitDizi=row[0]
conn.close()
return maksimumKayitDizi
global orneklemeSayisi
orneklemeSayisi = maksimumKayit()
if (orneklemeSayisi > 101):
orneklemeSayisi = 100
@app.route("/")
def index():
time, cpu, mem = sonKayit()
templateData = {'time':time,'cpu':cpu,'mem':mem,'orneklemeSayisi':orneklemeSayisi}
return render_template('index.html', **templateData)
@app.route('/', methods=['POST'])
def post_form():
global orneklemeSayisi
orneklemeSayisi = int (request.form['orneklemeSayisi'])
numMaxSamples = maksimumKayit()
if (orneklemeSayisi > numMaxSamples):
orneklemeSayisi = (numMaxSamples-1)
time, cpu, mem = sonKayit()
templateData = {'time':time,'cpu':cpu,'mem':mem,'orneklemeSayisi':orneklemeSayisi}
return render_template('index.html', **templateData)
@app.route('/plot/cpu')
def cpu_cizim():
times, cpuDizi, hafizaDizi = sonKayitDizi(orneklemeSayisi)
ys = cpuDizi
fig = Figure()
axis = fig.add_subplot(1, 1, 1)
axis.set_title("CPU [%]")
axis.set_xlabel("Örnekleme")
axis.grid(True)
xs = range(orneklemeSayisi)
axis.plot(xs, ys)
canvas = FigureCanvas(fig)
output = io.BytesIO()
canvas.print_png(output)
response = make_response(output.getvalue())
response.mimetype = 'image/png'
return response
@app.route('/plot/mem')
def hafiza_cizim():
times, cpuDizi, hafizaDizi = sonKayitDizi(orneklemeSayisi)
ys = hafizaDizi
fig = Figure()
axis = fig.add_subplot(1, 1, 1)
axis.set_title("MEM [%]")
axis.set_xlabel("Örnekleme")
axis.grid(True)
xs = range(orneklemeSayisi)
axis.plot(xs, ys)
canvas = FigureCanvas(fig)
output = io.BytesIO()
canvas.print_png(output)
response = make_response(output.getvalue())
response.mimetype = 'image/png'
return response
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000, debug=True)
<!-- index.html -->
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>System Durum</title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</head>
<body>
<div class="container-fluid" align=center>
<div class="jumbotron">
<p class="lead"><a href="/"class="button">Güncelle</a></p>
<hr class="my-4">
<p class="lead">Son veri okuma : {{ time }} </p>
<hr class="my-4">
<p class="lead">CPU Kullanım Oranı % :<b> {{ cpu }} </b></p>
<p class="lead">Memory Kullanım Oranı %<b> : {{ mem }} </b></p>
<hr class="my-4">
</div>
</div>
<div class="container-fluid" align=center>
<form method="POST">
<input name="numSamples" value= {{orneklemeSayisi}}>
<input type="submit">
</form></p>
<hr>
<img src="/plot/cpu" width="80%" height=400>
<img src="/plot/mem" width="80%" height=400>
</div>
</body>
</html>
kodumuzu aşagıdaki şekilde günceller ve çalıştırırsak aşagıdaki gibi ekran görüntüsüne sahip olacağız

python projelerinde gerekli modül / paketler
python projelerinde, projenin sorunsuz olarak çalışması için ihtiyaç duyulan paketler ana dizinde genel olarak requirements.txt dosyası içinde belirtilir.
dosya içerinde her satırda ihtiyaç duyulan modül adı ve sürüm numarası yer almaktadır.
Jinja2==3.0.1
requests==2.25.1
paketlerin sürümlerinde farklılık olabiliceği için yeni ve eski sürümlerde uygulama düzgün şekilde çalışmayabilir… bunun için paket sürüm ihtiyaçlarını belirtmek için ==, >=, <= operaatörleri kullanılabilir.
geliştirme ortamınızda en doğru paket ve versiyonlarını dosyaya aktarmak için pip paket yöneticisini kullanıyorsak
pip freeze > requirements.txt
komutu kullanılabilir. temin edilmiş herhangi bir projedeki en uygun paket kurmak içinde
pip install -r requirements.txt
kullanablirsiniz.
huawei network ekipmanlarında qos-profile uygulanmış interface listesi
huawei network ekipmanlarında qos-profile yapısını kullanıyorsanız tanımlı bir profile in hangi interfacelerde tanımlı olduğunu öğrenmek isterseniz aşagıdaki örnekteki komut yapısını kullanabilirsiniz.
[testrouter_fc]display qos-profile application qos-inbound-profile
qos-profile qos-inbound-profile:
GigabitEthernet1/1/3.221
GigabitEthernet1/1/3.222
GigabitEthernet1/1/3.223
GigabitEthernet1/1/3.224
GigabitEthernet1/1/3.225
Reference number by access user: [inbound] 0, [outbound] 0
filebrowser
browsespy yazısı sonrası daha güzel kullanışlı bir dosya yöneticisi önerisi istenler oldu. daha gelişmiş bir dısya yönetici için go tabalı filebrowser incelenebilir. kurulum için
curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh | bash
ve çalıştırmak için
filebrowser -a 0.0.0.0 -p 8080 -r $HOME
yeterli olacaktır.
proje sitesi : filebrowser.org
huawei network ekipmanlarında qinq yapılandırılmış sub-interface
huawei routerların sub interface mantığından dolayı interface altında yapılmış sub interfacelerdeki kullanılan pe-vid ce-vid değerlerini öğrenmenin ne yazakkı basit ve güzel bir yöntemi yok… yaa mevcut konfiürasyona bakacaksınız yada “display qinq information termination” komutunu kullanacaksınız. bu komutun örnek çıktısı aşagıdaki yer almaktadır. .
<test_router>display qinq information termination
Eth-Trunk1.62
L3VPN bound
Total QinQ Num: 1
qinq termination pe-vid 102 ce-vid 62 vlan-group 1
Total vlan-group Num: 1
vlan-group 1
control-vid 62 qinq-termination
Eth-Trunk1.113
VLL/PWE3 bound
Total QinQ Num: 1
qinq termination pe-vid 102 ce-vid 113 vlan-group 1
Total vlan-group Num: 1
vlan-group 1
control-vid 113 qinq-termination
Eth-Trunk5.56
Total QinQ Num: 1
qinq termination pe-vid 42 ce-vid 56 vlan-group 1
Total vlan-group Num: 1
vlan-group 1
control-vid 56 qinq-termination
Eth-Trunk5.69
VLL/PWE3 bound
Total QinQ Num: 1
qinq termination pe-vid 62 ce-vid 69 vlan-group 1
Total vlan-group Num: 1
vlan-group 1
control-vid 69 qinq-termination
python da flask-mail kullanarak eposta gönderimi
Flask-Mail kütüphanesini kullanarak python da basit bir eposta gönderme uygulaması yapalım. öncelikle
pip install Flask-Mail
ile flask-mail kurulumu yapalım… flask-mail da SMTP konfigürasyonu için kullanılabilecek parametreler aşagıdaki gibi tanımlanmış.
MAIL_SERVER : varsayılan ‘localhost’
MAIL_PORT : varsayılan 25
MAIL_USE_TLS : varsayılan False
MAIL_USE_SSL : varsayılan False
MAIL_DEBUG : varsayılan app.debug
MAIL_USERNAME : varsayılan None
MAIL_PASSWORD : varsayılan None
MAIL_DEFAULT_SENDER : varsayılan None
MAIL_MAX_EMAILS : varsayılan None
MAIL_SUPPRESS_SEND : varsayılan app.testing
MAIL_ASCII_ATTACHMENTS : varsayılan False
programda ihtiyaçımız sırasında gerekli güncellemeleri yapacağız. mail gönderimi sırasında ise
flask_mail.Message(subject='', recipients=None, body=None, html=None, sender=None, cc=None, bcc=None, attachments=None, reply_to=None, date=None, charset=None, extra_headers=None, mail_options=None, rcpt_options=None)
uygun şekilde yapılandırmak gerekecek.
subject – email subject header
recipients – list of email addresses
body – plain text message
html – HTML message
sender – email sender address, or MAIL_DEFAULT_SENDER by default
cc – CC list
bcc – BCC list
attachments – list of Attachment instances
reply_to – reply-to address
date – send date
charset – message character set
extra_headers – A dictionary of additional headers for the message
mail_options – A list of ESMTP options to be used in MAIL FROM command
rcpt_options – A list of ESMTP options to be used in RCPT commands
simdi bu bilgileri kullanarak basit kodumuzu yazalım.. gerekli kütüphaneleri import ederim
from flask import Flask
from flask_mail import Mail, Message
app = Flask(__name__)
mail= Mail(app)
smtp konfigürasyonumuzu yapalım.. ben aylık 500 kadar bedava eposta gönderilimize izin veren mailtrap servisini için konfigürasyon yapacağım..
app.config['MAIL_SERVER']='smtp.mailtrap.io'
app.config['MAIL_PORT'] = 2525
app.config['MAIL_USERNAME'] = '81e0d22cd4b15'
app.config['MAIL_PASSWORD'] = '94355a1553f58'
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USE_SSL'] = False
mail= Mail(app)
eposta içeriğini, gönderici ve alıcıda tanımlayalım
msg = Message('Test Mesajı', sender = 'ferhatcicek@mailtrap.io', recipients = ['iletisim@ferhatcicek.com'])
msg.body = "Bu bir test mesajıdır"
mail.send(msg)
return "Eposta gönderildi."
artık kodumuz hazır durumda…
#app.py - flask-mail kullanarak eposta gönderimi
from flask import Flask
from flask_mail import Mail, Message
app = Flask(__name__)
mail= Mail(app)
app.config['MAIL_SERVER']='smtp.mailtrap.io'
app.config['MAIL_PORT'] = 2525
app.config['MAIL_USERNAME'] = '81e0d22cd4b15b'
app.config['MAIL_PASSWORD'] = '94355a1553f58b'
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USE_SSL'] = False
mail= Mail(app)
@app.route("/")
def index():
try:
msg = Message('Test Mesajı', sender = 'ferhatcicek@mailtrap.io', recipients = ['iletisim@ferhatcicek.com'])
msg.body = "Bu bir test mesajıdır"
mail.send(msg)
return "Eposta gönderildi."
except Exception as e:
return(str(e))
if __name__ == '__main__':
app.run(debug = True)
flask run -h 0.0.0.0 -p 8080 yazarak kodumu çalışrarak tarayıcımıza http://localhost:8080 yazdığımızda epostamızın iletildiğine ait bilgilendirme mesajını alacağız… mesaj gönderme kısmını bir döngü içine alarak toplu eposta gönderimide yapabilirsiniz…