2011-03-28 17 views
12

मैं किसी भी ईमेल क्लाइंट का उपयोग किये बिना कोको ऐप से एक ईमेल कैसे भेज सकता हूं? मेरे पास NSURL है लेकिन यह एक ईमेल क्लाइंट खोलता है। मैं इस घटना के बिना ईमेल भेजना चाहता हूं।कोको से ईमेल भेजें

+0

संभव डुप्लिकेट = पुराना उपयोग करना चाहिए। मेल ढांचे को भेजना और प्राप्त करना] (http://stackoverflow.com/questions/3567251/pantomime-outdated-sending-and-receiving-mail-framework) –

+0

[ईमेल भेजें - कोको] के संभावित डुप्लिकेट (http: // stackoverflow। कॉम/प्रश्न/139622 9/सेंड-ईमेल-कोको) –

उत्तर

24

अद्यतन: जैसा कि दूसरों 10.9 से, सुझाव दिया तुम भी संलग्नक का समर्थन करता है कि NSSharingService उपयोग कर सकते हैं!

स्विफ्ट उदाहरण:

let emailImage   = NSImage.init(named: "ImageToShare")! 
    let emailBody   = "Email Body" 
    let emailService  = NSSharingService.init(named: NSSharingServiceNameComposeEmail)! 
    emailService.recipients = ["[email protected]"] 
    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 

    } 

पुराने अद्यतन:। मेरा पुराना जवाब ठीक काम किया जब तक मैं App स्टोर के लिए मेरी क्षुधा सैंडबॉक्स में था ~~ तो एकमात्र समाधान मैंने पाया के बाद से उपयोग कर रहा था बस एक mailto: लिंक।

- (void)sendEmailWithMail:(NSString *) senderAddress Address:(NSString *) toAddress Subject:(NSString *) subject Body:(NSString *) bodyText { 
    NSString *mailtoAddress = [[NSString stringWithFormat:@"mailto:%@?Subject=%@&body=%@",toAddress,subject,bodyText] stringByReplacingOccurrencesOfString:@" " withString:@"%20"]; 
    [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:mailtoAddress]]; 
    NSLog(@"Mailto:%@",mailtoAddress); 
} 

नुकसान: कोई अनुलग्नक नहीं! यदि आप जानते हैं कि इसे मैक पर कैसे काम करना है, तो मुझे बताएं!

पुराने उत्तर: आप एप्पल स्क्रिप्ट, एप्पल के पटकथा पुल फ्रेमवर्क (समाधान 2) या Python स्क्रिप्ट (समाधान 3)

समाधान 1 (एप्पल लिपि) कर सकते हैं:

संलग्नक एक सरणी है फ़ाइल पथ युक्त डंक की

- (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:\"%@\" & 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"); 

}

Solu टयन 2 (ऐप्पल स्क्रिप्टिंगब्रिज फ्रेमवर्क): आप अपना संदेश भेजने के लिए मेल का उपयोग करने के लिए ऐप्पल के स्क्रिप्टिंगब्रिज फ्रेमवर्क का उपयोग कर सकते हैं
Apple's exmaple link यह बहुत सरल है, आपको केवल अपनी परियोजना में नियम और Mail.app जोड़ने के साथ परेशानी की आवश्यकता है। Readme.txt ध्यान से पढ़ें।

"ईमेल मैसेज। विज़िबल = हाँ;" बदलें "emailMessage.visible = नहीं;" तो यह पृष्ठभूमि में भेजता है।

नुकसान: उपयोगकर्ताओं को मेल के तहत वैध खाते होने की आवश्यकता है।

