package com.kescoode.xmail.domain;
import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
import com.fsck.k9.mail.Address;
import com.fsck.k9.mail.Body;
import com.fsck.k9.mail.Message;
import com.fsck.k9.mail.MessagingException;
import com.fsck.k9.mail.internet.*;
import com.kescoode.xmail.domain.internal.TempFileBody;
import com.kescoode.xmail.domain.internal.TempFileMessageBody;
import org.apache.james.mime4j.codec.EncoderUtil;
import org.apache.james.mime4j.util.MimeUtil;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 包含Mail信息,用于IPC
*
* @author Kesco Lin
*/
public class MailBuilder implements Parcelable {
private String toList;
private String ccList;
private String bccList;
private String subject;
private String content;
private List<String> attachments = new ArrayList<>();
public MailBuilder() {
}
private MailBuilder(Parcel source) {
toList = source.readString();
ccList = source.readString();
bccList = source.readString();
subject = source.readString();
content = source.readString();
source.readStringList(attachments);
}
/**
* @param account
* @return
* @throws MessagingException
*/
public MimeMessage build(Context context, Account account) throws MessagingException {
MimeMessage mail = new MimeMessage();
mail.setSentDate(new Date(), true);
/* 设置地址信息 */
mail.setFrom(generateAddress(account.getUserEmail())[0]);
mail.setRecipients(Message.RecipientType.TO, generateAddress(toList));
mail.setRecipients(Message.RecipientType.CC, generateAddress(ccList));
mail.setRecipients(Message.RecipientType.BCC, generateAddress(bccList));
mail.setSubject(subject); /* 设置标题 */
// TODO: 加入附件支持
TextBody textContent = generateTextBody(content);
if (attachments.size() != 0) {
MimeMultipart mp = new MimeMultipart();
mp.addBodyPart(new MimeBodyPart(textContent, "text/plain"));
addAttachmentsToMail(context, mp);
MimeMessageHelper.setBody(mail, mp);
} else {
MimeMessageHelper.setBody(mail, textContent);
}
return mail;
}
private Address[] generateAddress(String address) {
return Address.parseUnencoded(address);
}
/**
* 生成邮件文字部分,目前不做HTML的生成
*
* @param content 邮件文本
* @return 文字Body
*/
private TextBody generateTextBody(String content) {
// TODO: 加入HTML的生成,不过我觉得在手机上没什么用,除非以后加上特殊邮件的适配
int composedMessageLength = 0;
int composedMessageOffset = 0;
String text = content.replace("\n", "\r\n");
composedMessageLength = text.length();
composedMessageOffset = 0;
TextBody body = new TextBody(text);
body.setComposedMessageLength(composedMessageLength);
body.setComposedMessageOffset(composedMessageOffset);
return body;
}
private void addAttachmentsToMail(Context context, MimeMultipart mp) throws MessagingException {
Body body;
for (String path : attachments) {
LocalAttachment attachment = new LocalAttachment(context, path);
if (MimeUtil.isMessage(attachment.getMime())) {
body = new TempFileMessageBody(attachment.getPath());
} else {
body = new TempFileBody(attachment.getPath());
}
MimeBodyPart bp = new MimeBodyPart(body);
bp.addHeader(MimeHeader.HEADER_CONTENT_TYPE, String.format(
"%s;\n name=\"%s\"", attachment.getMime(), EncoderUtil
.encodeIfNecessary(attachment.getName(),
EncoderUtil.Usage.WORD_ENTITY, 7)));
bp.setEncoding(MimeUtility.getEncodingforType(attachment.getMime()));
bp.addHeader(MimeHeader.HEADER_CONTENT_DISPOSITION, String.format(
"attachment;\n filename=\"%s\";\n size=%d",
attachment.getName(), attachment.getSize()));
mp.addBodyPart(bp);
}
}
@Override
public int describeContents() {
return hashCode();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(toList);
dest.writeString(ccList);
dest.writeString(bccList);
dest.writeString(subject);
dest.writeString(content);
dest.writeStringList(attachments);
}
public static Parcelable.Creator<MailBuilder> CREATOR = new Parcelable.Creator<MailBuilder>() {
@Override
public MailBuilder createFromParcel(Parcel source) {
return new MailBuilder(source);
}
@Override
public MailBuilder[] newArray(int size) {
return new MailBuilder[size];
}
};
public MailBuilder setToList(String toList) {
this.toList = toList;
return this;
}
public MailBuilder setCcList(String ccList) {
this.ccList = ccList;
return this;
}
public MailBuilder setBccList(String bccList) {
this.bccList = bccList;
return this;
}
public MailBuilder setSubject(String subject) {
this.subject = subject;
return this;
}
public MailBuilder setContent(String content) {
this.content = content;
return this;
}
public MailBuilder addAttachment(String path) {
this.attachments.add(path);
return this;
}
}