[MacRuby-devel] Basic delayed email method

Steve Clarke steve at sclarkes.me.uk
Tue Oct 23 10:12:37 PDT 2012


You need to use the ScriptingBridge documentation in Xcode - which means that you need to spend some time understanding Objective C.  I don't know it well but enough to translate examples into Macruby.

I found Matt Aimonetti's book very helpful when I was starting off. It doesn't say a lot about ScriptingBridge per se, but in the end SB is just another framework you can use from Macruby.

It's worth looking back at the Macruby archives because Matt wrote some very helpful stuff about using SB.  One tip I recall is that you can see what methods are available on an object in Macruby by using obj.methods(true,true).  This gives tons of stuff but critically it shows both the Macruby methods AND the Objective C methods.  With SB it's the latter group that are of real interest. 

Steve

On 23 Oct 2012, at 17:52, Cliff Rosson <cliff.rosson at gmail.com> wrote:

> Perfect! How did you figure all of this out. Are there some documents that explain when it is appropriate to use things like "classForScriptingClass" etc...?
> 
> On Tue, Oct 23, 2012 at 9:49 AM, Steve Clarke <steve at sclarkes.me.uk> wrote:
> Hi Cliff,
> 
> I've got something simple to work in Macruby.  I think the problems I had were because of html content.
> 
> Here's an example for plain text:
> 
> =================
> framework 'Foundation'
> framework 'ScriptingBridge'
> TITLE="title"
> def make_message
> 	app=SBApplication.applicationWithBundleIdentifier("com.apple.Mail")
> 	props = { 'subject'=> 'Subject 1', 'sender'=>'steve at sclarkes.me.uk', 'content'=>'Lorem ipsum ....'}
> 	msg_class = app.classForScriptingClass('outgoing message')
> 	outgoing_msg=msg_class.alloc.initWithProperties(props)
> 	app.outgoingMessages.addObject(outgoing_msg)
> 	recip_class=app.classForScriptingClass('to recipient')
> 	recipient=recip_class.alloc.initWithProperties({'address'=>'steve at sclarkes.me.uk'})
> 	outgoing_msg.toRecipients.addObject(recipient)
> 	outgoing_msg.send
> end
> 
> make_message
> =================
> 
> Steve
> 
> On 23 Oct 2012, at 16:51, Cliff Rosson <cliff.rosson at gmail.com> wrote:
> 
>> Steve how did you get it working with the plain text. Below is the code I think that is relevant in the SBS program.
>> 
>> - (IBAction)sendEmailMessage:(id)sender {
>> /* create a Scripting Bridge object for talking to the Mail application */
>> MailApplication *mail = [SBApplication applicationWithBundleIdentifier:@"com.apple.Mail"];
>>     
>>         /* set ourself as the delegate to receive any errors */
>>     mail.delegate = self;
>> /* create a new outgoing message object */
>> MailOutgoingMessage *emailMessage = [[[mail classForScriptingClass:@"outgoing message"] alloc] initWithProperties:
>>                                                 [NSDictionary dictionaryWithObjectsAndKeys:
>>                                                     [self.subjectField stringValue], @"subject",
>>                                                     [[self.messageContent textStorage] string], @"content",
>>                                                     nil]];
>> /* add the object to the mail app  */
>> [[mail outgoingMessages] addObject: emailMessage];
>> /* set the sender, show the message */
>> emailMessage.sender = [self.fromField stringValue];
>> emailMessage.visible = YES;
>> 
>> 
>> Though it is not clear how this would translates over into macruby. I have tried ever variation of MailOutgoingMessage.new and addObject. 
>> 
>> 
>> On Tue, Oct 23, 2012 at 8:45 AM, Steve Clarke <steve at sclarkes.me.uk> wrote:
>> Hi,
>> 
>> I got something similar working for a plain text email but there are additional requirements for HTML emails (which I needed), and I couldn't persuade SB to accept  html content.  I should have made that clear in my previous note.  If anyone has an example for HTML email with SB it would be great to see it.
>> 
>> Just taken a closer look at the scripting dictionary for mail and it looks like the "html content" property isn't documented - so who knows how I found it in the first place!  I just checked it out and it still works but obviously can't be relied on.  
>> 
>> Apologies for the red herring.  It looks as if there is no supported way to send html email using ScriptingBridge.
>> 
>> Steve
>> 
>> On 23 Oct 2012, at 15:52, Mark Rada <mrada at marketcircle.com> wrote:
>> 
>>> Hi Cliff,
>>> 
>>> Did you manage to find the SBSendEmail sample code:
>>> 
>>> https://developer.apple.com/library/mac/#samplecode/SBSendEmail/Introduction/Intro.html
>>> 
>>> The sample they have looks a bit different from what you have. I haven't tried it out myself, but their documentation seems quite thorough and was updated only a year ago.
>>> 
>>> 
>>> 
>>> 
>>> 
>>> On 2012-10-23, at 5:28 AM, Steve Clarke <steve at sclarkes.me.uk> wrote:
>>> 
>>>> Just had a closer look at what I did with sending mail and I think my earlier reply was probably  wrong, or at least not helpful.  I think the difficulty arises because there are some things that ScriptingBridge is unable to do.  I could not find a way to create an outgoing message with ScriptingBridge and I had to resort to running a trivial applescript (using NSAppleScript executeAndReturnError)  to do the job for me.  If anyone knows a better way I'd be delighted to hear about it! 
>>>> 
>>>> I created the applescript from a template that I modified in my code before I executed it.  I guess Cliff could adopt a similar approach to copy subject, content etc from his draft.
>>>> 
>>>> Here's the template.  The %HTML% and %SUBJECT% are placeholders that get replaced by the actual values before execution.
>>>> 
>>>> =========================
>>>> tell application "Mail"
>>>> 	activate
>>>> 	set htmlMsg to "%HTML%"
>>>> 	set subjecta to "%SUBJECT%"
>>>> 	set theMsg to make new outgoing message with properties ¬
>>>> 		{subject:subjecta, html content:htmlMsg & return & return, content:""}
>>>> end tell
>>>> =========================
>>>> 
>>>> Steve
>>>> 
>>>> On 23 Oct 2012, at 07:06, Cliff Rosson <cliff.rosson at gmail.com> wrote:
>>>> 
>>>>> So playing around a little with this I was able to browse and find messages via macruby. On the other hand I cannot figure out how to send a drafted email. Here is what I have so far.
>>>>> 
>>>>> My drafts folder has 1 message in it ready to be sent.
>>>>> 
>>>>> mail = SBApplication.applicationWithBundleIdentifier("com.apple.mail")
>>>>> my_account = mail.accounts.select { |account| account.name == "MyAccountName" }.first
>>>>> drafts_folder = my_account.mailboxes.select { |mailbox| mailbox.name == "Drafts" }.first
>>>>> draft = drafts_folder.messages.first
>>>>> 
>>>>> I need to use the send method somehow. I think I need to make a new MailOutgoingMessage but I would like to make this message based on my already existing draft message.
>>>>> 
>>>>> Any know how this is done?
>>>>> 
>>>>> I had hoped it would have been as simple as draft.send. :)
>>>>> 
>>>>> 
>>>>> On Sat, Oct 20, 2012 at 2:14 PM, Mark Rada <mrada at marketcircle.com> wrote:
>>>>> Hi Rob,
>>>>> 
>>>>> I think Colin answered this fairly well. Personally, I prefer to use GCD when available because I find the API simpler and GCD stuff works with or without run loops.
>>>>> 
>>>>> --
>>>>>         Mark
>>>>> 
>>>>> 
>>>>> On 2012-10-20, at 2:40 PM, Robert Carl Rice <rice.audio at pobox.com> wrote:
>>>>> 
>>>>> > Hi Mark,
>>>>> >
>>>>> > I use NSTimer a lot in my apps. What is the advantage of using GCD API?
>>>>> >
>>>>> > There is an excellent tutorial on the web for specifically for setting up ScriptingBridge for Apple Mail but I forget where I saw it. On warning; if you set up ScriptingBridge for Apple Mail don't try to take a snapshot in Xcode 4. Xcode will follow the link to mail and include all of your mailboxes in the snapshot. I don't know if there is a way to stop this behavior.
>>>>> >
>>>>> > Bob Rice
>>>>> >
>>>>> > On Oct 19, 2012, at 6:50 PM, Mark Rada <mrada at marketcircle.com> wrote:
>>>>> >
>>>>> >> Busy looping for an hour would be really bad. I assume you would have a sleep in there, but then you're still polling.
>>>>> >>
>>>>> >> If you are using MacRuby, looking at the GCD API would be a good idea. You could do something like this:
>>>>> >>
>>>>> >> def schedule_email q
>>>>> >>   q.after(3600) do
>>>>> >>       # Send email
>>>>> >>       schedule_email q
>>>>> >>   end
>>>>> >> end
>>>>> >>
>>>>> >> schedule_email Dispatch::Queue.new("com.rosson.delayed.email")
>>>>> >>
>>>>> >> NSRunLoop.currentRunLoop.run
>>>>> >>
>>>>> >>
>>>>> >>
>>>>> >> As for actually sending emails, if you want to have things go through Apple Mail you could use the ScriptingBridge framework which has a few tutorials online (but for iTunes):
>>>>> >>
>>>>> >> http://arstechnica.com/apple/2011/09/tutorial-os-x-automation-with-macruby-and-the-scripting-bridge/
>>>>> >>
>>>>> >> AXElements is another option that I am biased in favour of; but it may not be passive enough for your requirements.
>>>>> >>
>>>>> >> HTH,
>>>>> >>      Mark
>>>>> >>
>>>>> >>
>>>>> >> On 2012-10-19, at 6:12 PM, Cliff Rosson <cliff.rosson at gmail.com> wrote:
>>>>> >>
>>>>> >>> Hi Everyone,
>>>>> >>>
>>>>> >>> I am fairly new to macruby and am having trouble finding some basic documentation to help me out. I would like to write a simple app that sends a delayed email based on Time from mac mail.
>>>>> >>>
>>>>> >>> I am thinking of something like this,
>>>>> >>>
>>>>> >>> time = Time.now + 3600
>>>>> >>> while true
>>>>> >>> case time
>>>>> >>> when Time.now
>>>>> >>>   #Send email
>>>>> >>> end
>>>>> >>> end
>>>>> >>>
>>>>> >>> Being able to respond to certain emails or send an email from a draft would be a huge benefit. Can anyone point me in the write direction to accomplish this? I am decently proficient in ruby but don't know where to start with MacRuby.
>>>>> >>>
>>>>> >>> Thanks everyone
>>>>> >>>
>>>>> >>> _______________________________________________
>>>>> >>> MacRuby-devel mailing list
>>>>> >>> MacRuby-devel at lists.macosforge.org
>>>>> >>> http://lists.macosforge.org/mailman/listinfo/macruby-devel
>>>>> >>
>>>>> >> _______________________________________________
>>>>> >> MacRuby-devel mailing list
>>>>> >> MacRuby-devel at lists.macosforge.org
>>>>> >> http://lists.macosforge.org/mailman/listinfo/macruby-devel
>>>>> >>
>>>>> >
>>>>> > _______________________________________________
>>>>> > MacRuby-devel mailing list
>>>>> > MacRuby-devel at lists.macosforge.org
>>>>> > http://lists.macosforge.org/mailman/listinfo/macruby-devel
>>>>> 
>>>>> _______________________________________________
>>>>> MacRuby-devel mailing list
>>>>> MacRuby-devel at lists.macosforge.org
>>>>> http://lists.macosforge.org/mailman/listinfo/macruby-devel
>>>>> 
>>>>> 
>>>>> 
>>>>> -- 
>>>>> http://about.me/cliffrosson
>>>>> vizualize.me/cliffrosson
>>>>> _______________________________________________
>>>>> MacRuby-devel mailing list
>>>>> MacRuby-devel at lists.macosforge.org
>>>>> http://lists.macosforge.org/mailman/listinfo/macruby-devel
>>>> 
>>>> _______________________________________________
>>>> MacRuby-devel mailing list
>>>> MacRuby-devel at lists.macosforge.org
>>>> http://lists.macosforge.org/mailman/listinfo/macruby-devel
>>> 
>>> _______________________________________________
>>> MacRuby-devel mailing list
>>> MacRuby-devel at lists.macosforge.org
>>> http://lists.macosforge.org/mailman/listinfo/macruby-devel
>> 
>> 
>> _______________________________________________
>> MacRuby-devel mailing list
>> MacRuby-devel at lists.macosforge.org
>> http://lists.macosforge.org/mailman/listinfo/macruby-devel
>> 
>> 
>> 
>> 
>> -- 
>> http://about.me/cliffrosson
>> vizualize.me/cliffrosson
>> _______________________________________________
>> MacRuby-devel mailing list
>> MacRuby-devel at lists.macosforge.org
>> http://lists.macosforge.org/mailman/listinfo/macruby-devel
> 
> 
> _______________________________________________
> MacRuby-devel mailing list
> MacRuby-devel at lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo/macruby-devel
> 
> 
> 
> 
> -- 
> http://about.me/cliffrosson
> vizualize.me/cliffrosson
> _______________________________________________
> MacRuby-devel mailing list
> MacRuby-devel at lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo/macruby-devel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-devel/attachments/20121023/7246bc15/attachment-0001.html>


More information about the MacRuby-devel mailing list