ელ-ფოსტის გაგზავნა ORACLE-დან
ამ ბლოგში მე ავხსნი თუ როგორ ხდება მარტივი წერილის გაგზავნა ORACLE-დან. მისი საჭიროება მას შემდეგ გამიხდა როცა მე წავედი დასასვენებლად და სამსახურში თვის დახურვის დროს გასაშვები პროცედურები გადავაბარე თამანშრომელს. მიუხედავად გამართული პროცედურებისა მაინც ხდებოდა გაუთვალისწინებელი შემთხვევები როცა პროცედურა გამართულად ვერ სრულდებოდა. კიდევ იყო და არის შემთხვევა როცა პერიოდული პროცედურის კონტროლი მესაჭიროება შეცდომის მოხდენის ან წარმატებით დასრულებისთანავე. მოვძებნე რამოდენიმე ხერხი. 1 იყო sms გზავნილი ტელეფონზე და მერე გზავნილის მიწოდება ელ-ფოსტაზე. ვინაიდან მე მესაჭიროებოდა sms-ის გაგზავნა მაგთის ნომერზე და ეს სერვისი მათგან ღია არ იყო ამიტომ მივმართე ელ-ფოსტის სერვისს რომელსაც ეხლანდელ შემთხვევაში განვიხილავ. მისი უპირატესობა sms -ისგან არის – დიდი მოცულობის ტექსტისა და წერილზე ფაილის მიმაგრების შესაძლებლობა. ქვემოთ მოვყვები როგორ ხდება მარტივი LOG წერილის გაგზავნა ელ-ფოსტაზე ე.ი პირველ რიგში ვქმნით პროცედურას 4 გადასაცემი პარამეტრით
1 2 3 4 | CREATE OR REPLACE PROCEDURE MAILLOG IS ( from_name VARCHAR2, to_name VARCHAR2, subject VARCHAR2, message VARCHAR2 ) IS RETURN; END MAILLOG; |
მოცემულ მაგალითში ალბათ აშკარად ხვდებით რისთვის უნდა შემდგომში ეს პარამეტრები. აქვე ავღწერ ის ცვლადებს რომლის გამოყენებაც დამჭირდება შემდეგში
1 | v_smtp_server VARCHAR2(500) := 'telecom.ge'; v_smtp_server_port NUMBER := 25; crlf VARCHAR2(2) := CHR(13) || CHR(10); mesg VARCHAR2(32767); conn UTL_SMTP.CONNECTION; |
შემდეგ ვიწყებთ პროცედურის შიგთავსის წერას. პირველ რიგში ვაკეთებთ SMTP კავშირს
1 2 3 4 5 6 7 | --------------------- SMTP კავშირი --------------------- conn:= UTL_SMTP.open_connection( v_smtp_server, v_smtp_server_port ); --------------------- სერვერთან დაკავშირება --------------------- UTL_SMTP.helo( conn, v_smtp_server ); UTL_SMTP.mail( conn, from_name ); UTL_SMTP.rcpt( conn, to_name ); UTL_SMTP.open_data ( conn ); |
ამის შემდეგ ვაწყობთ ტექტს რომელიც უნდა გაიგზავნოს
———————გასაგზავნი წერილის შიგთავსი———————
1 2 | mesg:= 'Date: ' || TO_CHAR( SYSDATE, 'dd Mon yy hh24:mi:ss' ) || crlf || 'From: ' || from_name || crlf || 'Subject: ' || subject || crlf || 'To: ' || to_name || crlf || 'Mime-Version: 1.0' || crlf || 'Content-Type: multipart/mixed; boundary="DMW.Boundary.605592468"' || crlf || '' || crlf || 'This is a Mime message, which your current mail reader may not' || crlf || 'understand. Parts of the message will appear as text. If the remainder' || crlf || 'appears as random characters in the message body, instead of as' || crlf || 'attachments, then you''ll have to extract these parts and decode them' || crlf || 'manually.' || crlf || '' || crlf || '--DMW.Boundary.605592468' || crlf || 'Content-Transfer-Encoding: 7bit' || crlf || '' || crlf || message || crlf ; |
ე.ი. ჩვენ ცვლად mesg -ს მივეცით მნიშვნელობა რომელიც გვჭირდება წერილის ტექსტის ასაწყობად და ამის შემდეგ ვახდენთ ამ ტექსტის გაგზავნას
1 2 | ----------------------ტექსტის გაგაზავნა--------------------- UTL_SMTP.write_data ( conn, mesg ); |
ამის შემდეგ ვახდენთ გახსნილი SMTP კავშირის დახურვას და დასრულებას.
1 2 | ---------------------SMTP კავშირის დახურვა --------------------- UTL_SMTP.close_data( conn ); UTL_SMTP.quit( conn ); |
ე.ი. დავასრულეთ ამ პროცედურის აწყობა რომელმაც საბოლოო სახე მიიღო შემდეგნაირად
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | CREATE OR REPLACE PROCEDURE MAILLOG ( from_name VARCHAR2, to_name VARCHAR2, subject VARCHAR2, message VARCHAR2 ) IS v_smtp_server VARCHAR2(500) := 'telecom.ge'; v_smtp_server_port NUMBER := 25; crlf VARCHAR2(2) := CHR(13) || CHR(10); mesg VARCHAR2(32767); conn UTL_SMTP.CONNECTION; BEGIN ---------------------SMTP კავშირის გახსნა --------------------- conn:= UTL_SMTP.open_connection( v_smtp_server, v_smtp_server_port ); --------------------- UTL_SMTP.helo( conn, v_smtp_server ); UTL_SMTP.mail( conn, from_name ); UTL_SMTP.rcpt( conn, to_name ); UTL_SMTP.open_data ( conn ); --------------------გასაგზავნი ტექსტის აწყობა------------------- mesg:= 'Date: ' || TO_CHAR( SYSDATE, 'dd Mon yy hh24:mi:ss' ) || crlf || 'From: ' || from_name || crlf || 'Subject: ' || subject || crlf || 'To: ' || to_name || crlf || 'Mime-Version: 1.0' || crlf || 'Content-Type: multipart/mixed; boundary="DMW.Boundary.605592468"' || crlf || '' || crlf || 'This is a Mime message, which your current mail reader may not' || crlf || 'understand. Parts of the message will appear as text. If the remainder' || crlf || 'appears as random characters in the message body, instead of as' || crlf || 'attachments, then you''ll have to extract these parts and decode them' || crlf || 'manually.' || crlf || '' || crlf || '--DMW.Boundary.605592468' || crlf || 'Content-Transfer-Encoding: 7bit' || crlf || '' || crlf || message || crlf; -------------------ტექსტის ჩაწერა------------------ UTL_SMTP.write_data ( conn, mesg ); ------------------- MTP კავშირის დახურვა ------------------- UTL_SMTP.close_data( conn ); UTL_SMTP.quit( conn ); END; |
ძალიანაც კარგი. ეხლა როგორ გამოვიყენოთ ეს პროცედურა. რავიცი მაგალითი ბევრი შეიძლება მაგრამ ავიღოთ ერთი, მაგალითად:
გვაქვს რაღაც პროცედურა რომელიც რაღაც პერიოდში სრულდება ავტომატურად, რომელსაც ააქვს მარტივი შინაარსი, მაგალითად გადახდების ცხრილიდან ითვლის გადახდების რაოდენობას, თანხის ჯამს და ბოლო გადახდას და სვამს სადმე მეორე ცხრილში. თუ ჩვენ ამ 3 მნიშვნელობას ავიღებთ 3 სხვადასხვა ცვლადში(მაგ:billCount, BillPrice და lastBill) მაშინ წერილისთვის გვექნება წერილის პროცედურის გამოძახების შემდეგი წესი ავიღოთ ერთი ცვლადი რომელშიც ავაწყობთ გამართულ წინადადებას-
1 2 | Meslog:='gadaxdis procedura dasrulda carmatebit'||CHR(13)|| 'gadaxdebis raodenoba - ' || billCount || CHR(13)|| 'gadaxdebis sruli Tanxa - ' || BillPrice || CHR(13)|| 'bolo gadaxda - ' || lastBill || CHR(13); MAILLOG ('გამგზავნი ელ-ფოსტა','მიმღები ელფოსტა','სათაური', Meslog); |
აჰა! ეგ არის წერილიც გვაქვს… აქვე შეგვიძლია გავაკეთოთ exception -ის კონტროლი. ანუ თუ პროცედურა ვერ შესრულდა ელ-ფოსტაში ჩაიწეროს შეცდომის ნომერი და თარიღი. თუ შესაძლებელია, შეცდომის სიტყვიერი განმარტებაც. ან შეცდომის ნომერზე ბმული რომელიც ავტომატურად გადავა განმარტების გვერდზე. ”იტოგში ” ეხლა მე თუ არ გავჩერდი ალბათ კიდევ ბევრს დავწერ და უფრო გავართულებ იმათთვის ვინც კარგად არ არის გარკვეული ამაში.
წავედი მე და აბა წარმატებული ”ორაკლ-მაილომანია” 🙂