Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

PL/SQL Mail_Client API का उपयोग करके मेलबॉक्स से संदेश पुनर्प्राप्त करें

हाल ही में मुझे Oracle एपेक्स में एक तरह का मेल क्लाइंट सिस्टम बनाने का काम मिला है। आवश्यकता किसी विशेष खाते के लिए एक पृष्ठ पर मेल इनबॉक्स के संदेशों को दिखाने की थी ताकि उपयोगकर्ता ईमेल संदेशों, अनुलग्नकों को देख सके और संदेशों को हटा सके, आदि। लेकिन Oracle में, UTL_SMPT, UTL_MAIL का उपयोग करके ईमेल भेजने के लिए पैकेज हैं। , और APEX_MAIL, और मेलबॉक्स से मेल संदेशों को पुनः प्राप्त करने के लिए कोई पैकेज नहीं है। थोड़ी खोज करने के बाद, मुझे Carsten Czarski द्वारा लिखित एक PL/SQL MAIL_CLIENT API मिला, जिसकी मदद से आप मेलबॉक्स से संदेशों को आसानी से प्राप्त कर सकते हैं। और इस ट्यूटोरियल में, मैं MAIL_CLIENT API . के उदाहरण दे रहा हूं आदेश और प्रक्रियाएं। सबसे पहले, PL/SQL MAIL_CLIENT को डाउनलोड और इंस्टॉल करें निम्न लिंक का उपयोग करके:

पीएल/एसक्यूएल MAIL_CLIENT API डाउनलोड करें

PL/SQL MAIL_CLIENT API उदाहरण

निम्नलिखित अनुभागों में, मैं MAIL_CLIENT पैकेज का उपयोग करके कनेक्ट करने के लिए चरण दर चरण उदाहरण दे रहा हूं, फिर मेलबॉक्स सामग्री कैसे देखें, किसी विशेष संदेश और उसके अनुलग्नकों को कैसे देखें, आदि।

उदाहरण-1:MAIL_CLIENT का उपयोग करके कनेक्ट करें

मेल सर्वर से कनेक्ट करने के लिए, निम्न PL/SQL कोड का उपयोग करें:

मेल_क्लाइंट.कनेक्ट_सर्वर (p_hostname => 'YourMailServer.com', p_port => YourPortIntegerValue, p_protocol => mail_client.protocol_IMAP, -- या mail_client.protocol_POP3 p_userid => 'YourUserID', p_passwd => 'YourPassword', p_sl => सत्य -- सत्य या असत्य आपके मेलबॉक्स पर निर्भर करता है); mail_client.open_inbox; dbms_output.put_line ('मेलबॉक्स सफलतापूर्वक खोला गया।'); dbms_output.put_line('इनबॉक्स फ़ोल्डर में '||mail_client.get_message_count||' संदेश शामिल हैं।');अंत;/

अपनी मेलबॉक्स सेटिंग्स के अनुसार होस्टनाम, पोर्ट, प्रोटोकॉल, यूजर आईडी और पासवर्ड बदलें। और उपरोक्त कोड को निष्पादित करने के बाद आप अपने मेलबॉक्स से जुड़ जाएंगे। अब आप निश्चित रूप से अपने इनबॉक्स की सामग्री देखना चाहते हैं। निम्न आदेश का प्रयोग करें:

उदाहरण-2:मेलबॉक्स सामग्री देखें

PL/SQL MAIL_CLIENT API का उपयोग करके मेलबॉक्स सामग्री देखने के लिए, नवीनतम संदेशों को शीर्ष पर देखने के लिए निम्न SQL कथन चलाएँ:

टेबल से * चुनें (mail_client.get_mail_headers()) msg_number desc द्वारा ऑर्डर करें;

उपरोक्त क्वेरी से आपको निम्नलिखित कॉलम मिलेंगे:

  • MSG_NUMBER
  • विषय
  • प्रेषक
  • SENDER_EMAIL
  • SENT_DATE
  • CONTENT_TYPE
  • हटाया गया
  • कुछ और फ़्लैग कॉलम

उदाहरण-3:मेल संदेश की संरचना प्राप्त करें

मेल संदेश की संरचना में जानकारी होती है, जैसे कि PARTINDEX संख्या में सादे पाठ प्रारूप में शरीर का हिस्सा, HTML प्रारूप में शरीर का हिस्सा और मेल के अनुलग्नक शामिल हैं। मान लीजिए कि आप ईमेल के मुख्य भाग का सादा पाठ प्राप्त करना चाहते हैं, निम्नलिखित SQL क्वेरी चलाएँ:

