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已经失败了.谢谢.
您可以使用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)