mirror of https://github.com/adamdruppe/arsd.git
Let user define linesep + documentation
This commit is contained in:
parent
97313ae98e
commit
318b0fd320
31
email.d
31
email.d
|
@ -75,6 +75,15 @@ class EmailMessage {
|
|||
|
||||
string[] headers;
|
||||
|
||||
/** If you use the send method with an SMTP server, you don't want to change this.
|
||||
*
|
||||
* While RFC 2045 mandates CRLF as a lineseperator, there are some edge-cases where this won't work.
|
||||
* When passing the E-Mail string to a unix program which handles communication with the SMTP server, some (i.e. qmail)
|
||||
* expect the system lineseperator (LF) instead.
|
||||
* Notably, the google mail REST API will choke on CRLF lineseps and produce strange emails (as of 2024).
|
||||
*/
|
||||
string linesep = "\r\n";
|
||||
|
||||
private bool isMime = false;
|
||||
private bool isHtml = false;
|
||||
|
||||
|
@ -213,7 +222,7 @@ class EmailMessage {
|
|||
auto mimeAttachment = new MimeContainer(attachment.type ~ "; name=\""~attachment.filename~"\"");
|
||||
mimeAttachment.headers ~= "Content-Transfer-Encoding: base64";
|
||||
mimeAttachment.headers ~= "Content-ID: <" ~ attachment.id ~ ">";
|
||||
mimeAttachment.content = encodeBase64Mime(cast(const(ubyte)[]) attachment.content);
|
||||
mimeAttachment.content = encodeBase64Mime(cast(const(ubyte)[]) attachment.content, this.linesep);
|
||||
|
||||
mimeRelated.stuff ~= mimeAttachment;
|
||||
}
|
||||
|
@ -235,7 +244,7 @@ class EmailMessage {
|
|||
if(attachment.id.length)
|
||||
mimeAttachment.headers ~= "Content-ID: <" ~ attachment.id ~ ">";
|
||||
|
||||
mimeAttachment.content = encodeBase64Mime(cast(const(ubyte)[]) attachment.content);
|
||||
mimeAttachment.content = encodeBase64Mime(cast(const(ubyte)[]) attachment.content, this.linesep);
|
||||
|
||||
mimeMixed.stuff ~= mimeAttachment;
|
||||
}
|
||||
|
@ -243,7 +252,7 @@ class EmailMessage {
|
|||
}
|
||||
|
||||
headers ~= top.contentType;
|
||||
msgContent = top.toMimeString(true);
|
||||
msgContent = top.toMimeString(true, this.linesep);
|
||||
} else {
|
||||
headers ~= "Content-Type: text/plain; charset=UTF-8";
|
||||
msgContent = textBody;
|
||||
|
@ -254,9 +263,9 @@ class EmailMessage {
|
|||
msg.reserve(htmlBody.length + textBody.length + 1024);
|
||||
|
||||
foreach(header; headers)
|
||||
msg ~= header ~ "\r\n";
|
||||
msg ~= header ~ this.linesep;
|
||||
if(msg.length) // has headers
|
||||
msg ~= "\r\n";
|
||||
msg ~= this.linesep;
|
||||
|
||||
msg ~= msgContent;
|
||||
|
||||
|
@ -616,28 +625,28 @@ class MimeContainer {
|
|||
}
|
||||
|
||||
|
||||
string toMimeString(bool isRoot = false) {
|
||||
string toMimeString(bool isRoot = false, string linesep="\r\n") {
|
||||
string ret;
|
||||
|
||||
if(!isRoot) {
|
||||
ret ~= contentType;
|
||||
foreach(header; headers) {
|
||||
ret ~= "\r\n";
|
||||
ret ~= linesep;
|
||||
ret ~= header;
|
||||
}
|
||||
ret ~= "\r\n\r\n";
|
||||
ret ~= linesep ~ linesep;
|
||||
}
|
||||
|
||||
ret ~= content;
|
||||
|
||||
foreach(idx, thing; stuff) {
|
||||
assert(boundary.length);
|
||||
ret ~= "\r\n--" ~ boundary ~ "\r\n";
|
||||
ret ~= thing.toMimeString(false);
|
||||
ret ~= linesep ~ "--" ~ boundary ~ linesep;
|
||||
ret ~= thing.toMimeString(false, linesep);
|
||||
}
|
||||
|
||||
if(boundary.length)
|
||||
ret ~= "\r\n--" ~ boundary ~ "--";
|
||||
ret ~= linesep ~ "--" ~ boundary ~ "--";
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue