发送电子邮件-Cocoa

发送电子邮件-Cocoa,cocoa,macos,email,Cocoa,Macos,Email,我怎样才能使用Cocoa发送电子邮件?我将使用哪个框架,以及如何使用它。您可以使用打开默认框架,也可以使用打开默认框架。这应该让您开始了。对于Growl1.2,我写道,MailMe显示使用NSTask运行 我这样做很大程度上是出于对Cocoa的其他邮件框架的不满,这些框架中的大多数还支持接收邮件,这对于像MailMe这样的输出来说是不必要的。请查看: 我已经好几年没看了,但是,当我在苹果公司工作时,我主张将其纳入操作系统,以取代在下一次/Apple过渡中丢失的邮件功能。苹果的开发者连接有一个名

我怎样才能使用Cocoa发送电子邮件?我将使用哪个框架,以及如何使用它。

您可以使用打开默认框架,也可以使用打开默认框架。这应该让您开始了。

对于Growl1.2,我写道,MailMe显示使用NSTask运行

我这样做很大程度上是出于对Cocoa的其他邮件框架的不满,这些框架中的大多数还支持接收邮件,这对于像MailMe这样的输出来说是不必要的。

请查看:


我已经好几年没看了,但是,当我在苹果公司工作时,我主张将其纳入操作系统,以取代在下一次/Apple过渡中丢失的邮件功能。

苹果的开发者连接有一个名为SBSendEmail的示例项目,该项目演示了如何使用脚本桥通过脚本向邮件应用发送电子邮件


您可以下载并在XCode中运行,以了解其工作原理。您特别感兴趣的是

中的sendmailmessage:method,我认为使用Apple脚本是最简单的解决方案。当用户在邮件中设置了帐户时,我使用它

苹果脚本:

附件是包含文件路径的stings数组

如果您希望在发送前弹出消息,请将“设置可见为真”

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

缺点:用户需要在Mail下拥有有效帐户

Python脚本(如果邮件下没有用户帐户): 您还可以使用python脚本发送消息。 缺点:用户必须输入SMTP详细信息,除非你从邮件中获取这些信息(但你可以使用上面的apple脚本),或者你必须在你的应用程序中硬编码可靠的SMTP中继(你可以设置gmail帐户并使用它,但是如果你的应用程序发送太多电子邮件,谷歌可以删除你的帐户(垃圾邮件))
我使用以下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()
我把它称为使用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 = @"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 < [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;
        }
    }
-(bool)发送电子邮件:(NSTask*)任务到地址:(NSString*)到主题地址:(NSString*)主题附件:(NSArray*)附件{
NSLog(@“正在尝试发送电子邮件”);
//设置包含附件的参数
NSString*username=@“my.gmail”。account@gmail.com";
NSString*hostname=@“smtp.gmail.com”;
NSString*端口=@“587”;
NSString*fromAddress=@“my.gmail”。account@gmail.com";  
NSString*bodyText=@“正文\n\r”;
NSMutableArray*参数=[NSMutableArray arrayWithObjects:
程序路径,
用户名,
主机名,
港口,
fromAddress,
致辞,
主题,,
正文,
零];
对于(int i=0;i<[附件计数];i++){
[arguments addObject:[attachments objectAtIndex:i]];
}
NSData*passwordData=[@“MygMail密码”数据使用编码:NSUTF8StringEncoding];
NSDictionary*环境=[NSDictionary Dictionary WithObjectsAndKeys:
@“,@”PYTHONPATH“,
@“/bin:/usr/bin:/usr/local/bin”、@“路径”,
零];
[任务集环境:环境];
[task setLaunchPath:@/usr/bin/python];
[任务集参数:参数];
NSPipe*标准管道=[NSPipe pipe];
[任务设置标准输入:标准管道];
[任务启动];
[[stdinPipe fileHandleForReading]closeFile];
NSFileHandle*stdinFH=[stdinPipe fileHandleForWriting];
[stdinFH writeData:passwordData];
[stdinFH writeData:[@“\n”数据使用编码:NSUTF8StringEncoding];
[stdinFH writeData:[@“Description”数据使用编码:NSUTF8StringEncoding];
[stdinFH closeFile];
[task waitUntilExit];
如果([task terminationStatus]==0){
NSLog(@“消息已成功发送”);
返回YES;
}否则{
NSLog(@“未发送消息”);
返回否;
}
}

我希望这有帮助

他们两个都不适合我。谁能给我举个例子吗?很抱歉,我对这一点很陌生?你是为iPhone还是桌面开发的?我是用Xcode 3.2在桌面上开发的。如果你是为桌面开发的,那么这两个链接如果你试用的话效率很高。另外请注意,它们都包含可以复制和粘贴的代码,并且可以运行以获得你想要的内容,它们会起作用的。请注意,沙盒应用程序不允许使用脚本桥。这不是真的;您可以使用具有正确权限的脚本桥我尝试了您的代码,但问题是当您启动它时,它会说programPath未定义。现在我确实使用NSString将它设置为程序的路径,但仍然不起作用。。。我应该怎么做???它是脚本的路径,定义为:programPath=[[[NSBundle bundleForClass:[self class]]pathForResource:@“emailSender”,类型:@“py”]copy];我在我的项目中添加了名为emailSender.py的python资源代码。还编写了代码NSBundle*programPath=[[NSBundle bundleForClass:[self class]]pathForResource:@“emailSender”,类型为:@“py”]copy];所有错误都已消失,但未发送电子邮件。控制台显示这些细节。请帮忙!!!2012-02-15 14:42:39.897 mailSend[5582:a0f]正在尝试发送电子邮件文件“/Users/myMac/mailSend/build/Debug/mailSend.app/Contents/Resources/emailSender.py”,第1行{\rtf1\ansi\ansicpg1252\COOARTF1038\cocoasubrtf350^语法错误:换行符2012-02-15 14:42:39.972 mailSend[5582:a0f]消息未发送2012-02-15 14:42:39.974 mailSend[5582:a0f]邮件未发送第二个解决方案对我来说效果很好,所以谢谢!我唯一关心的问题是