Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>UPDATE: As others suggested, from <strong>10.9</strong> you can use <strong>NSSharingService</strong> that supports attachments as well!</p> <p>Swift example:</p> <pre><code> let emailImage = NSImage.init(named: "ImageToShare")! let emailBody = "Email Body" let emailService = NSSharingService.init(named: NSSharingServiceNameComposeEmail)! emailService.recipients = ["support@myapp.com"] emailService.subject = "App Support" if emailService.canPerform(withItems: [emailBody,emailImage]) { // email can be sent emailService.perform(withItems: [emailBody,emailImage]) } else { // email cannot be sent, perhaps no email client is set up // Show alert with email address and instructions } </code></pre> <p><strike> <strong>OLD UPDATE</strong>: My old answers worked fine until I had to sandbox my apps for the App Store.~~ Since then the only solution I found was using simply a mailto: link.</p> <pre><code>- (void)sendEmailWithMail:(NSString *) senderAddress Address:(NSString *) toAddress Subject:(NSString *) subject Body:(NSString *) bodyText { NSString *mailtoAddress = [[NSString stringWithFormat:@"mailto:%@?Subject=%@&amp;body=%@",toAddress,subject,bodyText] stringByReplacingOccurrencesOfString:@" " withString:@"%20"]; [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:mailtoAddress]]; NSLog(@"Mailto:%@",mailtoAddress); } </code></pre> <p>Disadvantage: No attachment! If you know how to make it work on Mac let me know!</p> <p><strong>OLD ANSWER:</strong> You can Apple Script, Apple's scripting bridge framework (Solution 2) or a Python script (Solution 3) </p> <p>Solution 1 (Apple script):</p> <p>attachments is an array of stings containing file paths </p> <pre><code>- (void)sendEmailWithMail:(NSString *) toAddress withSubject:(NSString *) subject Attachments:(NSArray *) attachments { NSString *bodyText = @"Your body text \n\r"; NSString *emailString = [NSString stringWithFormat:@"\ tell application \"Mail\"\n\ set newMessage to make new outgoing message with properties {subject:\"%@\", content:\"%@\" &amp; return} \n\ tell newMessage\n\ set visible to false\n\ set sender to \"%@\"\n\ make new to recipient at end of to recipients with properties {name:\"%@\", address:\"%@\"}\n\ tell content\n\ ",subject, bodyText, @"McAlarm alert", @"McAlarm User", toAddress ]; //add attachments to script for (NSString *alarmPhoto in attachments) { emailString = [emailString stringByAppendingFormat:@"make new attachment with properties {file name:\"%@\"} at after the last paragraph\n\ ",alarmPhoto]; } //finish script emailString = [emailString stringByAppendingFormat:@"\ end tell\n\ send\n\ end tell\n\ end tell"]; //NSLog(@"%@",emailString); NSAppleScript *emailScript = [[NSAppleScript alloc] initWithSource:emailString]; [emailScript executeAndReturnError:nil]; [emailScript release]; /* send the message */ NSLog(@"Message passed to Mail"); </code></pre> <p>}</p> <p>Solution 2 (Apple scriptingbridge framework): You can use Apple's scriptingbridge framework to use Mail to send your message<br> <a href="http://developer.apple.com/library/mac/#samplecode/SBSendEmail/Introduction/Intro.html" rel="nofollow noreferrer" title="Apple&#39;s example code">Apple's exmaple link</a> it's pretty straightforward, you only need to fiddle with adding a rule and Mail.app to your project. Read Readme.txt carefully.</p> <p>Change "emailMessage.visible = YES;" to "emailMessage.visible = NO;" so it sends it in the background.</p> <p>Disadvantage: users need to have valid accounts under Mail.</p> <p>Solution 3 (Python Script (no user account): You can also use a python script to send a message. Disadvantage: users have to enter SMTP details unless you grab them from Mail (but then you can use Solution 1 above directly), or you have to have a reliable SMTP relay hardcoded in your app (you can set up a gmail account and use it for that purpose, however if your apps send too many emails google can delete your account (SPAM))<br> I use this python script:</p> <pre><code>import sys import smtplib import os import optparse from email.MIMEMultipart import MIMEMultipart from email.MIMEBase import MIMEBase from email.MIMEText import MIMEText from email.Utils import COMMASPACE, formatdate from email import Encoders username = sys.argv[1] hostname = sys.argv[2] port = sys.argv[3] from_addr = sys.argv[4] to_addr = sys.argv[5] subject = sys.argv[6] text = sys.argv[7] password = getpass.getpass() if sys.stdin.isatty() else sys.stdin.readline().rstrip('\n') message = MIMEMultipart() message['From'] = from_addr message['To'] = to_addr message['Date'] = formatdate(localtime=True) message['Subject'] = subject #message['Cc'] = COMMASPACE.join(cc) message.attach(MIMEText(text)) i = 0 for file in sys.argv: if i &gt; 7: part = MIMEBase('application', 'octet-stream') part.set_payload(open(file, 'rb').read()) Encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(file)) message.attach(part) i = i + 1 smtp = smtplib.SMTP(hostname,port) smtp.starttls() smtp.login(username, password) del password smtp.sendmail(from_addr, to_addr, message.as_string()) smtp.close() </code></pre> <p>And I call it form this method to send an email using a gmail account</p> <pre><code>- (bool) sendEmail:(NSTask *) task toAddress:(NSString *) toAddress withSubject:(NSString *) subject Attachments:(NSArray *) attachments { NSLog(@"Trying to send email message"); //set arguments including attachments NSString *username = @"my.gmail.account@gmail.com"; NSString *hostname = @"smtp.gmail.com"; NSString *port = @"587"; NSString *fromAddress = @"my.gmail.account@gmail.com"; NSString *bodyText = @"Body text \n\r"; NSMutableArray *arguments = [NSMutableArray arrayWithObjects: programPath, username, hostname, port, fromAddress, toAddress, subject, bodyText, nil]; for (int i = 0; i &lt; [attachments count]; i++) { [arguments addObject:[attachments objectAtIndex:i]]; } NSData *passwordData = [@"myGmailPassword" dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *environment = [NSDictionary dictionaryWithObjectsAndKeys: @"", @"PYTHONPATH", @"/bin:/usr/bin:/usr/local/bin", @"PATH", nil]; [task setEnvironment:environment]; [task setLaunchPath:@"/usr/bin/python"]; [task setArguments:arguments]; NSPipe *stdinPipe = [NSPipe pipe]; [task setStandardInput:stdinPipe]; [task launch]; [[stdinPipe fileHandleForReading] closeFile]; NSFileHandle *stdinFH = [stdinPipe fileHandleForWriting]; [stdinFH writeData:passwordData]; [stdinFH writeData:[@"\n" dataUsingEncoding:NSUTF8StringEncoding]]; [stdinFH writeData:[@"Description" dataUsingEncoding:NSUTF8StringEncoding]]; [stdinFH closeFile]; [task waitUntilExit]; if ([task terminationStatus] == 0) { NSLog(@"Message successfully sent"); return YES; } else { NSLog(@"Message not sent"); return NO; } } </code></pre> <p>I hope it helps</strike></p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload