어떻게 메일을 Gmail에 통합합니까?
이 설명서에서는 두 가지 방법을 설명합니다.비록 우리는 이 목적을 위해 구축된 소프트웨어를 사용하는 것을 권장하지만, 그것은 대부분의 문제를 포함하고 있기 때문에 당신의 시간을 절약할 수 있습니다.
방법 1: Gmail에서 Google 애플리케이션 스크립트를 사용하여 통합 구축
개발자로서 추가 구성 요소 없이 자신의 Gmail 메일 통합을 구축하는 것은 좋은 도전이다.고맙게도 우리는 구글 응용 프로그램 스크립트를 사용해서 구글의 추가 구성 요소를 만드는 것이 매우 쉬워졌다.
Google 개발자 옹호자들은 우리가 코드를 계속 개발할 수 있도록 도와주는 훌륭한 스크립트를 발표했습니다.
다음은 마틴 호크시(Martin Hawksey)의 작품the latest version of the open-source code hosted on GitHub
그리고 우리는 한 걸음 한 걸음 볼 것이다.
// Copyright Martin Hawksey 2020
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
/**
* @OnlyCurrentDoc
*/
/**
* Change these to match the column names you are using for email
* recipient addresses and email sent column.
*/
const RECIPIENT_COL = "Recipient";
const EMAIL_SENT_COL = "Email Sent";
/**
* Creates the menu item "Mail Merge" for user to run scripts on drop-down.
*/
function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu('Mail Merge')
.addItem('Send Emails', 'sendEmails')
.addToUi();
}
/**
* Send emails from sheet data.
* @param {string} subjectLine (optional) for the email draft message
* @param {Sheet} sheet to read data from
*/
function sendEmails(subjectLine, sheet=SpreadsheetApp.getActiveSheet()) {
// option to skip browser prompt if you want to use this code in other projects
if (!subjectLine){
subjectLine = Browser.inputBox("Mail Merge",
"Type or copy/paste the subject line of the Gmail " +
"draft message you would like to mail merge with:",
Browser.Buttons.OK_CANCEL);
if (subjectLine === "cancel" || subjectLine == ""){
// if no subject line finish up
return;
}
}
// get the draft Gmail message to use as a template
const emailTemplate = getGmailTemplateFromDrafts_(subjectLine);
// get the data from the passed sheet
const dataRange = sheet.getDataRange();
// Fetch displayed values for each row in the Range HT Andrew Roberts
// https://mashe.hawksey.info/2020/04/a-bulk-email-mail-merge-with-gmail-and-google-sheets-solution-evolution-using-v8/#comment-187490
// @see https://developers.google.com/apps-script/reference/spreadsheet/range#getdisplayvalues
const data = dataRange.getDisplayValues();
// assuming row 1 contains our column headings
const heads = data.shift();
// get the index of column named 'Email Status' (Assume header names are unique)
// @see http://ramblings.mcpher.com/Home/excelquirks/gooscript/arrayfunctions
const emailSentColIdx = heads.indexOf(EMAIL_SENT_COL);
// convert 2d array into object array
// @see https://stackoverflow.com/a/22917499/1027723
// for pretty version see https://mashe.hawksey.info/?p=17869/#comment-184945
const obj = data.map(r => (heads.reduce((o, k, i) => (o[k] = r[i] || '', o), {})));
// used to record sent emails
const out = [];
// loop through all the rows of data
obj.forEach(function(row, rowIdx){
// only send emails is email_sent cell is blank and not hidden by filter
if (row[EMAIL_SENT_COL] == ''){
try {
const msgObj = fillInTemplateFromObject_(emailTemplate.message, row);
// @see https://developers.google.com/apps-script/reference/gmail/gmail-app#sendEmail(String,String,String,Object)
// if you need to send emails with unicode/emoji characters change GmailApp for MailApp
// Uncomment advanced parameters as needed (see docs for limitations)
GmailApp.sendEmail(row[RECIPIENT_COL], msgObj.subject, msgObj.text, {
htmlBody: msgObj.html,
// bcc: '[email protected]',
// cc: '[email protected]',
// from: '[email protected]',
// name: 'name of the sender',
// replyTo: '[email protected]',
// noReply: true, // if the email should be sent from a generic no-reply email address (not available to gmail.com users)
attachments: emailTemplate.attachments,
inlineImages: emailTemplate.inlineImages
});
// modify cell to record email sent date
out.push([new Date()]);
} catch(e) {
// modify cell to record error
out.push([e.message]);
}
} else {
out.push([row[EMAIL_SENT_COL]]);
}
});
// updating the sheet with new data
sheet.getRange(2, emailSentColIdx+1, out.length).setValues(out);
/**
* Get a Gmail draft message by matching the subject line.
* @param {string} subject_line to search for draft message
* @return {object} containing the subject, plain and html message body and attachments
*/
function getGmailTemplateFromDrafts_(subject_line){
try {
// get drafts
const drafts = GmailApp.getDrafts();
// filter the drafts that match subject line
const draft = drafts.filter(subjectFilter_(subject_line))[0];
// get the message object
const msg = draft.getMessage();
// Handling inline images and attachments so they can be included in the merge
// Based on https://stackoverflow.com/a/65813881/1027723
// Get all attachments and inline image attachments
const allInlineImages = draft.getMessage().getAttachments({includeInlineImages: true,includeAttachments:false});
const attachments = draft.getMessage().getAttachments({includeInlineImages: false});
const htmlBody = msg.getBody();
// Create an inline image object with the image name as key
// (can't rely on image index as array based on insert order)
const img_obj = allInlineImages.reduce((obj, i) => (obj[i.getName()] = i, obj) ,{});
//Regexp to search for all img string positions with cid
const imgexp = RegExp('<img.*?src="cid:(.*?)".*?alt="(.*?)"[^\>]+>', 'g');
const matches = [...htmlBody.matchAll(imgexp)];
//Initiate the allInlineImages object
const inlineImagesObj = {};
// built an inlineImagesObj from inline image matches
matches.forEach(match => inlineImagesObj[match[1]] = img_obj[match[2]]);
return {message: {subject: subject_line, text: msg.getPlainBody(), html:htmlBody},
attachments: attachments, inlineImages: inlineImagesObj };
} catch(e) {
throw new Error("Oops - can't find Gmail draft");
}
/**
* Filter draft objects with the matching subject linemessage by matching the subject line.
* @param {string} subject_line to search for draft message
* @return {object} GmailDraft object
*/
function subjectFilter_(subject_line){
return function(element) {
if (element.getMessage().getSubject() === subject_line) {
return element;
}
}
}
}
/**
* Fill template string with data object
* @see https://stackoverflow.com/a/378000/1027723
* @param {string} template string containing {{}} markers which are replaced with data
* @param {object} data object used to replace {{}} markers
* @return {object} message replaced with data
*/
function fillInTemplateFromObject_(template, data) {
// we have two templates one for plain text and the html body
// stringifing the object means we can do a global replace
let template_string = JSON.stringify(template);
// token replacement
template_string = template_string.replace(/{{[^{}]+}}/g, key => {
return escapeData_(data[key.replace(/[{}]+/g, "")] || "");
});
return JSON.parse(template_string);
}
/**
* Escape cell data to make JSON safe
* @see https://stackoverflow.com/a/9204218/1027723
* @param {string} str to escape JSON special characters from
* @return {string} escaped string
*/
function escapeData_(str) {
return str
.replace(/[\\]/g, '\\\\')
.replace(/[\"]/g, '\\\"')
.replace(/[\/]/g, '\\/')
.replace(/[\b]/g, '\\b')
.replace(/[\f]/g, '\\f')
.replace(/[\n]/g, '\\n')
.replace(/[\r]/g, '\\r')
.replace(/[\t]/g, '\\t');
};
}
응용 프로그램 스크립트를 사용하여 Gmail에서 메시지를 병합하는 방법에 대한 지침은 다음과 같습니다.1. 메일 병합 스프레드시트 예시 사본 만들기
Open this demonstration spreadsheet "던전 만들기"를 클릭하여 당신의 던전을 획득하세요.
2. 새 스프레드시트에서
Tools
>Script editor
를 클릭하여 구글 앱 스크립트를 엽니다.그곳에서 스크립트가 전자 표에 연결되어 있는 것을 볼 수 있습니다.그건 네가 이전의 전자 표를 복사했기 때문이야!스크립트 편집기에서 필요에 따라 코드를 업데이트할 수 있습니다.변화는 즉각 반영될 것이다.
복사된 전자 표로 돌아가서 메일 병합에 사용하고자 하는 전자 우편 주소로 '수신자' 열을 업데이트합니다.예를 들어 '수신자' 열의 칸 값을 자신의 전자 우편 주소로 바꿉니다.
3. 이제 Gmail을 열고 새 전자 메일 초안을 만듭니다.
{{ firstname }}
와 같은 개성화된 변수를 사용할 수 있습니다. 이것은 복사한 전자 표의 열 이름에 대응합니다.이것은 복사된 전자 표의 데이터로 바꾸고자 하는 텍스트를 표시합니다.4. 복사된 스프레드시트로 돌아가서 "메일 병합"이라는 사용자 정의 메뉴 항목을 클릭한 다음 "이메일 보내기"를 클릭합니다.
이 메뉴는 프로그램 스크립트 항목으로 만들어져 메일 병합 과정을 시작합니다.
5. 라이센스 대화 상자가 나타납니다.공인 알림 읽기 및 계속
중요한 알림: 우리가 사용하는 스크립트는 구글 응용 프로그램 스크립트 팀에서 만들고 교정했습니다.스크립트와 제3자 응용 프로그램을 위임할 때 각별히 조심해야 한다.
프롬프트가 나타나면 Gmail 메일 초안에 붙여 넣은 주제 행을 입력하거나 복사합니다.OK 를 클릭하십시오.
6. 이메일 보내기
발송된 전자 메일 열이 메시지 상태를 업데이트하는 것을 볼 수 있습니다.Gmail로 돌아가서 당신이 보낸 폴더를 확인하고 프로그램이 방금 당신에게 보낸 이메일을 확인하세요!
스크립트 사용의 위험은 당신이 스스로 부담한다는 것을 기억하십시오.많은 양의 e-메일을 보내기 전에 Gmail의 발송 제한을 확인하십시오.특히 주의해야 할 것은, 만약 당신의 전자 우편 활동이 스팸메일 필터에서 보기에 심상치 않다면, 당신의 계정은 Gmail에 의해 차단될 수 있다.
이러한 이유로 Mailmeteor와 같은 메일 통합 솔루션을 사용하는 것이 좋습니다.Mailmeteor는 이러한 모든 부분을 처리하고 프라이버시를 보호합니다.
메서드 2: Mailmeteor와 유사한 메일 병합 플러그인 사용
Google Sheets 플러그인을 사용하여 Gmail에서 메일을 병합하는 방법을 보여 드리겠습니다.이 예에서 우리가 사용한 것은 Mailmeteor인데 이것은 평점이 가장 높은 구글 메일 통합 플러그인이다.
1. Mailmeteor 가져오기
네가 해야 할 일은 install Mailmeteor from the Google Workspace Marketplace이다.WorskSpace Marketplace는 구글 키트와 호환되는 모든 앱을 찾을 수 있는 곳이다.Mailmeteor는 이메일과 Google Sheets를 통합하는 도구입니다.
2. 구글 리스트에 연락처 추가
Mailmeteor를 설치한 후open a Google Sheets spreadsheet.
먼저 받는 사람을 Google Sheets 스프레드시트에 추가해야 합니다.이 스프레드시트는 연락처 목록을 저장하는 곳입니다.너는 거기에서 너의 선거 지표를 추적할 수도 있다.
메일 목록을 만들려면 수신자를 수동으로 추가하거나 연락처를 가져올 수 있습니다.구글 워크시트에서 연락처를 가져오려면 '기능표 > 파일 > 가져오기' 로 들어가서 Excel 또는 를 선택하십시오.csv 파일.
다음은 우리가 사용할 메일 통합 프레젠테이션 스프레드시트입니다.
Link to mail merge demo spreadsheet
주의:Mailmeteor를 처음 열면 빠른 입문 강좌를 완성하도록 안내됩니다.이러한 프레젠테이션 스프레드시트가 작성됩니다.
당신의 전자 표는 어떤 모양인지 분석해 봅시다.
➤ 첫 번째 행에 열 머리글 추가하기
Mailmeteor는 전자 우편을 개인화하기 위해 스프레드시트에서 정보를 추출합니다.각 열은 개별 필드를 나타냅니다.이 필드는 전자 메일 템플릿에서 대체됩니다.
우리의 예시에서, 우리는 4개의 열이 있는데, 각각 firstname, 이메일, company,postscriptum이라고 명명되었다.
열을 원하는 만큼 추가하고 열 머리글 이름을 선택합니다.전자 우편이라는 칼럼을 가지고 있는지 확인하세요.
➤ 받는 사람의 정보로 열을 채우다
받는 사람의 정보로 스프레드시트를 작성합니다.모든 전자 우편 칸에 유효한 전자 우편 주소를 기입했는지 확인하십시오.전자메일을 제외하고, 너는 약간의 공백 칸을 남길 수 있다. 이것은 매우 좋다.다음 예제에서 일부 수신자는 Post Scriptum을 받지만 다른 수신자는 그렇지 않습니다.
3. Google Sheets의 Add-ons 메뉴에서 Mailmeteor 열기
연락처 목록이 준비되면 Mailmeteor를 엽니다.Mailmeteor를 열려면 메뉴에 들어가서 Add-ons >Mailmeteor >open Mailmeteor를 선택하십시오.
Mailmeteor 인터페이스입니다.그것은 매일 몇 통의 이메일을 보낼 수 있는지, 그리고 당신의 활동과 관련된 상세한 정보를 알려 준다.다음은 메일 통합에 사용할 템플릿을 작성합니다.
4. 새 전자 메일 템플릿 작성
"새 템플릿 만들기"단추를 누르십시오.전자 메일 메시지를 작성할 수 있는 편집기가 열립니다.Mailmeteor 편집기는 Gmail과 동일하므로 e-메일 사용자 정의에 필요한 모든 작업을 찾을 수 있습니다.
이제 이메일을 맞춤형으로 구성할 수 있습니다.맞춤형 전자메일은 수신자가 당신의 전자메일을 받을 때 독특함을 느끼게 하는 데 도움이 되기 때문에 매우 중요하다.개성화된 서비스를 사용하는 것도 당신의 개방률을 크게 높여 회답을 얻을 수 있다.
5. 이메일 개인 설정
메일 병합은 표준 전자 우편 템플릿을 개성화된 전자 우편 사본으로 변환합니다.템플릿의 변수 필드를 스프레드시트의 컨텐트로 대체하여 수행합니다.
변수 삽입은 간단합니다. 예를 들어
{{ firstname }}
복사하여 붙여넣을 수 있는 템플릿은 다음과 같습니다.변수를 추가할 때, 항상 전자 표의 제목과 일치하는지 확인하십시오
템플릿이 마음에 들면 저장 단추를 누르십시오
6. 보내기 전에 전자 메일 미리 보기
Mailmeteor는 미리 보기 기능을 제공하여 보내기 전에 전자 우편을 보는 데 매우 도움이 됩니다.미리 보기 모드에서는 전자 우편의 실제 출력을 엿볼 수 있습니다. 수신자마다 개성화된 설정을 하면
당신도 자신에게 테스트 메일을 보낼 수 있습니다.여러 장치에서 e-메일을 테스트하는 것이 최선의 방법입니다.대부분의 경우 e-메일이 올바르게 표시됩니다
7. 메일 병합
이륙 준비 됐나요?당신의 메일을 보내서 합병 이벤트를 할 때가 되었습니다
메일 통합은 처음에는 좀 두려울 수도 있다는 것을 알고 있습니다.하지만 걱정하지 마세요. 이 절차를 따르면 모든 것이 좋아질 거예요
✨ 이렇게!이제 메일을 Gmailmeteor와 같은 추가 구성 요소로 통합할 수 있습니다✨
다음은 진실한 예이다.이 선생님이 Mailmeteor를 사용하여 학생들에게 통합 메일을 보내는 것을 보십시오:
이제 네 차례야.
이것이 바로 Gmail 메일 통합 안내서입니다.우리는 당신이 지금 이 간단하지만 기능이 강한 도구를 더 잘 이해할 수 있기를 바랍니다. 메일 합병이라고 합니다.p>
이 안내서는 Mail merge in Gmail (2021)의 확장 안내서의 일부분입니다.더 알고 싶으면 가보세요
Reference
이 문제에 관하여(어떻게 메일을 Gmail에 통합합니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/frenchcooc/how-to-create-a-mail-merge-for-gmail-2e0c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)