Qt рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ mail.app рдкрд░ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ

рдИрдореЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрд╣реБрдд рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВ)ред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ рдореЗрдВ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдареАрдХ рд╣реИ, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдореЗрд▓.рдПрдк рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЗрд▓рд░ рдХреЛ рдирд╣реАрдВ рдорд╛рдирддреЗ рд╣реИрдВред Developer.apple.com рдкрд░ рдореБрдЭреЗ Qt рдХреЗ рдмрд┐рдирд╛ рдпрд╣ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд╡рд░рдг рдорд┐рд▓рд╛ред рдЗрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкрд╣рд▓рд╛ рдкреНрд░рдпрд╛рд╕ рдмрд╣реБрдд рд╕реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ, рдЬрд┐рдирдХрд╛ рдЙрддреНрддрд░ developer.apple.com рдореЗрдВ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореБрдЭреЗ рдмрд╣реБрдд рдиреБрдХрд╕рд╛рди рд╣реБрдЖ рдФрд░ рдлрд┐рд░ рдореИрдВ AppleScript рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреИрдпрд╛рд░ рдиреБрд╕реНрдЦрд╛ рдкреЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реВрдВред



1. рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛рд░реНрдмрди рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:

# include <Carbon/Carbon.h>
      
      







2. рд╣рдо рджреЛ рд╕реНрдерд┐рд░ рдЪрд░ (рд╕реНрдерд┐рд░рд╛рдВрдХ) рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рджреЛ рдкреВрд░реНрдг AppleScript рдЯреЗрдХреНрд╕реНрдЯ рд╣реЛрддреЗ рд╣реИрдВ - рдПрдХ рдЕрдиреБрд▓рдЧреНрдирдХ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рджреВрд╕рд░рд╛ рджреЛ рдЕрдиреБрд▓рдЧреНрдирдХ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП:

 char sendMailScript_singAtt[] = "on send_email_message(subjectLine, messageText, fileAttachment)\n" " tell application \"Mail\"\n" " (* CREATE THE MESSAGE *)\n" " activate\n" " set newMessage to make new outgoing message at end of outgoing messages with properties {subject:subjectLine, content:messageText & return, visible:true}\n" " \n" " (* SPECIFY THE ATTACHMENT *)\n" " tell newMessage\n" " make new attachment with properties {file name:fileAttachment} at after last paragraph\n" " end tell\n" " (*set frontmost to true*)\n" " end tell\n" "end send_email_message"; char sendMailScript_doubAtt[] = "on send_email_message(subjectLine, messageText, fileAttachmentA, fileAttachmentB)\n" " tell application \"Mail\"\n" " (* CREATE THE MESSAGE *)\n" " activate\n" " set newMessage to make new outgoing message at end of outgoing messages with properties {subject:subjectLine, content:messageText & return, visible:true}\n" " \n" " (* SPECIFY THE ATTACHMENT *)\n" " tell newMessage\n" " make new attachment with properties {file name:fileAttachmentA} at after last paragraph\n" " make new attachment with properties {file name:fileAttachmentB} at after last paragraph\n" " end tell\n" " (*set frontmost to true*)\n" " end tell\n" "end send_email_message";
      
      







рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреЛ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рд╡рд┐рд╖рдп рдХреЗ рд▓рд┐рдП рдкрд╛рда, рд╕рдВрджреЗрд╢ рдХрд╛ рдореБрдЦреНрдп рдкрд╛рда рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдпрд╛ рджреЛ рдЕрдиреБрд▓рдЧреНрдирдХ рд▓реЗрддреЗ рд╣реИрдВред рднреЗрдЬрдиреЗ рдХреА рд╡рд┐рдзрд┐ рдЙрдкрд░реЛрдХреНрдд рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рд╕реЗ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рд▓реЗрдЦ рдкреБрд░рд╛рдирд╛ рд╣реИ, рдФрд░ рдРрдкреНрдкрд▓ рдиреЗ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЬрд╣рдордд рдирд╣реАрдВ рдЙрдард╛рдИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрд╡рдпрдВ рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕ рдкрд░ рдореИрдВ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ред рдЗрд╕рдХреЗ рдмрд┐рдирд╛, Mail.app рд╡рд┐рдВрдбреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЦреБрд▓рддреА рд╣реИред



