সবচেয়ে সাম্প্রতিক রাখতে মেল মেলের সাথে অ্যাপলস্ক্রিপ্ট লেখার জন্য সাহায্য করুন


1

আমি নির্দিষ্ট প্রেরকদের থেকে মেইলকে "নিউজ" নামক একটি নতুন মেইলবক্সে সরানোর জন্য একটি নিয়ম তৈরি করেছি। আমি আমার অ্যাপলস্ক্রিপ্টকে "সংবাদ" ফোল্ডারটি দিয়ে যেতে চাই এবং কেবল সেই প্রেরকের কাছ থেকে সাম্প্রতিকতম আমায়া রাখব, পূর্ববর্তী বার্তাগুলি মুছে ফেলব। (এটি MSLive / Outlook এ সুইপ ফাংশনগুলির মধ্যে একটি।) আমি নিম্নরূপ একটি স্ক্রিপ্ট লেখার চেষ্টা করেছি, যা এই নিয়ম দ্বারা প্রযোজ্য:

using terms from application "Mail"
    on perform mail action with messages these_messages for rule this_rule
        tell application "Mail"
            set dateToday to current date
            set TargetInbox to mailbox "News" of account "iCloud"
            set EveryMessage to every message of TargetInbox
            repeat with eachMessage in these_messages
                repeat with this_message in EveryMessage
                    set eachSender to the sender of eachMessage
                    set this_sender to the sender of this_message
                    set messageDate to date received of EveryMessage
                    if messageDate < dateToday and eachSender = this_sender then
                        delete this_message
                    end if
                end repeat
            end repeat
        end tell
    end perform mail action with messages
end using terms from

মেনু বারে কুইন গিয়ারের কারণে স্ক্রিপ্টটিকে স্কুলে বলা হয়, তবে পছন্দসই মুছে ফেলার কোনওটি ঘটে না এবং স্ক্রিপ্টটি কোনও ধরণের লুপে ঝুলন্ত বলে মনে হয়।

আমি একটি অ্যাপলস্ক্রিপ্ট n00b, জাভাস্ক্রিপ্ট সঙ্গে অনেক ভাল। আমি কোন সাহায্য কৃতজ্ঞ হবে।

ধন্যবাদ, Betalantz

ম্যাকোস 10.13.5 | মেইল 11.4 অ্যাপলস্ক্রিপ্ট 2.7


আমি পরে আরও ব্যাপকভাবে একটি চেহারা নিতে হবে। কিন্তু আমি যা করতে চাই তা হল স্ক্রিপ্টের প্রতিটি অংশ পরীক্ষা করা। উদাহরণস্বরূপ আপনি ব্যবহার করতে পারেন display dialog "Hi"যা জাভাস্ক্রিপ্টের সমতুল্য সতর্কতা ("হাই") এর মত, পুনরাবৃত্তিগুলিতে পরীক্ষা করে দেখুন যে তারা সঠিকভাবে পুনরায় প্রদর্শিত হচ্ছে কিনা। তারপর আপনি যে পরিবর্তনশীলটি ব্যবহার করেন তার সাথে হাইকে স্যুইচ করুন (যেমন this_message ) তাই আপনি নিশ্চিত করতে পারেন যে পরিবর্তনশীল সঠিক।
JBis

গ্রেট টিপ, ব্যবহার করতে display dialog একটি ধরনের হিসাবে console.log ডিবাগিং জন্য। একবার চেষ্টা করে দেখব.
Lantz Warrick

অ্যাপলস্ক্রিপ্টে একটি কনসোল বিকল্প রয়েছে কিন্তু আমি সবসময় ডায়ালগ পছন্দ করি। :)
JBis

উত্তর:


2

আমি ব্যবহার করি না Mail.app এবং বাস্তবায়ন অনেক অভিজ্ঞতা আছে মেইল কর্ম , তাই আপনার স্ক্রিপ্ট পরীক্ষা করার অবস্থানে নেই। যাইহোক, এটি মাধ্যমে পড়া, সম্ভাব্য উদ্বেগের মধ্যে জায়গা আছে যে আমি ডিবাগিং যখন প্রথম দিকে তাকান করতে চাই।

আপনার বড় কত "সংবাদ" মেইলবক্স?

আপনার স্ক্রিপ্টে দুটি বৈশিষ্ট্য রয়েছে যা হ hang বা সময়সীমাতে হুমকি দেয়:

