2009-09-08 43 views

Respuesta

8

Apple's Developer Connection tiene un proyecto de ejemplo llamado SBSendEmail que muestra cómo usar un Scripting Bridge para enviar correos electrónicos a través de scripts a la aplicación de correo.

Puede descargar el whole project y ejecutarlo en XCode para ver cómo funciona. De particular interés para usted será el método sendEmailMessage: Controller.m

+5

Tenga en cuenta que Scripting Bridge no está permitido con la aplicación sandbox. – jemeshsu

+0

Esto no es verdad; puede usar Scripting Bridge con las autorizaciones correctas –

4

Puede utilizar la apertura del valor predeterminado mail client o puede usar un framework. Esto debería ayudarte a comenzar.

+0

Ambos no funcionan para mí. ¿Alguien puede darme un ejemplo? Lo siento pero soy muy nuevo en esto? – lab12

+0

¿Está desarrollando para el iPhone o el escritorio? – Garrett

+0

Estoy desarrollando en el escritorio con Xcode 3.2 – lab12

2

Para Growl 1.2, escribí a Python-based mail-sending program, que la pantalla de MailMe ejecuta con NSTask.

Lo hice en gran parte por la insatisfacción con los otros marcos de correo para Cocoa, la mayoría de los cuales también admiten la recepción de correo, lo cual es innecesario para algo solo como MailMe.

15

Creo que el uso de un script de Apple es la solución más simple. Lo uso cuando el usuario tiene una cuenta configurada en Mail.

AppleScript:

adjuntos es una serie de picaduras que contienen las rutas de archivos.

"set visible como true" si desea que el mensaje para que aparezca antes de enviar

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

}

Desventaja: los usuarios necesitan tener cuentas válidas en Correo.

Script de Python (si no hay cuenta de usuario en el correo): También puede usar un script de python para enviar un mensaje. Desventaja: los usuarios tienen que ingresar los detalles de SMTP a menos que los agarre de Correo (pero luego puede usar el script de Apple anterior), o tiene que tener un reenvío de SMTP confiable codificado en su aplicación (puede configurar una cuenta de Gmail y usar para ese propósito, sin embargo, si sus aplicaciones envían demasiados mensajes de correo electrónico de Google pueden eliminar su cuenta (SPAM))
yo uso este script en Python:

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

Y me llaman formar este método para enviar un correo electrónico utilizando una cuenta de Gmail

- (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; 
     } 
    } 

espero que ayude

+0

intenté con su código pero el problema es que cuando lo ejecuta, dice que programPath no está definido. Ahora lo configuré en el camino de mi programa usando NSString pero todavía no funcionó ... ¿qué debería hacer? –

+0

Es la ruta del script y se define como: programPath = [[[NSBundle bundleForClass: [self class]] pathForResource: @ "emailSender" ofType: @ "py"] copy]; – Tibidabo

+0

agregué el código de recurso de python en mi proyecto con el nombre emailSender.py. También escribió el código \t NSBundle * programPath = [[[NSBundle bundleForClass: [self class]] pathForResource: @ "emailSender" ofType: @ "py"] copy]; Todos los errores desaparecieron pero no se envió ningún correo electrónico. La consola muestra estos detalles. POR FAVOR AYUDA !!! –

Cuestiones relacionadas