prepareForwardMessage static method
MessageBuilder
prepareForwardMessage(
- MimeMessage originalMessage, {
- MailAddress? from,
- String forwardHeaderTemplate = MailConventions.defaultForwardHeaderTemplate,
- String defaultForwardAbbreviation = MailConventions.defaultForwardAbbreviation,
- bool quoteMessage = true,
- HeaderEncoding subjectEncoding = HeaderEncoding.Q,
- bool forwardAttachments = true,
Prepares to forward the given originalMessage
.
Optionallyspecify the sending user with from
.
You can also specify a custom forwardHeaderTemplate
. The default MailConventions.defaultForwardHeaderTemplate
contains the metadata information about the original message including subject, to, cc, date.
Specify the defaultForwardAbbreviation
if not Fwd
should be used at the beginning of the subject to indicate an reply.
Set quoteMessage
to false
when you plan to quote text yourself, e.g. using the enough_mail_html
's package quoteToHtml()
method.
Set forwardAttachments
to false
when parts with a content-disposition of attachment should not be forwarded.
Implementation
static MessageBuilder prepareForwardMessage(
MimeMessage originalMessage, {
MailAddress? from,
String forwardHeaderTemplate = MailConventions.defaultForwardHeaderTemplate,
String defaultForwardAbbreviation =
MailConventions.defaultForwardAbbreviation,
bool quoteMessage = true,
HeaderEncoding subjectEncoding = HeaderEncoding.Q,
bool forwardAttachments = true,
}) {
String subject;
var originalSubject = originalMessage.decodeSubject();
if (originalSubject != null) {
subject = createForwardSubject(originalSubject,
defaultForwardAbbreviation: defaultForwardAbbreviation);
} else {
subject = defaultForwardAbbreviation;
}
final builder = MessageBuilder()
..subject = subject
..subjectEncoding = subjectEncoding
..contentType = originalMessage.getHeaderContentType()
..transferEncoding = _getTransferEncoding(originalMessage)
..originalMessage = originalMessage;
if (from != null) {
builder.from = [from];
}
if (quoteMessage) {
final forwardHeader =
fillTemplate(forwardHeaderTemplate, originalMessage);
if (originalMessage.parts?.isNotEmpty ?? false) {
var processedTextPlainPart = false;
var processedTextHtmlPart = false;
for (final part in originalMessage.parts!) {
if (part.isTextMediaType()) {
if (!processedTextPlainPart &&
part.mediaType.sub == MediaSubtype.textPlain) {
final plainText = part.decodeContentText();
final quotedPlainText = quotePlainText(forwardHeader, plainText);
builder.addTextPlain(quotedPlainText);
processedTextPlainPart = true;
continue;
}
if (!processedTextHtmlPart &&
part.mediaType.sub == MediaSubtype.textHtml) {
final decodedHtml = part.decodeContentText() ?? '';
final quotedHtml = '<br/><blockquote>' +
forwardHeader.split('\r\n').join('<br/>\r\n') +
'<br/>\r\n' +
decodedHtml +
'</blockquote>';
builder.addTextHtml(quotedHtml);
processedTextHtmlPart = true;
continue;
}
}
if (forwardAttachments ||
part.getHeaderContentDisposition()?.disposition !=
ContentDisposition.attachment) {
builder.addPart(mimePart: part);
}
}
} else {
// no parts, this is most likely a plain text message:
if (originalMessage.isTextPlainMessage()) {
final plainText = originalMessage.decodeContentText();
final quotedPlainText = quotePlainText(forwardHeader, plainText);
builder.text = quotedPlainText;
} else {
//TODO check if there is anything else to quote
}
}
} else if (forwardAttachments) {
// do not quote message but forward attachments
final infos = originalMessage.findContentInfo();
for (final info in infos) {
final part = originalMessage.getPart(info.fetchId);
if (part != null) {
builder.addPart(mimePart: part);
}
}
}
return builder;
}