1। set EveryMessage to every message of TargetInbox

যদি সেই মেইলবক্সটিতে হাজার হাজার বা এমনকি শত শত ইমেল রয়েছে, পুনরুদ্ধার করা হচ্ছে every message পৃথকভাবে উল্লেখ একটি তালিকা হিসাবে message বস্তু (যা এই বিবৃতি কি করছে) কিছু সময় নিতে পারে। এটি প্রায় সবসময় আরও কার্যকর এবং প্রসেসর এবং মেমরি ব্যবহার সঞ্চয় কম গভীরতর উপায় a reference to দ্য every message বস্তু (সংগ্রহ):

set EveryMessage to a reference to every message of the TargetInbox

এটি আরেকটি উপকারী বৈশিষ্ট্য যা আমি পরে উল্লেখ করব।

2. সম্ভাব্য নেস্টেড দাবি repeat লুপ

Nested loops কখনও কখনও একটি প্রয়োজনীয় মন্দ হয়, কিন্তু মেলবক্স আকার সম্পর্কে প্রশ্ন আবার, আমার জন্য উদ্বেগ একটি উত্স, বিশেষ করে যেহেতু এটি নিখরচায় হৃদয় যেখানে বলা হয় অপারেশন প্রচুর কাজ করা হয়। এর অর্থ হল, স্ক্রিপ্টটি ট্রিগার করে এমন প্রতিটি নতুন বার্তাগুলির জন্য, মেলবক্সে থাকা প্রতিটি একক বার্তাটি ট্রিগার বার্তাটির সাথে তুলনা করা উচিত।

এটি একটি ইস্যুর দুটি শাখা, সত্যিই, কারণ যদি আপনার মেলবক্সটিতে কেবল 5 টি বার্তা থাকে তবে এটির মধ্যে কোনটি বিশেষত বিরক্তিকর নয়। অন্যথায়, আপনি প্রথমে মেলবক্সে প্রতিটি বার্তা পুনরুদ্ধার করতে এবং একটি পরিবর্তনশীলতে সেগুলি সংরক্ষণ করতে অ্যাপলস্ক্রিপ্ট পেয়ে যাচ্ছেন; তারপর এই সম্ভাব্য ভারী লোড মাধ্যমে সাইকেল চালানো এবং প্রতিটি আইটেম অন্য একটি তুলনা।

আপনি ব্যবহার করার জন্য কিন্তু কোন পছন্দ ছিল repeat লুপ যখন অনেকগুলি তালিকা আইটেমের মাধ্যমে পুনরাবৃত্তি করতে হবে তা জানার সময় (একবার আপনি প্রায় 500 এরও বেশি কিছু পরে, অ্যাপলস্ক্রিপ্ট ফিরতে শুরু করতে পারে) এটি আবারও অ্যাপলস্ক্রিপ্টটি পাস করতে সহায়তা করে। উল্লেখ পরিবর্তে প্রকৃত তালিকার আইটেম তালিকা। একটি মাধ্যমে কোন রেফারেন্স পাস স্ক্রিপ্ট বস্তু (যা কি a reference to মূলতঃ), অ্যাপলস্ক্রিপ্টটি অন্য উপায়ে একটি বস্তু অ্যাক্সেস করার চেয়ে অনেক বেশি দ্রুত। এখানে এই নীতির একটি চমৎকার ব্যাখ্যা এবং বিক্ষোভ

সহজ পরিবর্তন এবং ত্রুটি সংশোধন

উপরে ভারী সমস্যাটি সমাধান করার পরে, যা আপনার বিশেষ ক্ষেত্রে সামান্য প্রাসঙ্গিকতা হতে পারে, এখানে এক বা দুটি সত্যিকারের উপাদান যা সহজেই স্ক্রিপ্টটির দক্ষতা উন্নত করতে পরিবর্তিত হয়, অথবা এটি একটি ত্রুটি নিক্ষেপ করতে বাধা দেয়:

1. পরিবর্তনশীল ঘোষণা স্থান

set eachSender to the sender of eachMessage

