From your replying of My best lead is the X-Attachment-ID and Content-ID, which I am guessing the Virtual Fax Machine is not seeing and therefore not recognizing the attachment.
, when you want to send the email by manually adding X-Attachment-Id
and Content-ID
, I think that Gmail API can be used as my comment.
In this case, how about the following sample script?
Sample script:
Please modify your script as follows. In this modification, the attachment file is send with the values of X-Attachment-Id
and Content-ID
. In this case, please enable Gmail API at Advanced Google services.
function sendFax(data, file, faxto) {
var contentType = data.substring(5, data.indexOf(';')),
bytes = Utilities.base64Decode(data.substr(data.indexOf('base64,') + 7)),
blob = Utilities.newBlob(bytes, contentType, file);
// MailApp.sendEmail(faxto + "@virtualfaxaddress.com", "faxaccesscode", "", {attachments: blob});
var toEmail = faxto + "@virtualfaxaddress.com";
var subject = "faxaccesscode";
var textBody = '';
var attachmentFile = Utilities.base64Encode(blob.getBytes());
var attachmentId = "sampleId";
var requestBody = `MIME-Version: 1.0rn` +
`To: ${toEmail}rn` +
`From: ${fromEmail}rn` +
`Subject: ${subject}rn` +
`Content-Type: multipart/mixed; boundary=boundaryboundary01rnrn` +
`--boundaryboundary01rn` +
`Content-Type: multipart/alternative; boundary=boundaryboundary02rnrn` +
`--boundaryboundary02rn` +
`Content-type: text/plain; charset=UTF-8rnrn` +
`${textBody}rnrn` +
`--boundaryboundary02--rn` +
`--boundaryboundary01rn` +
`Content-Type: ${contentType}; name="${file}"rn` +
`Content-Disposition: attachment; filename="${file}"rn` +
`Content-Transfer-Encoding: base64rn` +
`X-Attachment-Id: ${attachmentId}rn` +
`Content-ID: <${attachmentId}>rnrn` +
`${attachmentFile}rn` +
`--boundaryboundary01--rn`;
var res = Gmail.Users.Messages.send({raw: Utilities.base64EncodeWebSafe(requestBody)}, "me");
console.log(res)
}
Result:
When above script is run, the following result is obtained at the attachment file.
Content-Type: application/pdf; name="sample.pdf"
Content-Disposition: attachment; filename="sample.pdf"
Content-Transfer-Encoding: base64
X-Attachment-Id: sampleId
Content-ID: <sampleId>
Note:
- If you are required to use the specific
X-Attachment-Id
and Content-ID
for the API you want to use, please modify above script.
Reference:
I am attempting to send an email to a virtual fax number from GAS MailApp. The email sends with the attachment and everything looks perfect, but for some reason it doesn’t see the attachment. I also sent one to the same address from my gmail directly and it goes through. Look at the source, it looks like the biggest difference is that there is no X-Attachment-Id or Content-ID. No idea if this makes a difference.
Regular email
Content-Type: application/pdf; name="000106.pdf"
Content-Disposition: attachment; filename="000106.pdf"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_kjyo04nj0
Content-ID: <f_kjyo04nj0>
Email from MailApp
Content-Type: application/pdf; name="000106.pdf"
Content-Disposition: attachment; filename="000106.pdf"
Content-Transfer-Encoding: base64
Code.gs
function doGet() {
return HtmlService.createTemplateFromFile('forms').evaluate().setSandboxMode(HtmlService.SandboxMode.IFRAME)
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
function sendFax(data, file, faxto) {
try {
var contentType = data.substring(5, data.indexOf(';')),
bytes = Utilities.base64Decode(data.substr(data.indexOf('base64,') + 7)),
blob = Utilities.newBlob(bytes, contentType, file);
MailApp.sendEmail(faxto + "@virtualfaxaddress.com", "faxaccesscode", "", {
attachments: blob
});
return 'Sent!';
} catch (f) {
return f.toString();
}
}
forms.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<script src="https://code.jquery.com/jquery.min.js"></script>
</head>
<body>
<body>
<div class="center">
<div class="fax-form">
<form method="post">
<label for="faxto">Fax to #:</label><br>
<input type="tel" name="faxto" id="faxto"><br><br>
<label for="upload">Choose a file to upload:</label>
<input type="file" name="upload" id="upload" accept=".pdf, .jpg, .tiff, .png, .bmp, .gif, .rtf, .txt, .doc, .docx, .xls, .xlsx, .ppt, .pptx"><br><br>
<input type="button" value="Submit" id="submit" onclick="submitForm()">
</form>
<p id="progress"></p>
</div>
</body>
</body>
<script>
var file,
reader = new FileReader();
// Upload the file to Google Drive
reader.onloadend = function (e) {
google.script.run
.withSuccessHandler(showMessage)
.sendFax(
e.target.result,
file.name,
$('input#faxto').val()
);
};
// Read the file on form submit
function submitForm() {
file = $('#upload')[0].files[0];
showMessage('Uploading file..');
reader.readAsDataURL(file);
}
function showMessage(e) {
$('#progress').html(e);
}
</script>
</html>
Does anyone know the role these IDs play in a situation like this? Could this be the cause? If so, how would I go about fixing it so that MailApp sends attachment with IDs?
Sorry, do you mean the virtual fax address and fax access code? If so, I, unfortunately, can’t disclose those. Here is the info on the virtual faxing for the Jive network:
Thank you for replying. I have to apologize for my poor English skill. About
Thank you, Tanaike. Your English is perfect and your help is always appreciated. I wish I could tell further which side the error is on. My best guess right now is that is has to do with the way Gmail sends the attachment from the MailApp.sendEmail function.
That did it! Thank you, so much! The virtual faxes are going through now.
@NMALM Thank you for replying and testing it. I’m glad your issue was resolved. Thank you, too.