BMIMEMultipartMailContainer::BMIMEMultipartMailContainer( const char *boundary, const char *this_is_an_MIME_message_text, uint32 defaultCharSet) : BMailContainer (defaultCharSet), _boundary(NULL), _MIME_message_warning(this_is_an_MIME_message_text), _io_data(NULL) { // Definition of the MIME version in the mail header should be enough SetHeaderField("MIME-Version","1.0"); SetHeaderField("Content-Type","multipart/mixed"); SetBoundary(boundary); }
void BMIMEMultipartMailContainer::SetBoundary(const char *boundary) { free ((void *) _boundary); _boundary = NULL; if (boundary != NULL) _boundary = strdup(boundary); BMessage structured; HeaderField("Content-Type",&structured); if (_boundary == NULL) structured.RemoveName("boundary"); else if (structured.ReplaceString("boundary",_boundary) != B_OK) structured.AddString("boundary",_boundary); SetHeaderField("Content-Type",&structured); }
void BEmailMessage::SetPriority(int to) { char tempString [20]; if (to < 1) to = 1; if (to > 5) to = 5; sprintf (tempString, "%d", to); SetHeaderField("X-Priority", tempString); if (to <= 2) { SetHeaderField("Priority", "urgent"); SetHeaderField("X-Msmail-Priority", "High"); } else if (to >= 4) { SetHeaderField("Priority", "non-urgent"); SetHeaderField("X-Msmail-Priority", "Low"); } else { SetHeaderField("Priority", "normal"); SetHeaderField("X-Msmail-Priority", "Normal"); } }
status_t BEmailMessage::RenderToRFC822(BPositionIO *file) { if (_body == NULL) return B_MAIL_INVALID_MAIL; // Do real rendering if (From() == NULL) { // set the "From:" string SendViaAccount(_account_id); } BList recipientList; get_address_list(recipientList, To(), extract_address); get_address_list(recipientList, CC(), extract_address); get_address_list(recipientList, _bcc, extract_address); BString recipients; for (int32 i = recipientList.CountItems(); i-- > 0;) { char *address = (char *)recipientList.RemoveItem((int32)0); recipients << '<' << address << '>'; if (i) recipients << ','; free(address); } // add the date field int32 creationTime = time(NULL); { char date[128]; struct tm tm; localtime_r(&creationTime, &tm); size_t length = strftime(date, sizeof(date), "%a, %d %b %Y %H:%M:%S", &tm); // GMT offsets are full hours, yes, but you never know :-) snprintf(date + length, sizeof(date) - length, " %+03d%02d", tm.tm_gmtoff / 3600, (tm.tm_gmtoff / 60) % 60); SetHeaderField("Date", date); } // add a message-id // empirical evidence indicates message id must be enclosed in // angle brackets and there must be an "at" symbol in it BString messageID; messageID << "<"; messageID << system_time(); messageID << "-BeMail@"; char host[255]; if (gethostname(host, sizeof(host)) < 0 || !host[0]) strcpy(host, "zoidberg"); messageID << host; messageID << ">"; SetHeaderField("Message-Id", messageID.String()); status_t err = BMailComponent::RenderToRFC822(file); if (err < B_OK) return err; file->Seek(-2, SEEK_CUR); // Remove division between headers err = _body->RenderToRFC822(file); if (err < B_OK) return err; // Set the message file's attributes. Do this after the rest of the file // is filled in, in case the daemon attempts to send it before it is ready // (since the daemon may send it when it sees the status attribute getting // set to "Pending"). if (BFile *attributed = dynamic_cast <BFile *>(file)) { BNodeInfo(attributed).SetType(B_MAIL_TYPE); attributed->WriteAttrString(B_MAIL_ATTR_RECIPIENTS,&recipients); BString attr; attr = To(); attributed->WriteAttrString(B_MAIL_ATTR_TO,&attr); attr = CC(); attributed->WriteAttrString(B_MAIL_ATTR_CC,&attr); attr = Subject(); attributed->WriteAttrString(B_MAIL_ATTR_SUBJECT,&attr); attr = ReplyTo(); attributed->WriteAttrString(B_MAIL_ATTR_REPLY,&attr); attr = From(); attributed->WriteAttrString(B_MAIL_ATTR_FROM,&attr); if (Priority() != 3 /* Normal is 3 */) { sprintf (attr.LockBuffer (40), "%d", Priority()); attr.UnlockBuffer(-1); attributed->WriteAttrString(B_MAIL_ATTR_PRIORITY,&attr); } attr = "Pending"; attributed->WriteAttrString(B_MAIL_ATTR_STATUS, &attr); attr = "1.0"; attributed->WriteAttrString(B_MAIL_ATTR_MIME, &attr); attributed->WriteAttr(B_MAIL_ATTR_ACCOUNT, B_INT32_TYPE, 0, &_account_id, sizeof(int32)); attributed->WriteAttr(B_MAIL_ATTR_WHEN, B_TIME_TYPE, 0, &creationTime, sizeof(int32)); int32 flags = B_MAIL_PENDING | B_MAIL_SAVE; attributed->WriteAttr(B_MAIL_ATTR_FLAGS, B_INT32_TYPE, 0, &flags, sizeof(int32)); attributed->WriteAttr(B_MAIL_ATTR_ACCOUNT_ID, B_INT32_TYPE, 0, &_account_id, sizeof(int32)); } return B_OK; }
void BEmailMessage::SetCC(const char *cc, uint32 charset, mail_encoding encoding) { // For consistency with our header names, use Cc as the name. SetHeaderField("Cc", cc, charset, encoding); }
void BEmailMessage::SetTo(const char *to, uint32 charset, mail_encoding encoding) { SetHeaderField("To", to, charset, encoding); }
void BEmailMessage::SetFrom(const char *from, uint32 charset, mail_encoding encoding) { SetHeaderField("From", from, charset, encoding); }
void BEmailMessage::SetReplyTo(const char *reply_to, uint32 charset, mail_encoding encoding) { SetHeaderField("Reply-To", reply_to, charset, encoding); }
void BEmailMessage::SetSubject(const char *subject, uint32 charset, mail_encoding encoding) { SetHeaderField("Subject", subject, charset, encoding); }