3. рдирд╡реАрдирддрдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ - рдпреЗ рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рдкрде рдирд╣реАрдВ рд╣реИрдВ, рдпреЗ рддрдерд╛рдХрдерд┐рдд рдЙрдкрдирд╛рдо рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрде рд╕реЗ рдЗрди рд╕рдорд╛рди рдЙрдкрдирд╛рдореЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 GetAliasHandleForFile(QString fname, AliasHandle * ahandle) { FSRef fref; if(FSPathMakeRef((const UInt8 *)fname.toLocal8Bit().data(), &fref, NULL) == noErr) if(FSNewAlias(0, &fref, ahandle) == noErr && (*ahandle)) return true; return false; }
      
      





рдпрджрд┐ рдкреНрд░рдХрд╛рд░ QString рдХреЗ рддрд░реНрдХ рдореЗрдВ рдкрд╛рд░рд┐рдд рдлрд╝рд╛рдЗрд▓ рдкрде рд╕реЗ рдЙрдкрдирд╛рдо рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рд╕рд╣реА, рдЕрдиреНрдпрдерд╛ рдЧрд▓рдд рд╣реИ



4. AppleScript рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╛рда рд╕реЗ рдПрдХ рдИрд╡реЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдИрдореЗрд▓ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░рдХреЗ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред рдпрд╣рд╛рдБ рджреЛрдиреЛрдВ рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрдпреЛрдЬрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рджрд┐рдП рдЧрдП рд╣реИрдВ:



 OSStatus CreateEmailMessageEvent1(AppleEvent *theEvent, char* subjectLine, char* messageText, AliasHandle fileAttachment) { OSStatus err; ProcessSerialNumber PSN = {0, kCurrentProcess}; /* create the container list */ err = AEBuildAppleEvent( 'ascr', kASSubroutineEvent, typeProcessSerialNumber, (Ptr) &PSN, sizeof(PSN), kAutoGenerateReturnID, kAnyTransactionID, theEvent, NULL, "'----':[TEXT(@),TEXT(@),alis(@@)]," "'snam':TEXT(@)", subjectLine, messageText, fileAttachment, "send_email_message"); return err; } OSStatus CreateEmailMessageEvent2(AppleEvent *theEvent, char* subjectLine, char* messageText, AliasHandle fileAttachmentA, AliasHandle fileAttachmentB) { OSStatus err; ProcessSerialNumber PSN = {0, kCurrentProcess}; /* create the container list */ err = AEBuildAppleEvent( 'ascr', kASSubroutineEvent, typeProcessSerialNumber, (Ptr) &PSN, sizeof(PSN), kAutoGenerateReturnID, kAnyTransactionID, theEvent, NULL, "'----':[TEXT(@),TEXT(@),alis(@@),alis(@@)]," "'snam':TEXT(@)", subjectLine, messageText, fileAttachmentA, fileAttachmentB, "send_email_message"); return err; }
      
      





рдХрд╣реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП Apple рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рджреЗрдЦреЗрдВ (рдореИрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЧрдпрд╛, рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдкрд╛рдП рдЧрдП рд╡рд┐рднрд┐рдиреНрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдЦреАрдВрдЪ рд▓рд┐рдпрд╛)