समाधान 3 (पायथन स्क्रिप्ट (कोई उपयोगकर्ता खाता नहीं): आप संदेश भेजने के लिए एक पायथन स्क्रिप्ट का भी उपयोग कर सकते हैं। नुकसान: उपयोगकर्ताओं को एसएमटीपी विवरण दर्ज करना होगा जब तक कि आप उन्हें मेल से नहीं ले जाते (लेकिन फिर आप सीधे ऊपर समाधान 1 का उपयोग कर सकते हैं), या आपके पास अपने ऐप में एक विश्वसनीय एसएमटीपी रिले हार्डकोड होना चाहिए (आप एक जीमेल खाता और उपयोग कर सकते हैं

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 > 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() 

और मैं इसे कहते इस पद्धति के रूप में एक का उपयोग कर एक ईमेल भेजने के: यह उस उद्देश्य के लिए, लेकिन यदि आपकी ऐप्लिकेशन भी कई ईमेल भेजने गूगल आपके अकाउंट (स्पैम))
मैं इस अजगर स्क्रिप्ट का उपयोग हटा सकते हैं जीमेल खाता

- (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 = @"[email protected]"; 
     NSString *hostname = @"smtp.gmail.com"; 
     NSString *port = @"587"; 
     NSString *fromAddress = @"[email protected]"; 
     NSString *bodyText = @"Body text \n\r"; 
     NSMutableArray *arguments = [NSMutableArray arrayWithObjects: 
            programPath, 
            username, 
            hostname, 
            port, 
            fromAddress, 
            toAddress, 
            subject, 
            bodyText, 
            nil]; 
     for (int i = 0; i < [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; 
     } 
    } 

मुझे आशा है कि यह में मदद करेगा

+1

स्क्रिप्टिंग ब्रिज ... अगर मैं थंडरबर्ड का उपयोग करता हूं तो क्या होगा? या आउटलुक? या कुछ और? –

+0

फिर आप पर्ल स्क्रिप्ट का उपयोग कर सकते हैं। मेल सबसे लोकप्रिय ईमेल क्लाइंट है, यदि यह मौजूद नहीं है तो आप उपयोगकर्ता से अपने एसएमटीपी विवरण दर्ज करने के लिए कह सकते हैं या आप अपना हार्डकोड कर सकते हैं। – Tibidabo

+0

आपकी ** पर्ल ** स्क्रिप्ट की पहली पंक्ति #!/Usr/bin/env python ??? :-P –

3

यह post सहायता चाहिए - यह example code भी उद्धृत करता है।

तुम भी पृष्ठभूमि में संदेश भेजने के लिए Controller.m में लाइन 114 को बदलने की जरूरत:

emailMessage.visible = NO; 
+0

मैंने पहले उस पोस्ट पर एक नज़र डाली है, लेकिन जब आप ईमेल को समाप्त करते हैं तो यह मेल एप्लिकेशन खोलता है, जिसे मैं वास्तव में नहीं चाहता हूं, बस ईमेल भेजना चाहता हूं, मूल रूप से मैं अपना खुद का मेल एप्लीकेशन बनाना चाहता हूं :), लेकिन उत्तर के लिए धन्यवाद: डी –

26

उन प्रतिक्रिया पुराना मैक ओएस एक्स 10.8 कर रहे हैं और अधिक आप NSSharingService

[मूकाभिनय की
NSArray *[email protected][body,imageA,imageB]; 
NSSharingService *service = [NSSharingService sharingServiceNamed:NSSharingServiceNameComposeEmail]; 
service.delegate = self; 
[email protected][@"[email protected]"]; 
service.subject= [ NSString stringWithFormat:@"%@ %@",NSLocalizedString(@"SLYRunner console",nil),currentDate]; 
[service performWithItems:shareItems]; 

The sharing service documentation page

+1

यह स्वीकार्य उत्तर होना चाहिए। ध्यान रखें कि यदि उपयोगकर्ता Outlook का उपयोग कर रहा है, तो अनुलग्नक संलग्न नहीं होंगे। – fzwo

+0

NSSharingService के साथ एक और समस्या यह है कि आप संगीतकार के ईमेल बॉडी को पहले से सेट नहीं कर सकते हैं (यदि ऐसा कुछ है जो आपको करने की ज़रूरत है)। –

+3

@ZS यह सही नहीं है। प्रदर्शन देखें Iithems: संदेश निकाय सेट करने के लिए। – insys

संबंधित मुद्दे