Skip to main content
 首页 » 编程设计

python之Apple Mail.app 使用插件设置 HTML 签名

2025年05月04日23zdz8207

我用 Python 创建了一个 Mail.app 插件,通过调配 ComposeBackEnd 中的 setSignature: 方法来设置从远程服务器提取的自定义签名。根据下面的类转储,我可以使用 setSignatureContents: 设置纯文本签名,这是有效的。

@interface Signature : NSObject <NSCopying> 
{ 
    NSString *_uniqueId; 
    NSString *_name; 
    NSData *_webArchiveData; 
    BOOL _isRich; 
    BOOL _isSavedAsRich; 
    BOOL _isDirty; 
    MFSyncedFile *_syncedFile; 
} 
 
- (id)syncedFile; 
- (id)signaturePath; 
- (unsigned long long)hash; 
- (BOOL)isEqual:(id)arg1; 
- (BOOL)isRich; 
- (void)setIsRich:(BOOL)arg1; 
- (void)setWebArchive:(id)arg1; 
- (id)webArchive; 
- (id)webArchiveData; 
..... 
- (void)setSignatureContents:(id)arg1; 
- (id)signatureContents; 
- (void)setSignatureName:(id)arg1; 
- (id)signatureName; 
 
@end 

但是,当我尝试使用 setWebArchive 设置 HTML 签名时:(应该采用 NSData 对象):

signature.setWebArchive_(NSData.dataWithContentsOfURL_(NSURL.URLWithString_('http://...'))) 

我收到以下错误:

11/7/12 11:07:38.858 AM Mail[8820]: -[NSConcreteData data]: unrecognized selector sent to instance 0x7ffc2386bc00 

(远程文件已经是正确的格式)

有什么办法可以实现吗?提前致谢。


编辑 - 试过这个(返回应该响应 -[data] 的 WebArchive 对象):

wds = WebDataSource.alloc().initWithRequest_(NSURLRequest.requestWithURL_(NSURL.URLWithString_('http://...'))) 
        webarchive = wds.webArchive 
        signature.setWebArchive_(webarchive) 

结果:

11/7/12 3:26:59.173 PM Mail[16814]: An uncaught exception was raised 
11/7/12 3:26:59.173 PM Mail[16814]: Class OC_PythonObject: no such selector: data 

请您参考如下方法:

However when I attempt to set an HTML signature using setWebArchive: (which should take an NSData object)… I get the following error:

11/7/12 11:07:38.858 AM Mail[8820]: -[NSConcreteData data]: unrecognized selector 

此错误告诉您 -[setWebArchive:] 正试图在您的 NSData 对象上调用 -[data]。由于 -[NSData data] 不存在,您会得到无法识别的选择器异常。

显然它不需要 NSData,它需要通过返回 NSData 来响应 -[data] 的东西。

EDIT - tried this (returns WebArchive object which should respond to -[data]):

wds = WebDataSource.alloc().initWithRequest_(NSURLRequest.requestWithURL_(NSURL.URLWithString_('http://...'))) 
webarchive = wds.webArchive 
signature.setWebArchive_(webarchive) 

等一下……您还没有显示这个类的类转储,但另一个类有一个方法 -[webArchive],而不是一个正确的 webArchive。因此,如果它们完全一致,那么这个也可能有一个方法,而不是一个属性。

如果是这样,这意味着 wds.webArchive 不会是一个 WebArchive 对象,它将是一个包装对象,大致代表 Python 的 ObjC 等价物绑定(bind)方法。在那个东西上调用 -[data] 几乎肯定会失败。

11/7/12 3:26:59.173 PM Mail[16814]: Class OC_PythonObject: no such selector: data 

如果您只是将其更改为 wds.webArchive(),那应该可以解决问题。

最后,值得在这里进行一些调试打印。如果你认为你有一个 WebArchive 并且 -[WebArchive data] 返回一个 NSData,你可以很容易地测试它:

print webArchive 
print webArchive.data()