5. рдЕрдм рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдИ рдЧрдИ рдШрдЯрдирд╛ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЙрд▓:



 OSStatus ExecuteAppleScriptEvent(const void* text, long textLength, AppleEvent *theEvent, AEDesc *resultData) { ComponentInstance theComponent; AEDesc scriptTextDesc; OSStatus err; OSAID contextID, resultID; /* set up locals to a known state */ theComponent = NULL; AECreateDesc(typeNull, NULL, 0, &scriptTextDesc); contextID = kOSANullScript; resultID = kOSANullScript; /* open the scripting component */ theComponent = OpenDefaultComponent(kOSAComponentType, typeAppleScript); if(theComponent != NULL) { /* put the script text into a Apple event descriptor record */ err = AECreateDesc(typeChar, text, textLength, &scriptTextDesc); if(err == noErr) { /* compile the script into a new context. The flag 'kOSAModeCompileIntoContext' is used when compiling a script containing a handler into a context. */ err = OSACompile(theComponent, &scriptTextDesc, kOSAModeCompileIntoContext, &contextID); if(err == noErr) { /* run the script */ err = OSAExecuteEvent( theComponent, theEvent, contextID, kOSAModeNull, &resultID); /* collect the results - if any */ if(resultData != NULL) { AECreateDesc(typeNull, NULL, 0, resultData); if(err == errOSAScriptError) OSAScriptError(theComponent, kOSAErrorMessage, typeChar, resultData); else if(err == noErr && resultID != kOSANullScript) OSADisplay(theComponent, resultID, typeChar, kOSAModeDisplayForHumans, resultData); } } } } else err = paramErr; AEDisposeDesc(&scriptTextDesc); if(contextID != kOSANullScript) OSADispose(theComponent, contextID); if(resultID != kOSANullScript) OSADispose(theComponent, resultID); if(theComponent != NULL) CloseComponent(theComponent); return err; }
      
      







рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдПрдИрдбреАрд╕реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╛рда рдФрд░ рдЙрд╕рдХреА рд▓рдВрдмрд╛рдИ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рджреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реИ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╕рдВрдХрд▓рди (OSACompile) рдФрд░ рд▓реЙрдиреНрдЪ (OSAExecuteEvent) рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдИрд╡реЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдХреЙрд▓ рд╡рд┐рд╡рд░рдг рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред



6. рдЕрдЪреНрдЫрд╛, рдЕрдм рд╣рдо рдЗрд╕реЗ рдПрдХ рд╕рд╛рде рд░рдЦ рд░рд╣реЗ рд╣реИрдВ:



 void SendSingleFileToEmail(QString subj, QString body, QString attPath) { AliasHandle ahandle; AppleEvent theEvent; if(!GetAliasHandleForFile(attPath, &ahandle)) return; if(CreateEmailMessageEvent1(&theEvent, subj.toLocal8Bit().data(), body.toLocal8Bit().data(), ahandle) == noErr) ExecuteAppleScriptEvent(sendMailScript_singAtt, strlen(sendMailScript_singAtt), &theEvent, NULL); } void SendDoubleFileToEmail(QString subj, QString body, QString attPathA, QString attPathB) { AliasHandle ahandleA, ahandleB; AppleEvent theEvent; if(!GetAliasHandleForFile(attPathA, &ahandleA) || !GetAliasHandleForFile(attPathB, &ahandleB)) return; if(CreateEmailMessageEvent2(&theEvent, subj.toLocal8Bit().data(), body.toLocal8Bit().data(), ahandleA, ahandleB) == noErr) ExecuteAppleScriptEvent(sendMailScript_doubAtt, strlen(sendMailScript_doubAtt), &theEvent, NULL); }
      
      







рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдХрд╛рд░реНрдп рд╣реИрдВ, рдХреНрд░рдорд╢рдГ рдПрдХ рдЕрдиреБрд▓рдЧреНрдирдХ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рджреЛ рдЕрдиреБрд▓рдЧреНрдирдХ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдПред рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреЛрдб рдлрд╛рдЗрд▓реЗрдВ рдирд╣реАрдВ рднреЗрдЬрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдирдпрд╛ рд╕рдВрджреЗрд╢ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рдВрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЦреЛрд▓рддрд╛ рд╣реИ, рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХрд╛ рдкрддрд╛ рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рд░рджреНрдж рдХрд░рддрд╛ рд╣реИред

рдЦреИрд░, рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБред рдпрджрд┐ рдЖрдк рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдореЛрдб (рдпрд╛рдиреА рд░реВрдЯ) рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ AppleScript рдирд╣реАрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдЬ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рд╣реАред



All Articles