【发布时间】:2015-06-16 18:53:17
【问题描述】:
我正在创建一个文本/日历类型的电子邮件。它有 3 个备用视图:文本、html,最后一个是会议邀请或 .ics。我没有附加 ics,而是将其放在第三个视图的内容中。
当我发送它时,outlook 2013 会正确接收邀请并在消息顶部显示接受/暂定/拒绝按钮。
但是,当我尝试将附件嵌入到活动/会议中时,它根本无法抓取它。
如果我将 ics 作为附件发送,它将嵌入附件,但是用户必须单击 .ics 文件,而不是获得内联的 Accept/Tentative/Decline。
我用一种叫做 tcl 的脚本语言来生成这个。我正在使用 mime 和 smtp 库。我一直在参考 tcl、c#、php 和 java 实现,但似乎没有人记录过这个确切的场景。
如果需要,我可以发布我的代码,但它完全无关紧要。相关的是正在构建的 mime 消息。
如何将附件嵌入到事件/日历项目中?
MIME-Version: 1.0
Content-ID: <30261.1428705114.6@cleaf1.mydomain.org>
Content-Type: multipart/related;
boundary="----- =_D0iKdgI+3r1IL2tYlWQ+zA=="
------- =_D0iKdgI+3r1IL2tYlWQ+zA==
MIME-Version: 1.0
Content-ID: <30261.1428705114.4@cleaf1.mydomain.org>
Content-Type: multipart/alternative;
boundary="----- =_6M80yPWZSMRuPfyOccOhUw=="
------- =_6M80yPWZSMRuPfyOccOhUw==
MIME-Version: 1.0
Content-ID: <30261.1428705114.1@cleaf1.mydomain.org>
Content-Type: text/plain;
charset="utf-8"
Content-Transfer-Encoding: 8bit
Plain Text
Line2
------- =_6M80yPWZSMRuPfyOccOhUw==
MIME-Version: 1.0
Content-ID: <30261.1428705114.2@cleaf1.mydomain.org>
Content-Type: text/html;
charset="utf-8"
Content-Transfer-Encoding: 8bit
html
line2
------- =_6M80yPWZSMRuPfyOccOhUw==
MIME-Version: 1.0
Content-ID: <30261.1428705114.3@cleaf1.mydomain.org>
Content-Type: text/calendar;method=request; charset="utf-8";
charset="utf-8"
Content-Transfer-Encoding: 8bit
BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 15.0 MIMEDIR//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REQUEST
X-MS-OLK-FORCEINSPECTOROPEN:TRUE
BEGIN:VEVENT
ORGANIZER;CN=No Reply:mailto:NoReply@mydomain.org
ATTENDEE;CN='Todd';ROLE=REQ-PARTICIPANT;RSVP=FALSE:MAILTO:thorst2@mydomain.org
DTSTART:20150411T120000Z
DTEND:20150411T140000Z
LOCATION:
TRANSP:OPAQUE
SEQUENCE:0
UID:a526f058fba04a4067966986ce365080
DTSTAMP:20150410T223154Z
LAST-MODIFIED:20150410T223154Z
DESCRIPTION:Test Description
SUMMARY:Test Title
ATTACH;ENCODING=BASE64;VALUE=BINARY;X-FILENAME=DOC_FR_MD_in.20150317_154551
.idx.gz:H4sICE9oCFUCA0RPQ19GUl9NRF9pbi4yMDE1MDMxN18xNTQ1NTEuaWR4AO2Wz47bIB
DG732KeQTAhjhHYnBi1f8Wxqvd00pVL71sT5UqWX73QtbZQpJVWm9UbRVzwh/MxzBj/+RhqEsF
w6DaWpYNEBhh2PUbNwE/bfoaGCMs9c8wjk6yJo9ChnEKGcbXED99GfsQfOw0KInSr9u2N7nO26
YB1eZPhXmqFcwazqw15faqhkpb3FuR42POr2BZa6ApE4KQNedO6UzptuMjcMqId3T3LmqMw6y8
9xmjfkD49vzl+4/nr/tzisLqcGuUW6WbLe6AUk75QSsqubVAfhKSEcK8M0rUL33cmrbv/rZXDx
XizmipgoW5xTQaTant0dU/l507BHxtequNq8O9NmoD7JCyy/ikxi75qMpe8y5e5IJknE1i258R
7/LenHreYYunqkvo1MBie8ZAmjwW1QblptLvLd3/PnyXdZfvpDnqvTKl63WOFYgskP1rsMdDsH
n8NPwBmlIqErqg6QKaKEnF+jpocvDJkrfRJIhIbxVNhyqHaIp4dUBTJM5BU2SwoOljosl9Y2y9
oOkSmmhGVtdBE1utpv+is2ji7qybRdNU5QhNIa9e0RSKs9AUGixo+qBoYpTzBU2X0JQmnF4HTW
mSrNO30ZSsMnGzaJqqHKMp4NVvNAXiPDQFBgua/j2afgGbA8R2bBIAAA==
PRIORITY:5
TRANSP:FREE
X-MICROSOFT-CDO-BUSYSTATUS:FREE
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-AUTOFILLLOCATION:TRUE
X-MS-OLK-CONFTYPE:0
CLASS:PUBLIC
END:VEVENT
END:VCALENDAR
------- =_6M80yPWZSMRuPfyOccOhUw==--
------- =_D0iKdgI+3r1IL2tYlWQ+zA==--
这是由 mime 库生成的,正如我所说,如果我作为附件发送它就可以工作。它只是在使用 text/calendar;method=REQUEST 并将其放置在替代视图中时不起作用
我怀疑它与我的 mime 消息(电子邮件)结构或其标题有关
更新 1:
这是我的新代码,建议采用更扁平的结构。无论内容类型是否具有字符集以及是否具有内容传输,似乎都没有区别。仍会收到电子邮件,并显示接受/暂定/拒绝按钮,但没有附件:
MIME-Version: 1.0
Content-ID: <12516.1428711300.1@cleaf1.mydomain.org>
Content-Type: text/calendar;
charset="utf-8"
Content-Transfer-Encoding: 8bit
BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 15.0 MIMEDIR//EN
VERSION:2.0
METHOD:REQUEST
BEGIN:VEVENT
DTSTART:20150411T120000Z
DTEND:20150411T140000Z
SEQUENCE:0
UID:54690bbc05124b2e7c4ad5d480025278
DTSTAMP:20150411T001500Z
LAST-MODIFIED:20150411T001500Z
DESCRIPTION:Test appointment body
SUMMARY:Test Title
ATTACH;ENCODING=BASE64;VALUE=BINARY;X-FILENAME=DOC_FR_MD_in.20150317_154551
.idx.gz:H4sICE9oCFUCA0RPQ19GUl9NRF9pbi4yMDE1MDMxN18xNTQ1NTEuaWR4AO2Wz47bIB
DG732KeQTAhjhHYnBi1f8Wxqvd00pVL71sT5UqWX73QtbZQpJVWm9UbRVzwh/MxzBj/+RhqEsF
w6DaWpYNEBhh2PUbNwE/bfoaGCMs9c8wjk6yJo9ChnEKGcbXED99GfsQfOw0KInSr9u2N7nO26
YB1eZPhXmqFcwazqw15faqhkpb3FuR42POr2BZa6ApE4KQNedO6UzptuMjcMqId3T3LmqMw6y8
9xmjfkD49vzl+4/nr/tzisLqcGuUW6WbLe6AUk75QSsqubVAfhKSEcK8M0rUL33cmrbv/rZXDx
XizmipgoW5xTQaTant0dU/l507BHxtequNq8O9NmoD7JCyy/ikxi75qMpe8y5e5IJknE1i258R
7/LenHreYYunqkvo1MBie8ZAmjwW1QblptLvLd3/PnyXdZfvpDnqvTKl63WOFYgskP1rsMdDsH
n8NPwBmlIqErqg6QKaKEnF+jpocvDJkrfRJIhIbxVNhyqHaIp4dUBTJM5BU2SwoOljosl9Y2y9
oOkSmmhGVtdBE1utpv+is2ji7qybRdNU5QhNIa9e0RSKs9AUGixo+qBoYpTzBU2X0JQmnF4HTW
mSrNO30ZSsMnGzaJqqHKMp4NVvNAXiPDQFBgua/j2afgGbA8R2bBIAAA==
END:VEVENT
END:VCALENDAR
更新 #2(解决方案)
我将回复标记为答案,因为它帮助我找到了解决方案。我已经在问题中发布了解决方案,因为我仍然想感谢@DmitryStreblechenko 帮助我
这里是tcl代码:
#######################################################
# Initial Setup
#######################################################
#Import packages
package require uuid
package require mime
package require smtp
#Set up basic appointment template
set tmplICS "BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 15.0 MIMEDIR//EN
VERSION:2.0
METHOD:REQUEST
BEGIN:VEVENT
DTSTART:@start
DTEND:@end
SEQUENCE:0
UID:@uid
DTSTAMP:@created
LAST-MODIFIED:@created
DESCRIPTION:Test appointment body
SUMMARY:@summary
END:VEVENT
END:VCALENDAR"
#######################################################
# Real Data
#######################################################
#Setup data for substitution
set uuid [string map {- ""} [uuid::uuid generate]]
#Now in utc
set created [clock format [clock seconds] -format {%Y%m%dT%H%M%SZ} -timezone :UTC]
#Get todays date at 8, then add a day, then convert to utc
set est [clock scan [clock format [clock seconds] -format {%Y%m%dT080000}]]
set est [clock add $est 1 day]
set utcStart [clock format $est -format {%Y%m%dT%H%M%SZ} -timezone :UTC ]
#Get todays date at 10, then add a day, then convert to utc
set est [clock scan [clock format [clock seconds] -format {%Y%m%dT100000}]]
set est [clock add $est 1 day]
set utcEnd [clock format $est -format {%Y%m%dT%H%M%SZ} -timezone :UTC ]
#######################################################
# Compile Data
#######################################################
#Fill in the template
set mapper ""
lappend mapper "@uid" $uuid
lappend mapper "@start" $utcStart
lappend mapper "@end" $utcEnd
lappend mapper "@created" $created
lappend mapper "@summary" "Test Title"
set appointment [string map $mapper $tmplICS]
#######################################################
# Set up the bodies
#######################################################
#set up text and meeting request bodies
set text [mime::initialize -canonical text/plain -string "hey"]
set html [mime::initialize -canonical text/html -string "<b>hey</b>"]
set token [mime::initialize -canonical "text/calendar;charset=\"utf-8\";method=REQUEST" -string $appointment]
#Set up container
set mimeBodies [mime::initialize -canonical multipart/alternative -parts [list $text $html $token]]
#######################################################
# Set up attachments
#######################################################
set att [mime::initialize -canonical "application/octet-stream; name=\"ReadMePlease.txt\"" \
-file "/qdxiprod/cis6.1/integrator/web/readme.txt" \
-header [list Content-Disposition "attachment"] ]
set att1 [mime::initialize -canonical "application/hmtl; name=\"DOC_FR_MD.html\"" \
-file "/qdxiprod/cis6.1/integrator/testhtmlFile.html" \
-header [list Content-Disposition "attachment"] ]
#######################################################
# Finish the setup
#######################################################
#Bodies and attachments
set mimeSum [mime::initialize -canonical multipart/mixed -parts [list $mimeBodies $att $att1]]
#Output what it looks like
echo [::mime::buildmessage $mimeSum]
#The sum of the mime package looks like this
#multipart/mixed
# multipart/alternative (holding the two forms of the body part)
# text/plain
# text/html
# text/calendar;method=REQUEST
# application/octet-stream (attachment #1)
# application/html (attachment #2)
#Send email
smtp::sendmessage $mimeSum -servers "smtp.mydomain.org" -header [list From "NoReply@mydomain.org"] -header [list To "myemail@mydomain.org"]
#Destroy mime package
mime::finalize $mimeSum
这是 mime 包:
MIME-Version: 1.0
Content-ID: <20418.1428888890.7@server1.mydomain.org>
Content-Type: multipart/mixed;
boundary="----- =_FoyUc668JaIKjlKQbXOmqQ=="
------- =_FoyUc668JaIKjlKQbXOmqQ==
MIME-Version: 1.0
Content-ID: <20418.1428888890.4@server1.mydomain.org>
Content-Type: multipart/alternative;
boundary="----- =_1trMjc6PUm3+p04m/SU8aA=="
------- =_1trMjc6PUm3+p04m/SU8aA==
MIME-Version: 1.0
Content-ID: <20418.1428888890.1@server1.mydomain.org>
Content-Type: text/plain
hey
------- =_1trMjc6PUm3+p04m/SU8aA==
MIME-Version: 1.0
Content-ID: <20418.1428888890.2@server1.mydomain.org>
Content-Type: text/html
hey
------- =_1trMjc6PUm3+p04m/SU8aA==
MIME-Version: 1.0
Content-ID: <20418.1428888890.3@server1.mydomain.org>
Content-Type: text/calendar;charset="utf-8";method=request
BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 15.0 MIMEDIR//EN
VERSION:2.0
METHOD:REQUEST
BEGIN:VEVENT
DTSTART:20150413T120000Z
DTEND:20150413T140000Z
SEQUENCE:0
UID:56b39b14ebb641ab7de716a62bed46aa
DTSTAMP:20150413T013450Z
LAST-MODIFIED:20150413T013450Z
DESCRIPTION:Test appointment body
SUMMARY:Test Title
END:VEVENT
END:VCALENDAR
------- =_1trMjc6PUm3+p04m/SU8aA==--
------- =_FoyUc668JaIKjlKQbXOmqQ==
MIME-Version: 1.0
Content-Disposition: attachment
Content-ID: <20418.1428888890.5@server1.mydomain.org>
Content-Type: application/octet-stream; name="readmeplease.txt"
Content-Transfer-Encoding: base64
MSAyNCBDdXN0b21pemUuZXhlLm1hbmlmZXN0
------- =_FoyUc668JaIKjlKQbXOmqQ==
MIME-Version: 1.0
Content-Disposition: attachment
Content-ID: <20418.1428888890.6@server1.mydomain.org>
Content-Type: application/hmtl; name="doc_fr_md.html"
Content-Transfer-Encoding: base64
MSAyNCBDdXN0b21pemUuZXhlLm1hbmlmZXN0
------- =_FoyUc668JaIKjlKQbXOmqQ==--
【问题讨论】:
-
你必须创建一个
multipart/mixed,它包含两个部分:multipart/alternative和附件。multipart/alternative应该包含text/html和text/plain可能还有 ics 部分。不确定最后一件事。 -
我认为您指的是仅发送 .ics 附件,或者可能发送带有接受/暂定/拒绝按钮的邀请请求。我在那里没有问题,我的电子邮件有效。不工作的是事件内的嵌入附件。请参阅 ATTACH 段。
-
我以为你想发送一封带有附件和 .ics 的电子邮件。
标签: calendar outlook smtp tcl mime