2011-06-06 298 views
0

我是使用Exchangeclient类的EWS的新手。用附件发送电子邮件的问题

我正在寻找一个简单的例子,如何发送附件的电子邮件。我找到了关于如何发送电子邮件但不发送带附件的电子邮件的示例。

这是我的脚本:

$exchangeclient = new Exchangeclient(); 
$exchangeclient->init($username, $password, NULL, 'ews/Services.wsdl'); 
$exchangeclient->send_message($mail_from, $subject, $body, 'HTML', true, true); 

我有以下的SOAP请求。

$CreateItem->MessageDisposition = "SendAndSaveCopy"; 
    $CreateItem->SavedItemFolderId->DistinguishedFolderId->Id = "sentitems"; 

    $CreateItem->Items->Message->ItemClass = "IPM.Note"; 
    $CreateItem->Items->Message->Subject = $subject; 
    $CreateItem->Items->Message->Body->BodyType = $bodytype; 
    $CreateItem->Items->Message->Body->_ = $content; 
    $CreateItem->Items->Message->ToRecipients->Mailbox->EmailAddress = $to; 
$CreateItem->Items->Message->Attachments->FileAttachment->AttachmentId = $attach['AttachmentId']; 
    $CreateItem->Items->Message->Attachments->FileAttachment->Name = $attach['Name']; 
    $CreateItem->Items->Message->Attachments->FileAttachment->ContentType = $attach['ContentType']; 
    $CreateItem->Items->Message->Attachments->FileAttachment->ContentId = $attach['AttachmentId']; 
    $CreateItem->Items->Message->Attachments->FileAttachment->Content = $attach['ContentId']; 
    $CreateItem->Items->Message->Attachments->FileAttachment->Size = $attach['Size']; 

我得到的错误是:

致命错误:未捕获的SOAPFault例外:一:ErrorSchemaValidation]请求失败架构验证:所需要的属性“ID”缺失。

回答

2

为了用附件发送电子邮件,您必须首先创建没有任何收件人的邮件(邮件)(以及MessageDisposition为“SendToNone”或类似内容),并将其保存在您的草稿文件夹中。然后创建一个CreateAttachment的请求,就像这样,其中$ key是您之前创建的项目的changekey(您必须读回服务器响应并将changekey保存在某个地方,因为每次修改项目时changekey都会发生变化):

$attachrequest->ParentItemId->ChangeKey = $key; 
$attachrequest->Attachments->FileAttachment->Name = $attachment_name; 
$attachrequest->Attachments->FileAttachment->ContentLocation = $attachment; 
$attachrequest->Attachments->FileAttachment->Content = $attachment_content; 
$attachrequest->Attachments->FileAttachment->ContentType = $attachment_contenttype; 
$response = self::$ews->CreateAttachment($attachrequest); 

则进行更新消息(用的updateItem),包括收件人,并使得MessageDisposition有点像SendToAllAndSaveCopy。 (免责声明:我现在使用这种方法,除了识别Attachments->FileAttachment->Content的正确格式外,它看起来应该是附件的编码base64数据,但是我的电脑不能打开我发送的附件。)

无论如何,我相信这是做到这一点的方法,当然我也可以用附件发送消息。