এই লাইন বর্তমানে অভ্যন্তরের ভিতর ঘোষণা করা হয় repeat লুপ, যা সাধারণ hypothetical পদে, উভয় meatier হতে হবে। যাইহোক, এই কি করছেন পরিবর্তনশীল মান নির্ধারণ করা হয় eachSender আপনার মেইলবক্সে আপনার যতগুলি বার্তা আছে তার জন্য একই মান। এটি অ্যাপলস্ক্রিপ্টের জন্য প্রচুর অপচয়যুক্ত অপারেশন (মোট সংখ্যা these_messages দ্বারা গুণিত সংখ্যা EveryMessage )।

পরিবর্তে, এখানে এটি সরান:

repeat with eachMessage in these_messages
    set eachSender to the sender of eachMessage  # ...now it's here
    repeat with this_message in EveryMessage
        # It was here...
        .
        .
        .
    end repeat
end repeat

এখন অ্যাপলস্ক্রিপ্টের জন্য শুধুমাত্র একবার পরিবর্তনশীল সেট করা আছে eachMessage মধ্যে these_message। যে রৈখিক সময় নিচে বহুবর্ষজীবী সময় একটি দক্ষতা উন্নতি!

2। set messageDate to date received of EveryMessage

প্রাথমিকভাবে, আমি ভেবেছিলাম আপনি অ্যাক্সেস করার চেষ্টা করছেন EveryMessage বস্তুটিকে আমি আগে কথোপকথনের রেফারেন্স হিসাবে উল্লেখ করেছি এবং সহজেই বুঝতে পারছি না যে আপনি যে ভাবে ঘোষণা করেছিলেন সেটি আপনি করতে পারছেন না EveryMessage

কিন্তু, আমি এখন বুঝতে পারি এটি সম্ভবত আপনার হাতের চেয়ে আপনার হাতের দ্রুত টাইপ করা এবং একটি বিরক্তিকর টাইপো প্রবর্তন করা। EveryMessage এখানে হতে কর্তব্য this_message, i.e .:

set messageDate to date received of this_message

এটি আমার চূড়ান্ত বিন্দুতে বেশ সুন্দরভাবে পরিচালিত করে, যা আমি আগেই ইঙ্গিত দিয়েছিলাম, একটি রেফারেন্স হিসাবে একটি বস্তুর সংগ্রহে একটি পরিবর্তনশীল ঘোষণা করার অন্যান্য সুবিধা সম্পর্কে।

আপনি এই কাজ করে থাকেন:

set EveryMessage to a reference to every message of the TargetInbox

তারপর এই:

set messageDate to date received of EveryMessage

অ্যাপলস্ক্রিপ্টের পুরোপুরি বৈধ টুকরা হবে, যা আপনাকে তালিকার প্রতিটি আইটেমের সম্পত্তি অ্যাক্সেস করতে দেয় IFF Dereferencing এর যে কোনও ধরণের স্থান গ্রহণ করার আগে সেই তালিকাটির একটি রেফারেন্সের মাধ্যমে সম্পন্ন হয়েছে। একবার এটি বাতিল করা হয়ে গেলে, তালিকাটি পৃথক বস্তুর রেফারেন্সগুলিতে মূল্যায়ন করা হয় এবং এটি আপনাকে তার উপায়ে তার বৈশিষ্ট্যগুলির মাধ্যমে গণনা করার উপায় সরবরাহ করবে না।

সঠিকভাবে সম্পন্ন হলে আপনি কী পাবেন তার তালিকা রয়েছে date received সম্পত্তি every message of the TargetInbox, সব অ্যাপলস্ক্রিপ্ট একক লাইন মাধ্যমে।

বর্তমানে, এটি আপনি কিভাবে প্রয়োগ করেছিলেন তা নয়, ঘোষণার জন্য set messageDate ইচ্ছাশক্তি স্পষ্টভাবে একটি ত্রুটি নিক্ষেপ।

এটি ব্যাখ্যা করে যে কেন কোনও মুছে ফেলা হচ্ছে না, কারণ আপনার স্ক্রিপ্ট সফলভাবে সেই অংশে পৌঁছাবে না। যাইহোক, ত্রুটি অবিলম্বে ঘটতে পারে, তাই আমার অনুভূতি হয় যে স্ক্রিপ্টটি এমনকি সেই লাইনটিতে পৌঁছাতে পারে না, এমনকি একবারও নয়। অতএব, সমস্যাটি অভ্যন্তরীণভাবে সফলভাবে প্রবেশ করার আগে স্ক্রিপ্টের একটি বিন্দু থেকে উদ্ভূত হওয়া আবশ্যক repeat লুপ. এবং আপনি ইতিমধ্যে যে সম্পর্কে আমার গুচ্ছ জানি।

