📄 email.java
字号:
/******************************************************************************
* The contents of this file are subject to the Compiere License Version 1.1
* ("License"); You may not use this file except in compliance with the License
* You may obtain a copy of the License at http://www.compiere.org/license.html
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
* The Original Code is Compiere ERP & CRM Smart Business Solution. The Initial
* Developer of the Original Code is Jorg Janke. Portions created by Jorg Janke
* are Copyright (C) 1999-2005 Jorg Janke.
* All parts are Copyright (C) 1999-2005 ComPiere, Inc. All Rights Reserved.
* Contributor(s): ______________________________________.
*****************************************************************************/
package org.compiere.util;
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.logging.*;
import javax.activation.*;
import javax.mail.*;
import javax.mail.internet.*;
import com.sun.mail.smtp.*;
import org.compiere.model.*;
/**
* EMail Object.
* Resources:
* http://java.sun.com/products/javamail/index.html
* http://java.sun.com/products/javamail/FAQ.html
*
* <p>
* When I try to send a message, I get javax.mail.SendFailedException:
* 550 Unable to relay for my-address
* <br>
* This is an error reply from your SMTP mail server. It indicates that
* your mail server is not configured to allow you to send mail through it.
*
* @author Jorg Janke
* @version $Id: EMail.java,v 1.5 2005/12/27 06:20:13 jjanke Exp $
*/
public final class EMail implements Serializable
{
/**
* Full Constructor
* @param client the client
* @param from Sender's EMail address
* @param to Recipient EMail address
* @param subject Subject of message
* @param message The message
*/
public EMail (MClient client, String from, String to,
String subject, String message)
{
this (client.getCtx(), client.getSMTPHost(), from, to, subject, message);
} // EMail
/**
* Full Constructor
* @param smtpHost The mail server
* @param from Sender's EMail address
* @param to Recipient EMail address
* @param subject Subject of message
* @param message The message
*/
public EMail (Properties ctx, String smtpHost, String from, String to,
String subject, String message)
{
setSmtpHost(smtpHost);
setFrom(from);
addTo(to);
m_ctx = ctx;
if (subject == null || subject.length() == 0)
setSubject("."); // pass validation
else
setSubject (subject);
if (message != null && message.length() > 0)
setMessageText (message);
m_valid = isValid (true);
} // EMail
/** User EMail CTX key */
public static final String CTX_EMAIL = "#User_EMail";
public static final String CTX_EMAIL_USER = "#User_EMailUser";
public static final String CTX_EMAIL_USERPW = "#User_EMailUserPw";
/** Request EMail CTX key */
public static final String CTX_REQUEST_EMAIL = "#Request_EMail";
public static final String CTX_REQUEST_EMAIL_USER = "#Request_EMailUser";
public static final String CTX_REQUEST_EMAIL_USERPW = "#Request_EMailUserPw";
/** From Address */
private InternetAddress m_from;
/** To Address */
private ArrayList<InternetAddress> m_to;
/** CC Addresses */
private ArrayList<InternetAddress> m_cc;
/** BCC Addresses */
private ArrayList<InternetAddress> m_bcc;
/** Reply To Address */
private InternetAddress m_replyTo;
/** Mail Subject */
private String m_subject;
/** Mail Plain Message */
private String m_messageText;
/** Mail HTML Message */
private String m_messageHTML;
/** Mail SMTP Server */
private String m_smtpHost;
/** Attachments */
private ArrayList<Object> m_attachments;
/** UserName and Password */
private EMailAuthenticator m_auth = null;
/** Message */
private SMTPMessage m_msg = null;
/** Comtext - may be null */
private Properties m_ctx;
/** Info Valid */
private boolean m_valid = false;
/** Send result Message */
private String m_sentMsg = null;
/** Mail Sent OK Status */
public static final String SENT_OK = "OK";
/** Logger */
protected static CLogger log = CLogger.getCLogger (EMail.class);
/**
* Send Mail direct
* @return OK or error message
*/
public String send ()
{
log.info("(" + m_smtpHost + ") " + m_from + " -> " + m_to);
m_sentMsg = null;
//
if (!isValid(true))
{
m_sentMsg = "Invalid Data";
return m_sentMsg;
}
//
Properties props = System.getProperties();
props.put("mail.store.protocol", "smtp");
props.put("mail.transport.protocol", "smtp");
props.put("mail.host", m_smtpHost);
if (CLogMgt.isLevelFinest())
props.put("mail.debug", "true");
//
Session session = null;
try
{
if (m_auth != null) // createAuthenticator was called
props.put("mail.smtp.auth", "true");
session = Session.getInstance(props, m_auth);
session.setDebug(CLogMgt.isLevelFinest());
}
catch (SecurityException se)
{
log.log(Level.WARNING, "Auth=" + m_auth + " - " + se.toString());
m_sentMsg = se.toString();
return se.toString();
}
catch (Exception e)
{
log.log(Level.SEVERE, "Auth=" + m_auth, e);
m_sentMsg = e.toString();
return e.toString();
}
try
{
// m_msg = new MimeMessage(session);
m_msg = new SMTPMessage(session);
// Addresses
m_msg.setFrom(m_from);
InternetAddress[] rec = getTos();
if (rec.length == 1)
m_msg.setRecipient (Message.RecipientType.TO, rec[0]);
else
m_msg.setRecipients (Message.RecipientType.TO, rec);
rec = getCcs();
if (rec != null && rec.length > 0)
m_msg.setRecipients (Message.RecipientType.CC, rec);
rec = getBccs();
if (rec != null && rec.length > 0)
m_msg.setRecipients (Message.RecipientType.BCC, rec);
if (m_replyTo != null)
m_msg.setReplyTo(new Address[] {m_replyTo});
//
m_msg.setSentDate(new java.util.Date());
m_msg.setHeader("Comments", "CompiereMail");
// m_msg.setDescription("Description");
// SMTP specifics
m_msg.setAllow8bitMIME(true);
// Send notification on Failure & Success - no way to set envid in Java yet
// m_msg.setNotifyOptions (SMTPMessage.NOTIFY_FAILURE | SMTPMessage.NOTIFY_SUCCESS);
// Bounce only header
m_msg.setReturnOption (SMTPMessage.RETURN_HDRS);
// m_msg.setHeader("X-Mailer", "msgsend");
//
setContent();
m_msg.saveChanges();
// log.fine("message =" + m_msg);
//
// Transport.send(msg);
Transport t = session.getTransport("smtp");
// log.fine("transport=" + t);
t.connect();
// t.connect(m_smtpHost, user, password);
// log.fine("transport connected");
Transport.send(m_msg);
// t.sendMessage(msg, msg.getAllRecipients());
log.fine("Success - MessageID=" + m_msg.getMessageID());
}
catch (MessagingException me)
{
Exception ex = me;
StringBuffer sb = new StringBuffer("(ME)");
boolean printed = false;
do
{
if (ex instanceof SendFailedException)
{
SendFailedException sfex = (SendFailedException)ex;
Address[] invalid = sfex.getInvalidAddresses();
if (!printed)
{
if (invalid != null && invalid.length > 0)
{
sb.append (" - Invalid:");
for (int i = 0; i < invalid.length; i++)
sb.append (" ").append (invalid[i]);
}
Address[] validUnsent = sfex.getValidUnsentAddresses ();
if (validUnsent != null && validUnsent.length > 0)
{
sb.append (" - ValidUnsent:");
for (int i = 0; i < validUnsent.length; i++)
sb.append (" ").append (validUnsent[i]);
}
Address[] validSent = sfex.getValidSentAddresses ();
if (validSent != null && validSent.length > 0)
{
sb.append (" - ValidSent:");
for (int i = 0; i < validSent.length; i++)
sb.append (" ").append (validSent[i]);
}
printed = true;
}
if (sfex.getNextException() == null)
sb.append(" ").append(sfex.getLocalizedMessage());
}
else if (ex instanceof AuthenticationFailedException)
{
sb.append(" - Invalid Username/Password - " + m_auth);
}
else // other MessagingException
{
String msg = ex.getLocalizedMessage();
if (msg == null)
sb.append(": ").append(ex.toString());
else
{
if (msg.indexOf("Could not connect to SMTP host:") != -1)
{
int index = msg.indexOf('\n');
if (index != -1)
msg = msg.substring(0, index);
String cc = "??";
if (m_ctx != null)
cc = m_ctx.getProperty("#AD_Client_ID");
msg += " - AD_Client_ID=" + cc;
}
String className = ex.getClass().getName();
if (className.indexOf("MessagingException") != -1)
sb.append(": ").append(msg);
else
sb.append(" ").append(className).append(": ").append(msg);
}
}
// Next Exception
if (ex instanceof MessagingException)
ex = ((MessagingException)ex).getNextException();
else
ex = null;
}
while (ex != null); // error loop
//
if (CLogMgt.isLevelFinest())
log.log(Level.WARNING, sb.toString(), me);
else
log.log(Level.WARNING, sb.toString());
m_sentMsg = sb.toString();
return sb.toString();
}
catch (Exception e)
{
log.log(Level.SEVERE, "", e);
m_sentMsg = e.getLocalizedMessage();
return e.getLocalizedMessage();
}
//
if (CLogMgt.isLevelFinest())
dumpMessage();
m_sentMsg = SENT_OK;
return m_sentMsg;
} // send
/**
* Get Send Result Msg
* @return msg
*/
public String getSentMsg()
{
return m_sentMsg;
} // getSentMsg
/**
* Was sending the Msg OK
* @return msg == OK
*/
public boolean isSentOK()
{
return m_sentMsg != null && SENT_OK.equals(m_sentMsg);
} // isSentOK
/**
* Dump Message Info
*/
private void dumpMessage()
{
if (m_msg == null)
return;
try
{
Enumeration e = m_msg.getAllHeaderLines ();
while (e.hasMoreElements ())
log.fine("- " + e.nextElement ());
}
catch (MessagingException ex)
{
log.log(Level.WARNING, m_msg.toString(), ex);
}
} // dumpMessage
/**
* Get the message directly
* @return mail message
*/
protected MimeMessage getMimeMessage()
{
return m_msg;
} // getMessage
/**
* Get Message ID or null
* @return Message ID e.g. <20030130004739.15377.qmail@web13506.mail.yahoo.com>
* <25699763.1043887247538.JavaMail.jjanke@main>
*/
public String getMessageID()
{
try
{
if (m_msg != null)
return m_msg.getMessageID ();
}
catch (MessagingException ex)
{
log.log(Level.SEVERE, "", ex);
}
return null;
} // getMessageID
/** Getter/Setter ********************************************************/
/**
* Create Authenticator for User
* @param username user name
* @param password user password
* @return Authenticator or null
*/
public EMailAuthenticator createAuthenticator (String username, String password)
{
if (username == null || password == null)
{
log.warning("Ignored - " + username + "/" + password);
m_auth = null;
}
else
{
// log.fine("setEMailUser: " + username + "/" + password);
m_auth = new EMailAuthenticator (username, password);
}
return m_auth;
} // createAuthenticator
/**
* Get Sender
* @return Sender's internet address
*/
public InternetAddress getFrom()
{
return m_from;
} // getFrom
/**
* Set Sender
* @param newFrom Sender's email address
*/
public void setFrom(String newFrom)
{
if (newFrom == null)
{
m_valid = false;
return;
}
try
{
m_from = new InternetAddress (newFrom, true);
}
catch (Exception e)
{
log.log(Level.WARNING, newFrom + ": " + e.toString());
m_valid = false;
}
} // setFrom
/**
* Add To Recipient
* @param newTo Recipient's email address
* @return true if valid
*/
public boolean addTo (String newTo)
{
if (newTo == null || newTo.length() == 0)
{
m_valid = false;
return false;
}
InternetAddress ia = null;
try
{
ia = new InternetAddress (newTo, true);
}
catch (Exception e)
{
log.log(Level.WARNING, newTo + ": " + e.toString());
m_valid = false;
return false;
}
if (m_to == null)
m_to = new ArrayList<InternetAddress>();
m_to.add(ia);
return true;
} // addTo
/**
* Get Recipient
* @return Recipient's internet address
*/
public InternetAddress getTo()
{
if (m_to == null || m_to.size() == 0)
return null;
InternetAddress ia = (InternetAddress)m_to.get(0);
return ia;
} // getTo
/**
* Get TO Recipients
* @return Recipient's internet address
*/
public InternetAddress[] getTos()
{
if (m_to == null || m_to.size() == 0)
return null;
InternetAddress[] ias = new InternetAddress[m_to.size()];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -