Hi Eric,
I tried with Squirrel mail. First the problem is the value in the
mail_bytes itself is empty when the mail is getting stored in the
mysql james_mail table. I am able to see the postmaster message in the
inbox, but since the mail_bytes field is having empty value, I am
unable to open that email in any mail client.
I am pasting my custom mailet code.
package com.permitnonwebmail.mailet;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.UnknownHostException;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.james.core.MailImpl;
import org.apache.james.protocols.smtp.dsn.DSNStatus;
import org.apache.james.transport.mailets.AbstractNotify;
import org.apache.mailet.Mail;
import org.apache.mailet.MailAddress;
import org.apache.mailet.base.RFC2822Headers;
import org.apache.mailet.base.RFC822DateFormat;
import org.apache.mailet.base.mail.MimeMultipartReport;
public class PermitNonWebMailMailet extends AbstractNotify {
private static final Log LOGGER = LogFactory.getFactory().getInstance(
PermitNonWebMailMailet.class);
private static final RFC822DateFormat rfc822DateFormat = new
RFC822DateFormat();
private String messageString = null;
/**
* Initialize the mailet
*/
public void init() throws MessagingException {
super.init();
messageString = getInitParameter("messageString",
"Denied access for Web Mail Clients.\n");
}
/**
* Service does the hard work and bounces the mail in the format
specified
* by RFC3464.
*
* @param mail
* the mail to bounce
* @throws MessagingException
* if a problem arises formulating the redirected mail
*
* @see org.apache.mailet.Mailet#service(org.apache.mailet.Mail)
*/
public void service(Mail mail) throws MessagingException {
LOGGER.info("Permit Non Web Mail Mailet Initialized....");
final MimeMessage msg = mail.getMessage();
if (null != msg && !msg.equals("")) {
System.out.println("bounce method called");
// duplicates the Mail object, to be able to modify the
new mail
// keeping
// the original untouched
MailImpl newMail = new MailImpl(mail);
try {
// We don't need to use the original Remote
Address and Host,
// and doing so would likely cause a loop with
spam detecting
// matchers.
try {
newMail.setRemoteAddr(dns.getLocalHost().getHostName());
} catch (UnknownHostException e) {
newMail.setRemoteHost("localhost");
}
try {
newMail.setRemoteHost(dns.getLocalHost().getHostAddress());
} catch (UnknownHostException e) {
newMail.setRemoteAddr("127.0.0.1");
}
if (mail.getSender() == null) {
if (isDebug)
log("Processing a bounce
request for a message with an empty
reverse-path. No bounce will be sent.");
if (!getPassThrough(mail)) {
mail.setState(Mail.GHOST);
}
return;
}
MailAddress reversePath = mail.getSender();
if (isDebug)
log("Processing a bounce request for a
message with a reverse
path. The bounce will be sent to "
+ reversePath);
Collection<MailAddress> newRecipients = new
HashSet<MailAddress>();
newRecipients.add(reversePath);
newMail.setRecipients(newRecipients);
if (isDebug) {
log("New mail - sender: " +
newMail.getSender()
+ ", recipients: "
+
arrayToString(newMail.getRecipients().toArray())
+ ", name: " +
newMail.getName() + ", remoteHost: "
+
newMail.getRemoteHost() + ", remoteAddr: "
+
newMail.getRemoteAddr() + ", state: "
+ newMail.getState() +
", lastUpdated: "
+
newMail.getLastUpdated() + ", errorMessage: "
+
newMail.getErrorMessage());
}
// create the bounce message
MimeMessage newMessage = new MimeMessage(
Session.getDefaultInstance(System.getProperties(), null));
MimeMultipartReport multipart = new
MimeMultipartReport();
multipart.setReportType("delivery-status");
// part 1: descriptive text message
MimeBodyPart part1 = new MimeBodyPart();
part1.setText(messageString);
multipart.addBodyPart(part1);
// stuffing all together
newMessage.setHeader(RFC2822Headers.CONTENT_TYPE,
multipart.getContentType());
newMessage.setContent(multipart);
newMail.setMessage(newMessage);
// Set additional headers
setRecipients(newMail, getRecipients(mail),
mail);
setTo(newMail, getTo(mail), mail);
setSubjectPrefix(newMail,
getSubjectPrefix(mail), mail);
if
(newMail.getMessage().getHeader(RFC2822Headers.DATE) == null) {
newMail.getMessage().setHeader(RFC2822Headers.DATE,
rfc822DateFormat.format(new Date()));
}
setReplyTo(newMail, getReplyTo(mail), mail);
setReversePath(newMail, getReversePath(mail),
mail);
setSender(newMail, getSender(mail), mail);
setIsReply(newMail, isReply(mail), mail);
// newMail.getMessage().saveChanges();
getMailetContext().sendMail(newMail);
} catch (Exception e) {
e.printStackTrace();
} finally {
newMail.dispose();
}
// ghosting the original mail
if (getPassThrough(mail)) {
mail.setState(Mail.GHOST);
}
}
}
/**
* Create a MimeBodyPart with a textual description for human readers.
*
* @param mail
* @return MimeBodyPart
* @throws MessagingException
*/
protected MimeBodyPart createTextMsg(Mail mail) throws
MessagingException {
MimeBodyPart part1 = new MimeBodyPart();
StringWriter sout = new StringWriter();
PrintWriter out = new PrintWriter(sout, true);
StringBuffer bounceBuffer = new StringBuffer(128)
.append("Denied access to Web Clients.");
out.println(bounceBuffer.toString());
out.println();
part1.setText(sout.toString());
return part1;
}
/**
* Guessing status code by the exception provided. This method should
use
* the status attribute when the SMTP-handler some when provides it
*
* @param me
* the MessagingException of which the statusCode should be
* generated
* @return status the generated statusCode
*/
protected String getStatus(MessagingException me) {
return DSNStatus
.getStatus(DSNStatus.PERMANENT,
DSNStatus.SECURITY_AUTH);
}
public String getMailetInfo() {
return "DSNBounce Mailet";
}
/** Gets the expected init parameters. */
protected String[] getAllowedInitParameters() {
String[] allowedArray = { "debug", "passThrough",
"messageString",
"attachment", "sender", "prefix" };
return allowedArray;
}
/**
* @return the <code>attachment</code> init parameter, or
* <code>MESSAGE</code> if missing
*/
protected int getAttachmentType() throws MessagingException {
return getTypeCode(getInitParameter("attachment", "message"));
}
/**
* @return <code>SpecialAddress.REVERSE_PATH</code>
*/
protected Collection<MailAddress> getRecipients() {
Collection<MailAddress> newRecipients = new
HashSet<MailAddress>();
newRecipients.add(SpecialAddress.REVERSE_PATH);
return newRecipients;
}
/**
* @return <code>SpecialAddress.REVERSE_PATH</code>
*/
protected InternetAddress[] getTo() {
InternetAddress[] apparentlyTo = new InternetAddress[1];
apparentlyTo[0] =
SpecialAddress.REVERSE_PATH.toInternetAddress();
return apparentlyTo;
}
/**
* @return <code>SpecialAddress.NULL</code> (the meaning of bounce)
*/
protected MailAddress getReversePath(Mail mail) {
return SpecialAddress.NULL;
}
}
Appreciate your help.
Thank you,
Regards,
Rajender
On Mon, Jan 14, 2013 at 1:36 PM, Eric Charles <[email protected]> wrote:
> Hi Rajender,
>
> I tried on my local trunk and get the original message attached to the
> bounce. It's true that my client (thunderbird) does not allow to open the
> attachement as a real mail, but shows it as plain text.
>
> Can you check the source of the bounce mail and see if this is not an issue
> with the mail client you are using.
>
> Thx, Eric
>
>
> On 13/01/2013 15:37, Rajender Vallapureddy wrote:
>>
>> Hi Eric,
>>
>> I replicated the DNSBounce to send custom bounce with postmaster..
>>
>> I am able to send / receive the postmaster message, but I am unable
>> see any body message in it.
>>
>> I am using mysql and in the "james_mail.mail_bytes" field all I am
>> seeing is empty blob and when I try to open that mail in squirrel mail
>> its giving me the imap error.
>>
>>
>> My class is exact the DNSBounce.java except for few conditions when to
>> send the bounce mail.
>>
>> MailImpl newMail = new MailImpl(mail);
>> newMail.setRemoteAddr(dns.getLocalHost().getHostName());
>> newMail.setRemoteHost(dns.getLocalHost().getHostAddress());
>> MailAddress reversePath = mail.getSender();
>> Collection<MailAddress> newRecipients = new HashSet<MailAddress>();
>> newRecipients.add(reversePath);
>> newMail.setRecipients(newRecipients);
>> MimeMessage newMessage = new
>> MimeMessage(Session.getDefaultInstance(System.getProperties(), null));
>> MimeMultipartReport multipart = new MimeMultipartReport();
>> multipart.setReportType("delivery-status");
>> MimeBodyPart part1 = new MimeBodyPart();
>> part1.setText(messageString); // message from this part is missing in
>> the mail body.
>> multipart.addBodyPart(part1);
>> newMessage.setHeader(RFC2822Headers.CONTENT_TYPE,
>> multipart.getContentType());
>> newMessage.setContent(multipart);
>> newMail.setMessage(newMessage);
>> setRecipients(newMail, getRecipients(mail), mail);
>> setTo(newMail, getTo(mail), mail);
>> setSubjectPrefix(newMail, getSubjectPrefix(mail), mail);
>> newMail.getMessage().setHeader(RFC2822Headers.DATE,
>> rfc822DateFormat.format(new Date()));
>> setReplyTo(newMail, getReplyTo(mail), mail);
>> setReversePath(newMail, getReversePath(mail), mail);
>> setSender(newMail, getSender(mail), mail);
>> setIsReply(newMail, isReply(mail), mail);
>> newMail.getMessage().saveChanges();
>> getMailetContext().sendMail(newMail);
>>
>>
>> Please suggest me what is causing the body message part to be missing
>> from the mail send.
>>
>> Appreciate your help.
>>
>> Thank you,
>> Regards,
>> Rajender
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]