Java 必须发出STARTTLS命令
我试图通过log4j发送错误电子邮件。通过使用以下附加器:Java 必须发出STARTTLS命令,java,log4j,smtpappender,Java,Log4j,Smtpappender,我试图通过log4j发送错误电子邮件。通过使用以下附加器: <appender name="ERROR_MAIL" class="org.apache.log4j.net.SMTPAppender"> <param name="SMTPUsername" value="xxxxxx@gmail.com" /> <param name="SMTPPassword" value="**********" /> <param name=
<appender name="ERROR_MAIL" class="org.apache.log4j.net.SMTPAppender">
<param name="SMTPUsername" value="xxxxxx@gmail.com" />
<param name="SMTPPassword" value="**********" />
<param name="To" value="test@gmail.com"/>
<param name="From" value="xxxxxx@gmail.com"/>
<param name="Subject" value="Newyse Error "/>
<param name="SMTPHost" value="smtp.gmail.com"/>
<param name="SMTPPort" value="25" />
<param name="BufferSize" value="10"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{ISO8601} %t %5p %c:$L]"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="ERROR"/>
<param name="LevelMax" value="FATAL"/>
</filter>
</appender>
从其他几个问题中,我了解到我需要在smtpAppender
props.put("mail.smtp.starttls.enable", "true");
那么我们如何将它添加到现有的SMTPAppender中呢?第一种方法:您可以扩展SMTP appender并重写createSession()方法,在该方法中,您可以向Java邮件会话添加任何附加属性,如前面提到的“Mail.SMTP.starttls.enable”
第二种方式:您可以使用选项-Dmail.smtp.starttls.enable=true启动Java进程。这种方法看起来更简单,但需要控制JVM选项;它也可能会被过于检索的SecurityManager破坏。非常感谢@Jk1给了我答案,让我获得了问题中提到的配置的工作代码
import java.util.Date;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import org.apache.log4j.Layout;
import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.net.SMTPAppender;
import org.apache.log4j.spi.LoggingEvent;
import com.sun.mail.smtp.SMTPTransport;
/**
* Extension of Log4j {@link SMTPAppender} for Gmail support
*
*/
public class SecureSMTPAppender extends SMTPAppender
{
/**
* Cached session for later use i.e. while sending emails
*/
protected Session session;
public SecureSMTPAppender()
{
super();
}
/**
* Create mail session.
*
* @return mail session, may not be null.
*/
protected Session createSession()
{
Properties props = new Properties();
props.put("mail.smtps.host", getSMTPHost());
props.put("mail.smtps.auth", "true");
Authenticator auth = null;
if (getSMTPPassword() != null && getSMTPUsername() != null)
{
auth = new Authenticator()
{
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(getSMTPUsername(), getSMTPPassword());
}
};
}
session = Session.getInstance(props, auth);
if (getSMTPDebug())
{
session.setDebug(getSMTPDebug());
}
return session;
}
/**
* Send the contents of the cyclic buffer as an e-mail message.
*/
protected void sendBuffer()
{
try
{
MimeBodyPart part = new MimeBodyPart();
StringBuffer sbuf = new StringBuffer();
String t = layout.getHeader();
if (t != null)
sbuf.append(t);
int len = cb.length();
for (int i = 0; i < len; i++)
{
LoggingEvent event = cb.get();
sbuf.append(layout.format(event));
if (layout.ignoresThrowable())
{
String[] s = event.getThrowableStrRep();
if (s != null)
{
for (int j = 0; j < s.length; j++)
{
sbuf.append(s[j]);
sbuf.append(Layout.LINE_SEP);
}
}
}
}
t = layout.getFooter();
if (t != null)
sbuf.append(t);
part.setContent(sbuf.toString(), layout.getContentType());
Multipart mp = new MimeMultipart();
mp.addBodyPart(part);
msg.setContent(mp);
msg.setSentDate(new Date());
send(msg);
} catch (Exception e)
{
LogLog.error("Error occured while sending e-mail notification.", e);
}
}
/**
* Pulled email send stuff i.e. Transport.send()/Transport.sendMessage(). So
* that on required this logic can be enhanced.
*
* @param msg
* Email Message
* @throws MessagingException
*/
protected void send(Message msg) throws MessagingException
{
SMTPTransport t = (SMTPTransport) session.getTransport("smtps");
try
{
t.connect(getSMTPHost(), getSMTPUsername(), getSMTPPassword());
t.sendMessage(msg, msg.getAllRecipients());
} finally
{
System.out.println("Response: " + t.getLastServerResponse());
t.close();
}
}
}
import java.util.Date;
导入java.util.Properties;
导入javax.mail.Authenticator;
导入javax.mail.Message;
导入javax.mail.MessaginException;
导入javax.mail.Multipart;
导入javax.mail.PasswordAuthentication;
导入javax.mail.Session;
导入javax.mail.internet.MimeBodyPart;
导入javax.mail.internet.MimeMultipart;
导入org.apache.log4j.Layout;
导入org.apache.log4j.helpers.LogLog;
导入org.apache.log4j.net.SMTPAppender;
导入org.apache.log4j.spi.LoggingEvent;
导入com.sun.mail.smtp.SMTPTransport;
/**
*扩展Log4j{@link SMTPAppender}以支持Gmail
*
*/
公共类securesMTAppender扩展了sMTAppender
{
/**
*缓存会话供以后使用,即发送电子邮件时
*/
受保护会话;
公共安全MTAppender()
{
超级();
}
/**
*创建邮件会话。
*
*@返回邮件会话,不能为空。
*/
受保护的会话createSession()
{
Properties props=新属性();
put(“mail.smtps.host”,getSMTPHost());
props.put(“mail.smtps.auth”、“true”);
验证器auth=null;
如果(getSMTPPassword()!=null&&getSMTPUsername()!=null)
{
auth=新身份验证器()
{
受保护的密码身份验证getPasswordAuthentication()
{
返回新密码身份验证(getSMTPUsername(),getSMTPPassword());
}
};
}
session=session.getInstance(props,auth);
if(getSMTPDebug())
{
setDebug(getSMTPDebug());
}
返回会议;
}
/**
*将循环缓冲区的内容作为电子邮件发送。
*/
受保护的void sendBuffer()
{
尝试
{
MimeBodyPart=新的MimeBodyPart();
StringBuffer sbuf=新的StringBuffer();
字符串t=layout.getHeader();
如果(t!=null)
sbuf.append(t);
int len=cb.length();
对于(int i=0;i
感谢您的帮助,是否无法从xml配置文件中设置此属性?SMTPAppender相当原始,不支持通过log4j.xml或log4j.properties进行tls相关配置。有人会花时间回答您,然后,您不仅会得到他的答案来解决问题,还会根据他的答案添加答案,然后接受你自己的答案?哥们,那是废话。。。我会被欺骗…@gaurav那么?我现在该怎么办?
public class SecureSMTPAppender extends SMTPAppender {
private boolean useStartTLS;
public void setUseStartTLS(boolean useStartTLS) {
this.useStartTLS = useStartTLS;
}
@Override
protected Session createSession() {
Properties props = null;
try {
props = new Properties(System.getProperties());
} catch (SecurityException ex) {
props = new Properties();
}
if (getSMTPHost() != null) {
props.put("mail.smtp.host", getSMTPHost());
}
if (useStartTLS) {
props.put("mail.smtp.starttls.enable", "true");
}
Authenticator auth = null;
if (getSMTPPassword() != null && getSMTPUsername() != null) {
props.put("mail.smtp.auth", "true");
auth = new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(getSMTPUsername(), getSMTPPassword());
}
};
}
Session session = Session.getInstance(props, auth);
if (getSMTPDebug()) {
session.setDebug(true);
}
return session;
}
}
import java.util.Date;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import org.apache.log4j.Layout;
import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.net.SMTPAppender;
import org.apache.log4j.spi.LoggingEvent;
import com.sun.mail.smtp.SMTPTransport;
/**
* Extension of Log4j {@link SMTPAppender} for Gmail support
*
*/
public class SecureSMTPAppender extends SMTPAppender
{
/**
* Cached session for later use i.e. while sending emails
*/
protected Session session;
public SecureSMTPAppender()
{
super();
}
/**
* Create mail session.
*
* @return mail session, may not be null.
*/
protected Session createSession()
{
Properties props = new Properties();
props.put("mail.smtps.host", getSMTPHost());
props.put("mail.smtps.auth", "true");
Authenticator auth = null;
if (getSMTPPassword() != null && getSMTPUsername() != null)
{
auth = new Authenticator()
{
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(getSMTPUsername(), getSMTPPassword());
}
};
}
session = Session.getInstance(props, auth);
if (getSMTPDebug())
{
session.setDebug(getSMTPDebug());
}
return session;
}
/**
* Send the contents of the cyclic buffer as an e-mail message.
*/
protected void sendBuffer()
{
try
{
MimeBodyPart part = new MimeBodyPart();
StringBuffer sbuf = new StringBuffer();
String t = layout.getHeader();
if (t != null)
sbuf.append(t);
int len = cb.length();
for (int i = 0; i < len; i++)
{
LoggingEvent event = cb.get();
sbuf.append(layout.format(event));
if (layout.ignoresThrowable())
{
String[] s = event.getThrowableStrRep();
if (s != null)
{
for (int j = 0; j < s.length; j++)
{
sbuf.append(s[j]);
sbuf.append(Layout.LINE_SEP);
}
}
}
}
t = layout.getFooter();
if (t != null)
sbuf.append(t);
part.setContent(sbuf.toString(), layout.getContentType());
Multipart mp = new MimeMultipart();
mp.addBodyPart(part);
msg.setContent(mp);
msg.setSentDate(new Date());
send(msg);
} catch (Exception e)
{
LogLog.error("Error occured while sending e-mail notification.", e);
}
}
/**
* Pulled email send stuff i.e. Transport.send()/Transport.sendMessage(). So
* that on required this logic can be enhanced.
*
* @param msg
* Email Message
* @throws MessagingException
*/
protected void send(Message msg) throws MessagingException
{
SMTPTransport t = (SMTPTransport) session.getTransport("smtps");
try
{
t.connect(getSMTPHost(), getSMTPUsername(), getSMTPPassword());
t.sendMessage(msg, msg.getAllRecipients());
} finally
{
System.out.println("Response: " + t.getLastServerResponse());
t.close();
}
}
}