এখন একটি সম্ভাব্য সমাধান জন্য

আমি দুঃখিত যে আমি আসলেই আমার স্ক্রিপ্টটি যাচাই করতে পারছি না যে এটি নিশ্চিতভাবেই প্রথমবার কোনও পরিবর্তন ছাড়াই কাজ করবে, তাই আমাকে বলুন কিভাবে আপনি এটির সাথে কীভাবে চলতে পারেন:

    using terms from application "Mail"
        on perform mail action with messages these_messages
            tell application "Mail"
                set everyMessage to a reference to messages in mailbox "News" of account "iCloud"
                repeat with eachMessage in these_messages
                    delete (everyMessage where ¬
                        the date received is not the (current date) ¬
                        and its sender is the sender of eachMessage)
                end repeat
            end tell
        end perform mail action with messages
    end using terms from

আপনি দেখতে পারেন, আমি ভেতরের অধিকাংশ সঙ্গে সম্পূর্ণরূপে কাজ করেছেন repeat লুপ ধন্যবাদ ব্যবহার করুন a reference to অপারেটর. আমি ঘোষণা হিসাবে everyMessage এইভাবে, আমি (আশা করছি) তালিকায় থাকা সমস্ত আইটেমগুলির বৈশিষ্ট্যগুলি গণনা করতে সক্ষম, যা পৃথকভাবে প্রতিটি আইটেমের জন্য সম্পত্তি চেক করার চেয়ে আনুমানিক গুণমানের চেয়ে দ্রুত হওয়া উচিত।


2
+1 স্মার্ট। আমি আপনার পদ্ধতি পছন্দ।
JBis

@ সিজেকে অনেক ধন্যবাদ, শুধুমাত্র একটি ভাল সমাধান না দেওয়ার জন্য, কিন্তু এত ভালভাবে ব্যাখ্যা করে যে আমি অ্যাপলস্ক্রিপ্টের মূল্যবান দিক শিখেছি! আমার পূর্ণ প্রতিক্রিয়ার জন্য এই পোস্টে আমার মন্তব্য দেখুন।
Lantz Warrick

@ ল্যান্টজ ওয়ারিক আপনার কোডটি কাজ করে এমনকি যদি দ্বিতীয় কোডার দৃষ্টিকোণ পেতে ভাল। তারা একটি ভাল পদ্ধতির তুলনা করতে পারে যা ভাল, এবং যদি এটি ভাল না হয় তবেও আপনি সমস্যার সমাধান করার একটি ভিন্ন উপায় দেখতে পাবেন। প্রায়ই একটি সমস্যা সমাধান করার অনেক উপায় আছে। আপেলস্ক্রিপ্ট শেখার আপ রাখুন আমরা সর্বদা সৃজনশীল coders ব্যবহার করতে পারেন!
JBis

0

যেমন একটি পুঙ্খানুপুঙ্খ প্রতিক্রিয়া @CJK অনেক ধন্যবাদ। আপনার সমাধানটি শুধুমাত্র একটি টিভিক দিয়ে কাজ করে এবং আমি অ্যাপলস্ক্রিপ্টের জন্য কিছু মূল ধারণা শিখেছি। নিচের কাজ স্ক্রিপ্টটি এখন দ্রুত সঞ্চালিত হয়:

using terms from application "Mail"
    on perform mail action with messages these_messages for rule this_rule
        tell application "Mail"
            set everyMessage to a reference to messages in mailbox "News" of account "iCloud"
            repeat with eachMessage in these_messages
                delete (everyMessage where ¬
                    the date received is not the (current date) ¬
                    and its reply to is the reply to of eachMessage)
            end repeat
        end tell
    end perform mail action with messages
end using terms from

স্ক্রিপ্ট লাইন 2 ছাড়া ছাড়া নির্বাহ না করলো for rule this_rule এবং আমি surmise এটা পাস করার জন্য প্রয়োজনীয় these_messages বস্তু যা পিতা-মাতা মেল.এপ নিয়মের সংজ্ঞায়িত ফিল্টারিংয়ের ফলাফল যা স্ক্রিপ্টটি চালনা করছে।

(পরিশেষে repeat লুপ, আমি পরিবর্তন sender থেকে reply to এমন পরিস্থিতিতে হ্যান্ডেল করতে যেখানে পাঠক তাদের স্ব-সনাক্তকারী স্ট্রিংটি পাঠানোর অ্যাকাউন্টে পরিবর্তিত হয়েছে, যদিও প্রকৃত ঠিকানাটি একই রকম থাকে তবে স্ক্রিপ্টটি একই ঠিকানা থেকে পুরানো ইমেলগুলিকে মিস করতে পারে।)

আমি অনুপস্থিত যে মূল বোঝার যে EveryMessage বস্তু স্বয়ংক্রিয়ভাবে রেফারেন্স দ্বারা গৃহীত হয় নি। আমি জাভাস্ক্রিপ্ট থেকে আসছি, যেখানে বস্তু, অ্যারে, এবং ভেরিয়েবলগুলি স্বয়ংক্রিয়ভাবে রেফারেন্স দ্বারা প্রেরিত হয়, যখন অ্যাপলস্ক্রিপ্টে এটি একটি রেফারেন্স অবজেক্ট হিসাবে ঘোষণা করতে হবে।


0

আমি এই স্ক্রিপ্ট বাস্তবায়নের আরো কয়েকটি সমস্যা মধ্যে চালানো করেছি। This is the rule which executes my script.

এই নিয়মটি আমার স্ক্রিপ্টটি চালায়। মনে রাখবেন যে 'move' কমান্ডটি সর্বদা স্ক্রিপ্টের আগে কার্যকর হয়, এমনকি আমি স্ক্রিপ্ট এক্সিকিউশন কমান্ডের পরে এটি স্থাপন করার চেষ্টা করি। Mail.app স্ক্রিপ্টটি চালানো বলে মনে হচ্ছে না এবং আমি মনে করি এটি প্রথম বারের মেইলবক্সে ইনকামিং মেসেজটি সরানো এবং লক্ষ্য মেইলবক্সে স্ক্রিপ্টটি চালানোর কারণে হতে পারে। যেহেতু স্ক্রিপ্ট ইনকামিং বার্তা তুলনা করে ( eachMessage in these_messages ) লক্ষ্য মেইলবক্সে বার্তাগুলিতে ( everyMessage ), সম্ভবত সেখানে নেই eachMessage সরানো অবজেক্ট স্ক্রিপ্ট ব্যবহার চালানো পরে? আমার তত্ত্ব পরীক্ষা করার জন্য, আমি নিম্নরূপ আমার লিপির মধ্যে সরানো কমান্ড অন্তর্ভুক্ত করার সিদ্ধান্ত নিয়েছে:

using terms from application "Mail"
    on perform mail action with messages these_messages for rule this_rule
        tell application "Mail"
            set everyMessage to a reference to messages in mailbox "Charitable appeals" of account "iCloud"
            repeat with eachMessage in these_messages
                delete (everyMessage where ¬
                    the date received is not the (current date) ¬
                    and (its sender is the sender of eachMessage ¬
                    or its reply to is equal to the reply to of eachMessage))
            end repeat
            repeat with eachMessage in these_messages
                move eachMessage to mailbox "Charitable appeals" of account "iCloud"
            end repeat
        end tell
    end perform mail action with messages
end using terms from

তাই এখন আমার নিয়ম শুধুমাত্র যথাযথ অন্তর্মুখী বার্তাগুলিতে আমার স্ক্রিপ্ট চালায়। সমস্যা এখন যে, যদি আমি Apply Rules mail.app এর মেনু থেকে ম্যানুয়ালি একটি বার্তা, স্ক্রিপ্টটি প্রত্যাশিত হিসাবে কার্যকর হয়, কিন্তু যখন নিয়মিত ইনকামিং মেসেজ স্বয়ংক্রিয়ভাবে রান করে তখন mail.app hangs হয় not responding, আমি প্রস্থান এবং পুনরায় আরম্ভ করতে বাধ্য, কখনও কখনও প্রথম স্ক্রিপ্ট নিষ্ক্রিয় করা। আমি মনে করতে পারি কারণ এটি টার্গেট মেইলবক্সে 100 টিরও বেশি বার্তা ছিল, তবে আমি কেবল ~ 50 বার্তাগুলি পর্যন্ত সেগুলি পরিষ্কার করেছি, এবং ঝুলন্ত থাকা।

আমি @CJK বা যে কেউ থেকে, কোন সাহায্য ব্যাপকভাবে কৃতজ্ঞ হবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.