1 32 33 package com.knowgate.hipermail; 34 35 import java.io.ByteArrayOutputStream ; 36 import java.io.IOException ; 37 38 import java.sql.SQLException ; 39 import java.sql.PreparedStatement ; 40 import java.sql.ResultSet ; 41 42 import javax.mail.MessagingException ; 43 import javax.mail.internet.MimeBodyPart ; 44 45 import com.knowgate.debug.DebugFile; 46 import com.knowgate.jdc.JDCConnection; 47 import com.knowgate.misc.Gadgets; 48 import com.knowgate.dataobjs.DB; 49 50 54 public class DraftsHelper { 55 public DraftsHelper() { 56 } 57 58 60 public static DBMimeMessage draftMessage(DBFolder oDraftsFldr, 61 String sMailHost, String sGuWorkArea, 62 String sUserId, String sContentType) 63 throws SQLException ,MessagingException ,IOException { 64 65 if (DebugFile.trace) { 66 DebugFile.writeln("Begin DraftsHelper.draftMessage("+sMailHost+","+sGuWorkArea+","+sUserId+","+sContentType+")"); 67 DebugFile.incIdent(); 68 } 69 70 JDCConnection oConn = oDraftsFldr.getConnection(); 71 72 java.sql.PreparedStatement oStmt; 73 java.sql.ResultSet oRSet; 74 75 com.knowgate.acl.ACLUser oUsr = new com.knowgate.acl.ACLUser(); 76 oUsr.load(oConn, new Object []{sUserId}); 77 78 String sGuMsg = Gadgets.generateUUID(); 79 String sGuFldr= oUsr.getMailFolder(oConn,"drafts"); 80 String sFrom = oUsr.getStringNull(DB.nm_user,"")+" "+oUsr.getStringNull(DB.tx_surname1,"")+" "+oUsr.getStringNull(DB.tx_surname2,""); 81 String sIdMsg = "<"+sGuMsg+"."+oUsr.getStringNull(DB.tx_nickname,"")+"@"+sMailHost+">"; 82 83 oConn.setAutoCommit(false); 84 85 oStmt = oConn.prepareStatement("SELECT MAX("+DB.pg_message+") FROM "+DB.k_mime_msgs+" WHERE "+DB.gu_category+"=?"); 86 oStmt.setString (1,sGuFldr); 87 oRSet = oStmt.executeQuery(); 88 oRSet.next(); 89 java.math.BigDecimal oMax = oRSet.getBigDecimal(1); 90 if (oRSet.wasNull()) oMax = new java.math.BigDecimal (0); 91 oRSet.close(); 92 oStmt.close(); 93 94 oStmt = oConn.prepareStatement("INSERT INTO "+DB.k_mime_msgs+" ("+DB.gu_mimemsg+","+DB.pg_message+","+DB.gu_workarea+","+DB.gu_category+","+DB.id_type+","+DB.id_message+","+DB.tx_subject+","+DB.tx_email_from+","+DB.tx_email_reply+","+DB.nm_from+","+DB.len_mimemsg+","+DB.bo_draft+","+DB.bo_deleted+") VALUES(?,?,?,?,?,?,?,?,?,?,0,1,0)"); 95 oStmt.setString (1,sGuMsg); 96 oStmt.setBigDecimal (2,oMax.add(new java.math.BigDecimal (1))); 97 oStmt.setString (3,sGuWorkArea); 98 oStmt.setString (4,sGuFldr); 99 oStmt.setString (5,"text/"+sContentType+"; charset=utf-8"); 100 oStmt.setString (6,sIdMsg); 101 oStmt.setString (7,""); 102 oStmt.setString (8,oUsr.getString(DB.tx_main_email)); 103 oStmt.setString (9,oUsr.getString(DB.tx_main_email)); 104 oStmt.setString (10,sFrom.trim()); 105 oStmt.executeUpdate(); 106 oStmt.close(); 107 108 oStmt = oConn.prepareStatement("INSERT INTO "+DB.k_inet_addrs+" ("+DB.gu_mimemsg+","+DB.id_message+","+DB.tx_email+","+DB.tp_recipient+","+DB.tx_personal+") VALUES (?,?,?,?,?)"); 109 oStmt.setString (1,sGuMsg); 110 oStmt.setString (2,sIdMsg); 111 oStmt.setString (3,oUsr.getString(DB.tx_main_email)); 112 oStmt.setString (4,"from"); 113 oStmt.setString (5,sFrom); 114 oStmt.executeUpdate(); 115 oStmt.close(); 116 117 oConn.commit(); 118 119 if (DebugFile.trace) { 120 DebugFile.decIdent(); 121 DebugFile.writeln("End DraftsHelper.draftMessage()"); 122 } 123 124 return oDraftsFldr.getMessageByGuid(sGuMsg); 125 126 } 128 130 public static DBMimeMessage draftMessageForReply(DBFolder oDraftsFldr, 131 String sMailHost, String sGuWorkArea, 132 String sUserId, DBFolder oOriginalFldr, 133 String sGuOriginalMsg, boolean bReplyAll, 134 String sContentType) 135 throws SQLException ,MessagingException ,IOException { 136 137 if (DebugFile.trace) { 138 DebugFile.writeln("Begin DraftsHelper.draftMessageForReply([DBStore],"+sMailHost+","+sGuWorkArea+","+sUserId+",[DBFolder],"+sGuOriginalMsg+")"); 139 DebugFile.incIdent(); 140 } 141 142 PreparedStatement oStmt; 143 144 JDCConnection oConn = oDraftsFldr.getConnection(); 145 146 DBMimeMessage oDraft = draftMessage(oDraftsFldr, sMailHost, sGuWorkArea, sUserId, sContentType); 147 148 com.knowgate.acl.ACLUser oUsr = new com.knowgate.acl.ACLUser(); 149 oUsr.load(oConn, new Object []{sUserId}); 150 151 String sIdMsg = "<"+oDraft.getMessageGuid()+"."+oUsr.getStringNull(DB.tx_nickname,"")+"@"+sMailHost+">"; 152 153 DBMimeMessage oOrMsg = new DBMimeMessage(oOriginalFldr, sGuOriginalMsg); 154 DBInetAddr oFrom = (DBInetAddr) oOrMsg.getFromRecipient(); 155 156 String sText; 157 if (sContentType.equals("html")) 158 sText = oOrMsg.tagBodyHtml(); 159 else 160 sText = oOrMsg.tagBodyPlain(); 161 162 MimeBodyPart oText = new MimeBodyPart (); 163 oText.setContent(sText, "text/html"); 164 java.io.ByteArrayOutputStream oBaStrm = new java.io.ByteArrayOutputStream (sText.length()*2+2); 165 oText.writeTo(oBaStrm); 166 167 oStmt = oConn.prepareStatement("UPDATE "+DB.k_mime_msgs+" SET "+DB.len_mimemsg+"=?"+","+DB.tx_subject+"=?,"+DB.by_content+"=? WHERE "+DB.gu_mimemsg+"=?"); 168 oStmt.setInt(1, oBaStrm.size()); 169 oStmt.setString(2, oOrMsg.getSubject()); 170 oStmt.setBinaryStream(3, new java.io.ByteArrayInputStream (oBaStrm.toByteArray()), oBaStrm.size()); 171 oStmt.setString(4, oDraft.getMessageGuid()); 172 oStmt.executeUpdate(); 173 oStmt.close(); 174 175 oStmt = oConn.prepareStatement("INSERT INTO "+DB.k_inet_addrs+" ("+DB.gu_mimemsg+","+DB.id_message+","+DB.tx_email+","+DB.tp_recipient+","+DB.tx_personal+") (SELECT '"+oDraft.getMessageGuid()+"','"+sIdMsg+"',"+DB.tx_email+",'to',"+DB.tx_personal+" FROM "+DB.k_inet_addrs+" WHERE "+DB.gu_mimemsg+"=? AND "+DB.tp_recipient+"='from')"); 176 oStmt.setString (1,sGuOriginalMsg); 177 oStmt.executeUpdate(); 178 oStmt.close(); 179 180 if (bReplyAll) { 181 oStmt = oConn.prepareStatement("INSERT INTO "+DB.k_inet_addrs+" ("+DB.gu_mimemsg+","+DB.id_message+","+DB.tx_email+","+DB.tp_recipient+","+DB.tx_personal+") (SELECT '"+oDraft.getMessageGuid()+"','"+sIdMsg+"',"+DB.tx_email+",'to',"+DB.tx_personal+" FROM "+DB.k_inet_addrs+" WHERE "+DB.gu_mimemsg+"=? AND "+DB.tp_recipient+"='to')"); 182 oStmt.setString (1,sGuOriginalMsg); 183 oStmt.executeUpdate(); 184 oStmt.close(); 185 oStmt = oConn.prepareStatement("INSERT INTO "+DB.k_inet_addrs+" ("+DB.gu_mimemsg+","+DB.id_message+","+DB.tx_email+","+DB.tp_recipient+","+DB.tx_personal+") (SELECT '"+oDraft.getMessageGuid()+"','"+sIdMsg+"',"+DB.tx_email+",'cc',"+DB.tx_personal+" FROM "+DB.k_inet_addrs+" WHERE "+DB.gu_mimemsg+"=? AND "+DB.tp_recipient+"='cc')"); 186 oStmt.setString (1,sGuOriginalMsg); 187 oStmt.executeUpdate(); 188 oStmt.close(); 189 } 190 191 oConn.commit(); 192 193 if (DebugFile.trace) { 194 DebugFile.decIdent(); 195 DebugFile.writeln("End DraftsHelper.draftMessageForReply()"); 196 } 197 198 return oDraft; 199 } 201 203 public static DBMimeMessage draftMessageForForward(DBFolder oDraftsFldr, 204 String sMailHost, String sGuWorkArea, 205 String sUserId, DBFolder oOriginalFldr, 206 String sGuOriginalMsg, String sContentType) 207 throws SQLException ,MessagingException ,IOException { 208 209 if (DebugFile.trace) { 210 DebugFile.writeln("Begin DraftsHelper.draftMessageForForward([DBStore],"+sMailHost+","+sGuWorkArea+","+sUserId+",[DBFolder],"+sGuOriginalMsg+","+sContentType+")"); 211 DebugFile.incIdent(); 212 } 213 214 PreparedStatement oStmt; 215 ResultSet oRSet; 216 217 JDCConnection oConn = oDraftsFldr.getConnection(); 218 219 DBMimeMessage oDraft = draftMessage(oDraftsFldr, sMailHost, sGuWorkArea, sUserId, sContentType); 220 221 com.knowgate.acl.ACLUser oUsr = new com.knowgate.acl.ACLUser(); 223 oUsr.load(oConn, new Object []{sUserId}); 224 225 String sIdMsg = "<"+oDraft.getMessageGuid()+"."+oUsr.getStringNull(DB.tx_nickname,"")+"@"+sMailHost+">"; 226 227 DBMimeMessage oOrMsg = new DBMimeMessage(oOriginalFldr, sGuOriginalMsg); 228 DBInetAddr oFrom = (DBInetAddr) oOrMsg.getFromRecipient(); 229 230 String sText; 231 if (sContentType.equals("html")) 232 sText = oOrMsg.tagBodyHtml(); 233 else 234 sText = oOrMsg.tagBodyPlain(); 235 236 MimeBodyPart oText = new MimeBodyPart (); 237 oText.setContent(sText, "text/html"); 238 java.io.ByteArrayOutputStream oBaStrm = new java.io.ByteArrayOutputStream (sText.length()*2+2); 239 oText.writeTo(oBaStrm); 240 241 java.math.BigDecimal oPosition; 242 oStmt = oConn.prepareStatement("SELECT "+DB.nu_position+" FROM "+DB.k_mime_msgs+" WHERE "+DB.gu_mimemsg+"=?"); 243 oStmt.setString(1, sGuOriginalMsg); 244 oRSet = oStmt.executeQuery(); 245 if (oRSet.next()) 246 oPosition = oRSet.getBigDecimal(1); 247 else 248 oPosition = null; 249 oRSet.close(); 250 oRSet = null; 251 oStmt.close(); 252 oStmt = null; 253 254 if (com.knowgate.debug.DebugFile.trace) 255 com.knowgate.debug.DebugFile.writeln("Connection.prepareStatement(UPDATE "+DB.k_mime_msgs+" SET "+DB.nu_position+"=?,"+DB.len_mimemsg+"=?"+","+DB.by_content+"=? WHERE "+DB.gu_mimemsg+"='"+oDraft.getMessageGuid()+"')"); 256 257 oStmt = oConn.prepareStatement("UPDATE "+DB.k_mime_msgs+" SET "+DB.nu_position+"=?,"+DB.len_mimemsg+"=?,"+DB.tx_subject+"=?,"+DB.by_content+"=? WHERE "+DB.gu_mimemsg+"=?"); 258 oStmt.setBigDecimal(1, oPosition); 259 oStmt.setInt(2, oBaStrm.size()); 260 oStmt.setString(3, oOrMsg.getSubject()); 261 oStmt.setBinaryStream(4, new java.io.ByteArrayInputStream (oBaStrm.toByteArray()), oBaStrm.size()); 262 oStmt.setString(5, oDraft.getMessageGuid()); 263 oStmt.executeUpdate(); 264 oStmt.close(); 265 266 if (com.knowgate.debug.DebugFile.trace) 267 com.knowgate.debug.DebugFile.writeln("Connection.prepareStatement(INSERT INTO "+DB.k_mime_parts+" ("+DB.gu_mimemsg+","+DB.id_message+","+DB.pg_message+","+DB.nu_offset+","+DB.id_part+","+DB.id_content+","+DB.id_type+","+DB.id_disposition+","+DB.id_encoding+","+DB.len_part+","+DB.de_part+","+DB.tx_md5+","+DB.file_name+","+DB.id_compression+","+DB.by_content+") (SELECT '"+oDraft.getMessageGuid()+"','"+sIdMsg+"',NULL,"+DB.nu_offset+","+DB.id_part+","+DB.id_content+","+DB.id_type+",'pointer',"+DB.id_encoding+","+DB.len_part+","+DB.file_name+","+DB.tx_md5+",'"+oOriginalFldr.getFilePath()+"',"+DB.id_compression+",NULL FROM "+DB.k_mime_parts+" WHERE "+DB.gu_mimemsg+"='"+sGuOriginalMsg+"'))"); 268 269 oStmt = oConn.prepareStatement("INSERT INTO "+DB.k_mime_parts+" ("+DB.gu_mimemsg+","+DB.id_message+","+DB.pg_message+","+DB.nu_offset+","+DB.id_part+","+DB.id_content+","+DB.id_type+","+DB.id_disposition+","+DB.id_encoding+","+DB.len_part+","+DB.de_part+","+DB.tx_md5+","+DB.file_name+","+DB.id_compression+","+DB.by_content+") (SELECT '"+oDraft.getMessageGuid()+"','"+sIdMsg+"',NULL,"+DB.nu_offset+","+DB.id_part+","+DB.id_content+","+DB.id_type+",'pointer',"+DB.id_encoding+","+DB.len_part+","+DB.file_name+","+DB.tx_md5+",'"+oOriginalFldr.getFilePath()+"',"+DB.id_compression+",NULL FROM "+DB.k_mime_parts+" WHERE "+DB.gu_mimemsg+"=? AND "+DB.id_disposition+"='attachment')"); 270 oStmt.setString (1,sGuOriginalMsg); 271 oStmt.executeUpdate(); 272 oStmt.close(); 273 274 oConn.commit(); 275 276 if (DebugFile.trace) { 277 DebugFile.decIdent(); 278 DebugFile.writeln("End DraftsHelper.draftMessageForForward()"); 279 } 280 281 return oDraft; 282 } 284 286 307 public static void draftUpdate(JDCConnection oConn, 308 int iIdDomain, String sGuWorkarea, 309 String sGuMsg, String sIdMsg, 310 String sTxMailFrom, String sTxMailReply, String sNmFrom, 311 String sTxSubject, String sContentType, String sBody, 312 String [] aTo, String [] aCc, String [] aBcc) 313 throws SQLException , MessagingException , IOException { 314 315 if (DebugFile.trace) { 316 DebugFile.writeln("Begin DraftsHelper.draftUpdate([JDCConnection],"+ 317 String.valueOf(iIdDomain)+","+sGuWorkarea+","+ 318 sGuMsg+","+sIdMsg+","+sTxMailFrom+","+sTxMailReply+","+ 319 sNmFrom+","+sTxSubject+","+sContentType+","+ 320 Gadgets.left(sBody,100)+", String[], String[], String[])"); 321 DebugFile.incIdent(); 322 } 323 324 String sAddr; 325 String sSQL = "UPDATE "+DB.k_mime_msgs+" SET "+DB.bo_draft+"=1,"+ 326 DB.tx_email_from+"=?,"+DB.tx_email_reply+"=?,"+DB.nm_from+"=?,"+ 327 DB.tx_subject+"=?,"+DB.id_type+"=?,"+DB.by_content+"=? WHERE "+DB.gu_mimemsg+"=?"; 328 329 if (DebugFile.trace) DebugFile.writeln("Connection.prepareStatement("+sSQL+")"); 330 331 PreparedStatement oStmt = oConn.prepareStatement(sSQL); 332 333 oStmt.setString(1, sTxMailFrom); 334 oStmt.setString(2, sTxMailReply); 335 oStmt.setString(3, sNmFrom); 336 oStmt.setString(4, sTxSubject); 337 oStmt.setString(5, "text/"+sContentType+"; charset=utf-8"); 338 MimeBodyPart oBody = new MimeBodyPart (); 339 if (DebugFile.trace) DebugFile.writeln("MimeBodyPart.setContent(\""+Gadgets.left(sBody,255)+"\",\"text/"+sContentType+"; charset=utf-8\")"); 340 if (sContentType.toLowerCase().startsWith("text/")) 341 oBody.setContent(sBody, sContentType+"; charset=utf-8"); 342 else 343 oBody.setContent(sBody, "text/"+sContentType+"; charset=utf-8"); 344 ByteArrayOutputStream oBodyStrm = new ByteArrayOutputStream ((sBody.length()*2)+2); 345 oBody.writeTo(oBodyStrm); 346 oStmt.setBytes(6, oBodyStrm.toByteArray()); 347 oStmt.setString(7, sGuMsg); 348 if (DebugFile.trace) DebugFile.writeln("PreparedStatement.executeUpdate()"); 349 oStmt.executeUpdate(); 350 oStmt.close(); 351 352 RecipientsHelper.clearRecipientsForMessage(oConn, sGuMsg); 353 354 if (aTo!=null) { 355 if (DebugFile.trace) DebugFile.writeln("to recipients count is " + String.valueOf(aTo.length)); 356 for (int t=0; t<aTo.length; t++) { 357 sAddr = aTo[t].trim(); 358 if (sAddr.length()>0) { 359 DBInetAddr.write(oConn, iIdDomain, sGuWorkarea, sGuMsg, sIdMsg, aTo[t].trim(), "to", null); 360 } 361 } } if (aCc!=null) { 364 if (DebugFile.trace) DebugFile.writeln("cc recipients count is " + String.valueOf(aCc.length)); 365 for (int t=0; t<aCc.length; t++) { 366 sAddr = aCc[t].trim(); 367 if (sAddr.length()>0) { 368 DBInetAddr.write(oConn, iIdDomain, sGuWorkarea, sGuMsg, sIdMsg, aCc[t].trim(), "cc", null); 369 } 370 } } if (aBcc!=null) { 373 if (DebugFile.trace) DebugFile.writeln("bcc recipients count is " + String.valueOf(aBcc.length)); 374 for (int t=0; t<aBcc.length; t++) { 375 sAddr = aBcc[t].trim(); 376 if (sAddr.length()>0) { 377 DBInetAddr.write(oConn, iIdDomain, sGuWorkarea, sGuMsg, sIdMsg, aBcc[t].trim(), "bcc", null); 378 } 379 } } if (DebugFile.trace) { 382 DebugFile.decIdent(); 383 DebugFile.writeln("End DraftsHelper.draftUpdate"); 384 } 385 } } 387 | Popular Tags |