是否有公开的Coldfusion代码可以将电子邮件"源代码"可靠地转换为纯文本?

Jos*_*ody 2 email coldfusion formatting parsing smtp

我正在为listserv管理应用程序修改基于Coldfusion的界面,以显示页面上最近发布的消息的snippits.这些消息都存储在listserv的邮件服务器上的SQL Server 2005数据库中,理论上它应该很容易查询最近的消息并显示它们.但是,包含电子邮件记录的表的"消息"列似乎包含电子邮件的所有"源代码",与发送到邮件服务器完全相同.它包含控制代码,电子邮件标题和标记.例如,查询中返回的部分消息数据可能如下所示:

This is a multi-part message in MIME format.  
------_=_NextPart_001_01CA9A9E.B2224293 Content-Type: text/plain;  
charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable  
All: =20 The correct time for Tuesday's call is 3 pm ET as noted on the agenda 
Run Code Online (Sandbox Code Playgroud)

(为了便于阅读,添加了换行符,实际上这一切都在一行上).

当我在网站上显示消息时,我只想让它看起来像这样:

All:
The correct time for Tuesday's call is 3 pm ET as noted on the agenda
Run Code Online (Sandbox Code Playgroud)

实际上,编码比我给出的例子复杂得多.一些消息包括base-64编码附件和类似的东西.如何删除所有电子邮件代码和标记,只显示消息文本?

我想有人必须写一些公共代码或一些自定义标签来做到这一点,但到目前为止我的Google-fu已经失败了.谢谢.

Edw*_*ith 8

您可以使用JavaMail执行此操作.如果您在数据库中拥有的是完整的电子邮件,那么您应该能够使用JavaMail将其解析为其组件位.

不确定您的Java级别是什么,但这将返回您所需的所有元素,最有可能.它处理复杂的消息有点复杂,需要一些递归.

myEmailString是包含整个原始电子邮件的数据库中的列.

结果是一个具有属性的结构:

.toRecipients = array of email addresses
.ccRecipients = array of email addresses
.from = array of email addresses
.subject = string
.sentDate = date object
.receivedDate = date object
.attachments = array of {.mimeType: string, .fileName: string}
.bodyParts = {.html: array of strings, .text: array of strings}
Run Code Online (Sandbox Code Playgroud)

代码(应该在CF8 + Java 1.6下工作):

<cfscript>
    myStream = createObject("java","java.io.ByteArrayInputStream").init(myEmailstring.getBytes());
    // Create a java mimemessage and feed it our source inputSteam
    // Set up a fake MailSession so we can ingest emails from a file
    local.props = createObject("java", "java.util.Properties").init();
    local.props.put( javacast("string", "mail.host"), javacast("string", "smtp.somedomain.com"));
    local.props.put( javacast("string", "mail.transport.protocol"),  javacast("string", "smtp"));
    local.mailSession = createObject("java", "javax.mail.Session").getDefaultInstance(local.props,javacast("null", ""));

    local.message = createObject("java", "javax.mail.internet.MimeMessage").init(local.mailSession, myStream);

    local.recipientObj = createObject("java", "javax.mail.Message$RecipientType");

    // Set up our data structure to hold all the elements of the mail object.
    local.mailStruct = structNew();
    local.mailStruct.subject = "";
    local.mailStruct.from = "";
    local.mailStruct.toRecipients = "";
    local.mailStruct.ccRecipients = "";
    local.mailStruct.receivedDate = "";
    local.mailStruct.sentDate = "";
    local.mailStruct.attachments = arrayNew(1);
    local.mailStruct.bodyParts = structNew();
    local.mailStruct.bodyParts.html = arrayNew(1);
    local.mailStruct.bodyParts.text = arrayNew(1);


    // Handle all the header stuff.  Mostly just to: and from: at this point.
    local.mailStruct.subject = fixNull(local.message.getSubject());
    local.mailStruct.from = parseAddress(fixNull(local.message.getFrom()));
    local.mailStruct.toRecipients = parseAddress(fixNull(local.message.getRecipients(local.recipientObj.TO)));
    local.mailStruct.ccRecipients = parseAddress(fixNull(local.message.getRecipients(local.recipientObj.CC)));
    local.mailStruct.receivedDate = fixNull(local.message.getReceivedDate());
    local.mailStruct.sentDate = fixNull(local.message.getSentDate());

    // Handle the body stuff.
    parseEmailBody(local.message,local.mailStruct,#getTempDirectory()#);
</cfscript>
<cfdump var="#local.mailStruct#">

<cffunction name="parseEmailBody" output="false">
    <cfargument name="messagePart" required="true" />
    <cfargument name="mailStruct" required="true" />
    <cfargument name="attachDir" required="true" />
    <cfset var local=structNew()>
    <cfscript>
        if (arguments.messagePart.isMimeType("text/plain")) {
            // Text Body Part
            arrayAppend(arguments.mailStruct.bodyParts.text,arguments.messagePart.getContent());
        } else if (arguments.messagePart.isMimeType("text/html")) {
            // HTML Body Part
            arrayAppend(arguments.mailStruct.bodyParts.html,arguments.messagePart.getContent());
        } else {
            // this is a multipart email part.
            local.mp = arguments.messagePart.getContent();
            for(local.i=0; local.i < local.mp.getCount(); local.i++) {
                try {
                    local.part = local.mp.getBodyPart(javacast("int",local.i));
                    local.disp = local.part.getDisposition();
                    if (  isDefined("local.disp") && (UCase(local.disp)=="ATTACHMENT" || UCase(local.disp)=="INLINE") ) {
                        /* This is an attachment.  Handle accordingly */
                    } else {
                        /* This part is not a binary attachment - could be another multipart bit,
                            or could be a single part.  Either way, we need to run it through again
                            to see what it is and handle it properly.
                        */
                        parseEmailBody(local.part,arguments.mailStruct,arguments.attachDir);
                    }
                } catch (Any e) {
                    // Some error happened trying to parse part of the message.
                }
            }
        }
    </cfscript>
</cffunction>

<cffunction name="parseAddress" output="false">
    <cfargument name="addressObj" required="true" />
    <cfset var local=structNew()>
    <cfscript>
        local.addressArray = ArrayNew(1);
        if (NOT arguments.addressObj is "") {
            for (local.i=1; local.i lte arrayLen(arguments.addressObj); local.i++) {
                local.addressArray[local.i] = arguments.addressObj[local.i].getAddress();
            }
        }
        return local.addressArray;
    </cfscript>
</cffunction>

<cffunction name="fixNull" access="private" output="false">
    <cfargument name="valueToFix" default="" />
    <cfset rStr = "" />
    <cfif isDefined("arguments.valueToFix")>
        <cfset rStr = arguments.valueToFix />
    </cfif>
    <cfreturn rStr />
</cffunction>
Run Code Online (Sandbox Code Playgroud)