代码之家  ›  专栏  ›  技术社区  ›  Joshua Carmody

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

  •  2
  • Joshua Carmody  · 技术社区  · 15 年前

    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 
    

    (为了可读性增加了换行符,这实际上都在一行上)。

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

    All:
    The correct time for Tuesday's call is 3 pm ET as noted on the agenda
    

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

    1 回复  |  直到 15 年前
        1
  •  8
  •   Edward M Smith    15 年前

    您可以使用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}
    

    <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>