टेबल से * चुनें(mail_client.get_message(1).get_struct());

ऊपर दिया गया मान 1 MSG_NUMBER . है संदेशों की। यह आपको निम्नलिखित जानकारी देगा:

  • पार्टइंडेक्स
  • PARENTINDEX
  • CONTENT_TYPE
  • SIZE, वगैरह.
PARTINDEX PARENTINDEX CONTENT_TYPE आकार
0,0 0 पाठ/सादा 2993
0,1 1 पाठ/एचटीएमएल 94849
1 1 मल्टीपार्ट/रिपोर्ट 39398

उदाहरण-4:संदेश का मुख्य भाग पुनर्प्राप्त करें

अब उदाहरण के लिए, यदि आप संदेश संख्या 1 के लिए संदेश का मुख्य भाग सादा पाठ प्रारूप में प्राप्त करना चाहते हैं, तो निम्न क्वेरी चलाएँ:

Mail_Client.Get_Message(1 /* निर्दिष्ट करें संदेश संख्या */).get_bodypart_content_varchar2('0,0') डुअल से चुनें;

नोट: उपरोक्त 0,0 टेक्स्ट/सादे सामग्री प्रकार के लिए PARTINDEX कॉलम का मान है।

बॉडी को HTML फॉर्मेट में लाने के लिए, हम निम्नलिखित क्वेरी को PARTINDEX . के साथ चलाएंगे स्तंभ मान 0,1। यह शरीर को CLOB . में वापस कर देगा :

Mail_Client.Get_Message(1 /* निर्दिष्ट करें संदेश संख्या */).get_bodypart_content_clob('0,1') डुअल से चुनें;

उदाहरण-5:मेल अटैचमेंट प्राप्त करें

इसी तरह, PARTINDEX . का उपयोग करके मेल अटैचमेंट प्राप्त करें मान 1 पैरामीटर के रूप में, जैसा कि नीचे दी गई क्वेरी में दिखाया गया है:

Mail_Client चुनें। 

उदाहरण-6:मेल संदेश हटाएं

MAIL_CLIENT API का उपयोग करके मेल संदेश को हटाने के लिए संग्रहीत कार्यविधि का उदाहरण नीचे दिया गया है।

प्रक्रिया बनाएं या बदलें Delete_Mail_Msg(i_Msg_Number IN NUMBER) IS t_Msg Mail_t;BEGINMail_Client.Connect_Server(p_Hostname => 'YourMailServer', p_Port => MailUserName, p_Protocol => Mail_Client.Protocol_Imap, p_Protocol => Mail_Client.Protocol_Imap 'पासवर्ड', p_Ssl => TRUE);Mail_Client.Open_Inbox;t_Msg:=Mail_Client.Get_Message(i_Msg_Number);t_Msg.Mark_Deleted();Mail_Client.Expunge_Folder;Mail_Client.Close_Folder;Mail_Client.Disconnect_ServerS.THENIFConnected_Server; () =1 फिर मेल_क्लाइंट।क्लोज़_फ़ोल्डर; Mail_Client.Disconnect_Server; अगर अंत; उठाना; END Delete_Mail_Msg;

पैरामीटर के रूप में पारित एक विशिष्ट मेल संदेश को हटाने के लिए अब उपरोक्त प्रक्रिया को कॉल करें। नीचे उदाहरण है:

प्रारंभ Delete_Mail_Msg(3);समाप्त;

उपरोक्त कॉल टू प्रोसेस DELETE_MAIL_MSG ईमेल संदेश नंबर 3 को सर्वर से हटा देगा।

साथ ही, सभी इनबॉक्स संदेशों को मेल बॉडी और अटैचमेंट वाली तालिका में संग्रहीत करने के लिए नीचे दिया गया उदाहरण देते हुए। इन चरणों का पालन करें:

चरण -1:एक तालिका बनाएं।

टेबल MAIL_INBOX बनाएं (MSG_NUMBER INTEGER,SUBJECT VARCHAR2(4000),SENT_DATE DATE,SENDER_EMAIL,BODY_TEXT CLOB,MAIL_ATTACHMENT BLOB)/

चरण-2:Oracle PL/SQL संग्रहित प्रक्रिया बनाएं

प्रक्रिया बनाएं या बदलें LOAD_EMAILS IS

