Objective c 使用Mail.app从Cocoa发送HTML邮件

Objective c 使用Mail.app从Cocoa发送HTML邮件,objective-c,applescript,scripting-bridge,Objective C,Applescript,Scripting Bridge,我正在尝试从Cocoa应用程序通过Mail.app发送html电子邮件。我想在Mail.app中打开新邮件,包括主题、收件人,并添加带有链接和其他内容的HTML正文。但是找不到这样做的方法。 我已经尝试过编写脚本桥,但MailOutgoingMessage类没有内容类型,我可以以明文形式添加内容 尝试了AppleScript,类似以下内容: set htmlContent to read "/Path/index.html" set recipientList to {"mail@mail.co

我正在尝试从Cocoa应用程序通过Mail.app发送html电子邮件。我想在Mail.app中打开新邮件,包括主题、收件人,并添加带有链接和其他内容的HTML正文。但是找不到这样做的方法。 我已经尝试过编写脚本桥,但MailOutgoingMessage类没有内容类型,我可以以明文形式添加内容

尝试了AppleScript,类似以下内容:

set htmlContent to read "/Path/index.html"
set recipientList to {"mail@mail.com"}

tell application "Mail"
    set newMessage to make new outgoing message with properties {subject:"qwerty", visible:true}
    tell newMessage
        make new to recipient at end of to recipients with properties {address:"mail@s.com"}
            set html content to htmlContent
        --send
    end tell
end tell

这段代码使用html发送电子邮件,仅当我正在更改--send to send时。但在用户做了一些更改后,我需要稍后发送这封信。

不清楚您在寻找什么,但我会尽力提供帮助

如果您对
send
留下评论,则邮件应该已经在Mail.app中打开,等待进一步编辑和发送

通过添加行
save newMessage
,它将被保存到草稿文件夹中。用户可以随时打开它并继续编辑。如果您希望实际发送应用程序的草稿,请使用:

set sendMessage to first message of drafts mailbox
send sendMessage

祝你好运

我没有看到您需要在发送前编辑邮件,因此我之前的回答是错误的。这次应该是正确的

基本上

  • 获取预格式化的RTF文件
  • 渲染并将其放入剪贴板
  • 创建一条新消息
  • 填写字段
  • 将焦点移动到消息正文
  • 粘贴格式化的剪贴板
代码如下:

set textSubject to "HTML Test"
set toAddress to "john.doe@gmail.com"
set toName to "John Doe"

tell application "Mail"
    do shell script "cat ~/Documents/RTF\\ File.rtf | textutil -stdin -stdout -convert rtf | pbcopy"

    set refMessage to make new outgoing message with properties {name:toName, address:toAddress, subject:textSubject, visible:true}
    tell refMessage
        make new to recipient at end of to recipients with properties {name:toName, address:toAddress}
    end tell
end tell

tell application "System Events"
    tell application process "Mail"
        set frontmost to true
        set value of attribute "AXFocused" of scroll area 4 of window textSubject to true
    end tell
    keystroke "v" using {command down}
end tell
同样,这对雪豹很有效


希望这有帮助。

重述问题:使用AppleScript创建包含HTML内容的邮件进行交互式编辑不起作用(从OS X 10.9.2开始):新邮件表单出现了一个空正文

这应该被认为是一个错误,我鼓励大家告诉苹果一个警告:
html内容
消息
类属性没有在
邮件.sdef
邮件.app
的AppleScript字典中定义,因此分配html可能不受官方支持

有一个解决方案,但它并不漂亮:

  • 以不可见的方式创建消息
  • 另存为草稿
  • 打开草稿消息,此时将显示HTML内容
强有力地实现这一点具有挑战性,因为需要几种变通方法。不过,以下代码尽了最大努力:

注意:由于代码使用GUI脚本,因此运行此代码的应用程序(例如,
AppleScript Editor
,或者,如果通过
osascript
Terminal.app
)必须启用辅助设备的访问功能(通过
System Preferences>Security&Privacy>Accessibility

#示例值;使用“readsomefile”从文件中读取HTML。
将htmlContent设置为“你好,世界。

” 将recipientList设置为{”person1@example.com", "person2@example.com"} 将msgSubject设置为“qwerty” 告诉应用程序“邮件” #创建消息*不可见*,并指定主题文本 #以及HTML内容。 设置newMessage以生成具有属性的新传出消息 {可见:false,主题:msgSubject,html内容:htmlContent} #添加收件人。 # !! 考虑到下面的解决方法,这目前是毫无意义的。 告诉新消息 使用recipientList中的toRcpt重复此操作 在属性为{address:toRcpt}的收件人的末尾向收件人新建 结束重复 结束语 #保存当前草稿邮件数。 将draftCountBefore设置为对草稿邮箱的邮件计数 # !! 将新邮件另存为*草稿*-这是必需的 #使HTML内容实际显示在消息中 #当我们稍后以交互方式打开邮件时,返回正文。 保存新消息 # !! 遗憾的是,新消息需要一段时间 # !! 要显示在草稿邮箱中,我们必须等待。 将newMessageAsDraft设置为缺少值 在1到30之间重复i#在n*0.1秒后放弃。 将draftCountNow设置为(计算草稿邮箱的邮件数) 如果draftCountNow>draftCountBefore,则 将newMessageAsDraft设置为草稿邮箱的邮件1 退出重复 如果结束 延迟0.1#睡一会儿 结束重复 #如果草稿从未出现,则中止。 如果newMessageAsDraft缺少值,则出现错误“新邮件在超时期间未能在草稿邮箱中显示。” #以*草稿*消息的形式打开新消息-这确保 #HTML内容在消息正文中显示并可编辑。 # !! 我找到的唯一解决方案是使用“重定向”,不幸的是, # !! *清除收件人*。 # !! 但是,它确实确保在发送邮件后删除草稿。 在打开窗口时重定向newMessageAsDraft #激活Mail.app,从而激活草稿邮件窗口。 激活 # !! 由于接受者已被消灭,我们需要 # !! 再次添加它们-不幸的是,我们唯一能做的就是 # !! *GUI脚本*-模拟菜单命令的调用或 # !! 发送击键。 告诉应用程序“系统事件” #我们必须确保目标窗口在启动之前处于活动状态 #我们可以在上面执行GUI脚本。 将newMessageWindow设置为缺少值 在1到30之间重复i#在n*0.1秒后放弃。 tell(其最前面为true的第一个进程的第一个窗口,其子进程不是“AXFloatingWindow”) 如果名称为msgSubject,则 将newMessageWindow设置为它 退出重复 如果结束 结束语 延迟0.1#睡一会儿 结束重复 如果newMessageWindow缺少值,则出现错误“新消息未能在超时期间成为活动窗口” #对于pasti,将收件人列表转换为逗号分隔的*字符串*