CURSOR c_Inbox IS
Msg_Number चुनें,
विषय,
प्रेषक,
Sender_Email,
Sent_Date ,
Content_Type
FROM TABLE(Mail_Client.Get_Mail_Headers())
Msg_Number DESC द्वारा ऑर्डर;

c_Clob CLOB;
b_blob BLOB;

t_Msg Mail_t;

v_Partindex VARCHAR2(100);
BEGIN

Mail_Client.Connect_Server(p_Hostname => 'YourMAILSERVER',
p_Port => आपकापोर्ट,
p_Protocol => Mail_Client.Protocol_Imap,
p_Userid => 'USERID',
p_Passwd => 'पासवर्ड',
p_Ssl => TRUE);

Mail_Client.Open_Inbox;

c के लिए c_Inbox LOOP

Dbms_Lob.Cre atetemporary(Lob_Loc => c_Clob,
Cache => TRUE,
Dur => Dbms_Lob.Call);

Dbms_Lob.Createtemporary(Lob_Loc => b_blob,
कैशे => TRUE,
Dur => Dbms_Lob.Call);

IF Substr(c.Content_Type,
1,
9) ='मल्टीपार्ट' तब
v_Partindex :=NULL;
BEGIN
पार्टिन्डेक्स चुनें
v_Partindex में
TABLE से(Mail_Client.Get_Message(c.Msg_Number).Get_Structure())
जहां सबस्ट्र (Content_Type,
1,
9) ='text/html';
EXCEPTION
जब अन्य तब
NULL;
END;

अगर v_Partindex खाली नहीं है तो

BEGIN
M चुनें ail_Client.Get_Message(c.Msg_Number).Get_Bodypart_Content_Clob(v_Partindex)
c_Clob में
डुअल से;
अपवाद
जब अन्य तब
NULL;
END;

BEGIN
Mail_Client.Get_Message(c.Msg_Number) चुनें। Get_Bodypart_Content_BLOB('1')
b_blob में
डुअल से;
EXCEPTION
जब अन्य तब
NULL;
END;

END IF;
mail_inbox में डालें
(Msg_Number,
विषय,
Sent_Date,
Sender_email,
Body_Text,
mail_attachment)
VALUES
(c.Msg_Number,
c.Subject,
c.Sent_Date ,
c.Sender_Email,
c_Clob,
b_blob);
ELSIF Substr(c.Content_ टाइप करें,
1,
9) ='text/html' तब

BEGIN
चुनें Mail_Client.Get_Message(c.Msg_Number).Get_Content_Clob()
c_Clob
दोहरे से;
अपवाद
जब अन्य तब
NULL;
END;

mail_inbox में डालें
( Msg_Number,
विषय,
Sent_Date,
Sender_email,
Body_Text)
VALUES
(c.Msg_Number,
c.Subject,
c.Sent_Date,
c.Sender_Email
c_Clob);

END IF;
END LOOP;
COMMIT;
Mail_Client. Close_Folder;
Mail_Client.Disconnect_Server;

अपवाद
जब अन्य तब
रोलबैक;

IF Mail_Client.Is_Connected() =1 तब
Mail_Client.Close_Fo lder;
Mail_Client.Disconnect_Server;
END IF;
RAISE;

END LOAD_EMAILS;

ईमेल संदेशों के साथ तालिका को पॉप्युलेट करने के लिए उपरोक्त प्रक्रिया को निम्नानुसार चलाएँ:

शुरू करें
Load_Emails;
समाप्त;

अब आप तालिका MAIL_INBOX . को क्वेरी कर सकते हैं ईमेल संदेश देखने के लिए।

mail_inbox से * चुनें;
इस प्रोजेक्ट को GitHub से डाउनलोड करें

संबंधित ट्यूटोरियल:

  • पीएल/एसक्यूएल में फाइल से बीएलओबी कैसे प्राप्त करें?
  • Oracle UTL_SMTP:Oracle वॉलेट प्रमाणीकरण का उपयोग करके अटैचमेंट उदाहरण के साथ मेल भेजें

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle 10g . में एग्रीगेट स्ट्रिंग कॉन्सटेनेशन

  2. SQL त्रुटि:ORA-02291:अखंडता बाधा

  3. अपने Oracle सत्र के लिए भाषा कैसे बदलें

  4. अगर Oracle मौजूद नहीं है तो डालें

  5. Oracle डेटाबेस में PL/SQL ब्लॉक सदस्य के रूप में VARRAYs कैसे बनाएं?