{"id":4862,"date":"2026-05-14T13:40:59","date_gmt":"2026-05-14T13:40:59","guid":{"rendered":"http:\/\/wordpress.nationaltrail.k12.oh.us\/ittech\/?p=4862"},"modified":"2026-05-14T13:40:59","modified_gmt":"2026-05-14T13:40:59","slug":"setting-up-smtp-relay-using-postfix-and-msmtp","status":"publish","type":"post","link":"https:\/\/wordpress.nationaltrail.k12.oh.us\/ittech\/2026\/05\/14\/setting-up-smtp-relay-using-postfix-and-msmtp\/","title":{"rendered":"Setting Up SMTP Relay Using Postfix and MSMTP"},"content":{"rendered":"<h3 data-start=\"345\" data-end=\"364\"><span style=\"font-size: 24pt;\"><strong data-start=\"352\" data-end=\"364\">1. Overview<\/strong><\/span><\/h3>\n<p class=\"\" data-start=\"366\" data-end=\"678\">This guide documents how I configured a Linux-based SMTP relay server to allow office copiers to send email securely through Gmail. The project solved the challenge of devices that do not support OAuth2 authentication, enabling them to send authenticated email while complying with Gmail&#8217;s security requirements.<\/p>\n<p class=\"\" data-start=\"680\" data-end=\"705\">This SMTP relay solution:<\/p>\n<ul data-start=\"706\" data-end=\"869\">\n<li class=\"\" data-start=\"706\" data-end=\"759\">\n<p class=\"\" data-start=\"708\" data-end=\"759\">Authenticates outbound email via Gmail using OAuth2<\/p>\n<\/li>\n<li class=\"\" data-start=\"760\" data-end=\"811\">\n<p class=\"\" data-start=\"762\" data-end=\"811\">Restricts relay access to specific copier subnets<\/p>\n<\/li>\n<li class=\"\" data-start=\"812\" data-end=\"869\">\n<p class=\"\" data-start=\"814\" data-end=\"869\">Automates token management to avoid manual intervention<\/p>\n<\/li>\n<\/ul>\n<p class=\"\" data-start=\"871\" data-end=\"1021\">The relay acts as a secure bridge between legacy hardware (that can\u2019t support modern authentication) and Gmail\u2019s stricter authentication requirements.<\/p>\n<hr class=\"\" data-start=\"1023\" data-end=\"1026\" \/>\n<h3 data-start=\"1028\" data-end=\"1049\"><span style=\"font-size: 24pt;\"><strong data-start=\"1034\" data-end=\"1049\">2. Assumptions<\/strong><\/span><\/h3>\n<p class=\"\" data-start=\"1051\" data-end=\"1110\">This solution was designed under the following assumptions:<\/p>\n<ul data-start=\"1112\" data-end=\"1779\">\n<li class=\"\" data-start=\"1112\" data-end=\"1188\">\n<p class=\"\" data-start=\"1114\" data-end=\"1188\">The organization uses <strong data-start=\"1136\" data-end=\"1165\">Gmail or Google Workspace<\/strong> as its email provider.<\/p>\n<\/li>\n<li class=\"\" data-start=\"1189\" data-end=\"1277\">\n<p class=\"\" data-start=\"1191\" data-end=\"1277\">Copiers and scanners on the network <strong data-start=\"1227\" data-end=\"1267\">do not support OAuth2 authentication<\/strong> for SMTP.<\/p>\n<\/li>\n<li class=\"\" data-start=\"1278\" data-end=\"1395\">\n<p class=\"\" data-start=\"1280\" data-end=\"1395\">A dedicated Linux server or virtual machine was available to serve as the SMTP relay, running <strong data-start=\"1374\" data-end=\"1394\">Ubuntu 22.04 LTS<\/strong>.<\/p>\n<\/li>\n<li class=\"\" data-start=\"1396\" data-end=\"1491\">\n<p class=\"\" data-start=\"1398\" data-end=\"1491\">The copier network is isolated or controlled (e.g., a trusted subnet such as <code data-start=\"1475\" data-end=\"1489\">192.0.2.0\/24<\/code>).<\/p>\n<\/li>\n<li class=\"\" data-start=\"1492\" data-end=\"1614\">\n<p class=\"\" data-start=\"1494\" data-end=\"1614\">A <strong data-start=\"1496\" data-end=\"1520\">Google Cloud project<\/strong> was created with access to OAuth2 credentials (client ID, client secret) and a refresh token.<\/p>\n<\/li>\n<li class=\"\" data-start=\"1615\" data-end=\"1696\">\n<p class=\"\" data-start=\"1617\" data-end=\"1696\">The relay would <strong data-start=\"1633\" data-end=\"1661\">only send outbound email<\/strong> (no need to receive inbound mail).<\/p>\n<\/li>\n<li class=\"\" data-start=\"1697\" data-end=\"1779\">\n<p class=\"\" data-start=\"1699\" data-end=\"1779\">All outbound email must be authenticated and delivered via Gmail\u2019s SMTP servers.<\/p>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2 class=\"\" data-start=\"223\" data-end=\"243\"><span style=\"font-size: 24pt;\"><strong data-start=\"229\" data-end=\"243\">3. Objectives<\/strong><\/span><\/h2>\n<p class=\"\" data-start=\"245\" data-end=\"284\">The primary goals of this project were:<\/p>\n<ul data-start=\"286\" data-end=\"660\">\n<li class=\"\" data-start=\"286\" data-end=\"353\">\n<p class=\"\" data-start=\"288\" data-end=\"353\">Enable copiers without OAuth2 support to send email through Gmail<\/p>\n<\/li>\n<li class=\"\" data-start=\"354\" data-end=\"424\">\n<p class=\"\" data-start=\"356\" data-end=\"424\">Create a secure relay server to handle email from trusted copier IPs<\/p>\n<\/li>\n<li class=\"\" data-start=\"425\" data-end=\"488\">\n<p class=\"\" data-start=\"427\" data-end=\"488\">Authenticate outbound email to Gmail using OAuth2 via <code data-start=\"481\" data-end=\"488\">msmtp<\/code><\/p>\n<\/li>\n<li class=\"\" data-start=\"489\" data-end=\"543\">\n<p class=\"\" data-start=\"491\" data-end=\"543\">Automate access token handling using a refresh token<\/p>\n<\/li>\n<li class=\"\" data-start=\"544\" data-end=\"596\">\n<p class=\"\" data-start=\"546\" data-end=\"596\">Restrict relay access to a specific network subnet<\/p>\n<\/li>\n<li class=\"\" data-start=\"597\" data-end=\"660\">\n<p class=\"\" data-start=\"599\" data-end=\"660\">Provide a maintainable, repeatable process for future devices<\/p>\n<\/li>\n<\/ul>\n<hr class=\"\" data-start=\"662\" data-end=\"665\" \/>\n<h2 class=\"\" data-start=\"667\" data-end=\"693\"><span style=\"font-size: 24pt;\"><strong data-start=\"674\" data-end=\"693\">4. Technical Setup<\/strong><\/span><\/h2>\n<p class=\"\" data-start=\"695\" data-end=\"805\">This solution was implemented using a combination of Postfix and <code data-start=\"760\" data-end=\"767\">msmtp<\/code> on a dedicated Linux virtual machine.<\/p>\n<p class=\"\" data-start=\"807\" data-end=\"822\">Key components:<\/p>\n<div class=\"_tableContainer_16hzy_1\">\n<div class=\"_tableWrapper_16hzy_14 group flex w-fit flex-col-reverse\">\n<table class=\"w-fit min-w-(--thread-content-width)\" data-start=\"824\" data-end=\"1300\">\n<thead data-start=\"824\" data-end=\"902\">\n<tr data-start=\"824\" data-end=\"902\">\n<th data-start=\"824\" data-end=\"847\" data-col-size=\"sm\">Component<\/th>\n<th data-start=\"847\" data-end=\"902\" data-col-size=\"md\">Purpose<\/th>\n<\/tr>\n<\/thead>\n<tbody data-start=\"981\" data-end=\"1300\">\n<tr data-start=\"981\" data-end=\"1060\">\n<td data-start=\"981\" data-end=\"1004\" data-col-size=\"sm\"><strong data-start=\"983\" data-end=\"994\">Postfix<\/strong><\/td>\n<td data-col-size=\"md\" data-start=\"1004\" data-end=\"1060\">Accepts SMTP traffic from copiers and relays mail<\/td>\n<\/tr>\n<tr data-start=\"1061\" data-end=\"1140\">\n<td data-start=\"1061\" data-end=\"1084\" data-col-size=\"sm\"><strong data-start=\"1063\" data-end=\"1072\">msmtp<\/strong><\/td>\n<td data-col-size=\"md\" data-start=\"1084\" data-end=\"1140\">Sends authenticated email via Gmail using OAuth2<\/td>\n<\/tr>\n<tr data-start=\"1141\" data-end=\"1220\">\n<td data-start=\"1141\" data-end=\"1165\" data-col-size=\"sm\"><strong data-start=\"1143\" data-end=\"1163\">refresh_token.sh<\/strong><\/td>\n<td data-col-size=\"md\" data-start=\"1165\" data-end=\"1220\">Script to automatically refresh OAuth2 access token<\/td>\n<\/tr>\n<tr data-start=\"1221\" data-end=\"1300\">\n<td data-start=\"1221\" data-end=\"1245\" data-col-size=\"sm\"><strong data-start=\"1223\" data-end=\"1244\">Linux VM (Ubuntu)<\/strong><\/td>\n<td data-col-size=\"md\" data-start=\"1245\" data-end=\"1300\">Hosts the relay server with a static IP address<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 class=\"\" data-start=\"173\" data-end=\"235\"><strong data-start=\"179\" data-end=\"235\">5. Google Cloud Project Setup\u00a0<\/strong><\/h2>\n<p class=\"\" data-start=\"237\" data-end=\"426\">Since Gmail requires OAuth2 authentication for SMTP access, I needed to create a Google Cloud project to generate OAuth2 credentials and obtain a refresh token for automated authentication.<\/p>\n<h3 class=\"\" data-start=\"428\" data-end=\"475\"><strong data-start=\"434\" data-end=\"475\">Steps to set up Google Cloud Project:<\/strong><\/h3>\n<ol data-start=\"477\" data-end=\"1084\">\n<li class=\"\" data-start=\"477\" data-end=\"549\">\n<p class=\"\" data-start=\"480\" data-end=\"549\">Logged into <a target=\"_new\" rel=\"noopener\" data-start=\"492\" data-end=\"548\">Google Cloud Console<\/a>.<\/p>\n<\/li>\n<li class=\"\" data-start=\"550\" data-end=\"606\">\n<p class=\"\" data-start=\"553\" data-end=\"606\">Created a new project named <strong data-start=\"581\" data-end=\"605\"><code data-start=\"583\" data-end=\"603\">smtp-relay-project<\/code><\/strong>.<\/p>\n<\/li>\n<li class=\"\" data-start=\"607\" data-end=\"760\">\n<p class=\"\" data-start=\"610\" data-end=\"651\">Enabled the <strong data-start=\"622\" data-end=\"635\">Gmail API<\/strong> in the project:<\/p>\n<ul data-start=\"655\" data-end=\"760\">\n<li class=\"\" data-start=\"655\" data-end=\"700\">\n<p class=\"\" data-start=\"657\" data-end=\"700\">Navigated to <strong data-start=\"670\" data-end=\"699\">APIs &amp; Services \u2192 Library<\/strong>.<\/p>\n<\/li>\n<li class=\"\" data-start=\"704\" data-end=\"760\">\n<p class=\"\" data-start=\"706\" data-end=\"760\">Searched for <strong data-start=\"719\" data-end=\"734\">\u201cGmail API\u201d<\/strong> and clicked <strong data-start=\"747\" data-end=\"759\">\u201cEnable\u201d<\/strong>.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li class=\"\" data-start=\"761\" data-end=\"1023\">\n<p class=\"\" data-start=\"764\" data-end=\"791\">Created OAuth2 credentials:<\/p>\n<ul data-start=\"795\" data-end=\"1023\">\n<li class=\"\" data-start=\"795\" data-end=\"870\">\n<p class=\"\" data-start=\"797\" data-end=\"870\"><strong data-start=\"797\" data-end=\"869\">APIs &amp; Services \u2192 Credentials \u2192 Create Credentials \u2192 OAuth Client ID<\/strong>.<\/p>\n<\/li>\n<li class=\"\" data-start=\"874\" data-end=\"914\">\n<p class=\"\" data-start=\"876\" data-end=\"914\">Application Type: <strong data-start=\"894\" data-end=\"913\">Web Application<\/strong>.<\/p>\n<\/li>\n<li class=\"\" data-start=\"918\" data-end=\"960\">\n<p class=\"\" data-start=\"920\" data-end=\"960\">Gave it a name like <code data-start=\"940\" data-end=\"959\">smtp-relay-client<\/code>.<\/p>\n<\/li>\n<li class=\"\" data-start=\"964\" data-end=\"1023\">\n<p class=\"\" data-start=\"966\" data-end=\"1023\">Added <strong data-start=\"972\" data-end=\"994\"><code data-start=\"974\" data-end=\"992\">http:\/\/localhost<\/code><\/strong> to Authorized Redirect URIs.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li class=\"\" data-start=\"1024\" data-end=\"1084\">\n<p class=\"\" data-start=\"1027\" data-end=\"1084\">Downloaded the <strong data-start=\"1042\" data-end=\"1069\">client secret JSON file<\/strong> for later use.<\/p>\n<\/li>\n<\/ol>\n<hr class=\"\" data-start=\"1086\" data-end=\"1089\" \/>\n<h3 class=\"\" data-start=\"1091\" data-end=\"1129\"><span style=\"font-size: 24pt;\"><strong data-start=\"1097\" data-end=\"1129\">6. Generating the Refresh Token<\/strong><\/span><\/h3>\n<p class=\"\" data-start=\"1131\" data-end=\"1218\">I wrote a Bash script to simplify obtaining the refresh token from Google\u2019s OAuth2 API.<\/p>\n<p class=\"\" data-start=\"1220\" data-end=\"1366\">The script generates the authorization URL, prompts the user to paste in the authorization code from Google, and exchanges it for a refresh token.<\/p>\n<p class=\"\" data-start=\"1368\" data-end=\"1386\">Here\u2019s the script:<\/p>\n<div class=\"contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-sidebar-surface-primary text-token-text-secondary dark:bg-token-main-surface-secondary flex items-center rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\">\n<p><code class=\"whitespace-pre! language-bash\"><span class=\"hljs-meta\">#!\/bin\/bash<\/span><\/code><\/p>\n<p>CLIENT_ID=<span class=\"hljs-string\">&#8220;your-client-id.apps.googleusercontent.com&#8221;<\/span><br \/>\nCLIENT_SECRET=<span class=\"hljs-string\">&#8220;your-client-secret&#8221;<\/span><\/p>\n<p>&nbsp;<\/p>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\">\n<p><code class=\"whitespace-pre! language-bash\">REDIRECT_URI=<span class=\"hljs-string\">\"http:\/\/localhost\"<\/span><\/code><\/p>\n<p>&nbsp;<\/p>\n<p><span class=\"hljs-built_in\">echo<\/span> <span class=\"hljs-string\">&#8220;Visit the following URL in your browser to authorize:&#8221;<\/span><\/p>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\"><span class=\"hljs-built_in\">echo <\/span><span class=\"hljs-string\">\"https:\/\/accounts.google.com\/o\/oauth2\/v2\/auth?scope=https%3A%2F%2Fmail.google.com%2F&amp;access_type=offline&amp;include_granted_scopes=true&amp;response_type=code&amp;client_id=<span class=\"hljs-variable\">${CLIENT_ID}<\/span><\/span>&amp;redirect_uri=<span class=\"hljs-variable\">${REDIRECT_URI}<\/span>\"<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\"><span class=\"hljs-built_in\">echo<\/span> <span class=\"hljs-string\">\"\"<\/span><\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\"><span class=\"hljs-built_in\">read<\/span> -p <span class=\"hljs-string\">\"Enter the authorization code: \"<\/span> AUTH_CODE<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">RESPONSE=$(curl -s \\<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">  --request POST \\<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">--data <span class=\"hljs-string\">\"code=<span class=\"hljs-variable\">${AUTH_CODE}<\/span><\/span>&amp;client_id=<span class=\"hljs-variable\">${CLIENT_ID}<\/span>&amp;client_secret=<span class=\"hljs-variable\">${CLIENT_SECRET}<\/span>&amp;redirect_uri=<span class=\"hljs-variable\">${REDIRECT_URI}<\/span>&amp;grant_type=authorization_code\" \\<br \/>\nhttps:\/\/oauth2.googleapis.com\/token)<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\"><span class=\"hljs-built_in\">echo<\/span> <span class=\"hljs-string\">\"\"<\/span><\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\"><span class=\"hljs-built_in\">echo<\/span> <span class=\"hljs-string\">\"Full response:\"<\/span><\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\"><span class=\"hljs-built_in\">echo<\/span> <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$RESPONSE<\/span><\/span>\"<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">REFRESH_TOKEN=$(<span class=\"hljs-built_in\">echo<\/span> <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$RESPONSE<\/span><\/span>\" | jq -r <span class=\"hljs-string\">'.refresh_token'<\/span>)<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\"><span class=\"hljs-built_in\">echo<\/span> <span class=\"hljs-string\">\"\"<\/span><\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\"><span class=\"hljs-built_in\">echo<\/span> <span class=\"hljs-string\">\"Extracted refresh token:\"<\/span><\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\"><span class=\"hljs-built_in\">echo<\/span> <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$REFRESH_TOKEN<\/span><\/span>\"<\/code><\/div>\n<\/div>\n<p class=\"\" data-start=\"2262\" data-end=\"2281\"><strong data-start=\"2264\" data-end=\"2281\">How it works:<\/strong><\/p>\n<ul data-start=\"2282\" data-end=\"2449\">\n<li class=\"\" data-start=\"2282\" data-end=\"2313\">\n<p class=\"\" data-start=\"2284\" data-end=\"2313\">Outputs an authorization URL.<\/p>\n<\/li>\n<li class=\"\" data-start=\"2314\" data-end=\"2393\">\n<p class=\"\" data-start=\"2316\" data-end=\"2393\">Prompts user to visit the link, log into Google with the account that you want to send the emails from, and paste the returned code.<\/p>\n<\/li>\n<li class=\"\" data-start=\"2394\" data-end=\"2449\">\n<p class=\"\" data-start=\"2396\" data-end=\"2449\">Exchanges the code for a refresh token and prints it.<\/p>\n<\/li>\n<\/ul>\n<p class=\"\" data-start=\"2451\" data-end=\"2548\">I ran the script, saved the refresh token output, and used it later in the <code data-start=\"2526\" data-end=\"2533\">msmtp<\/code> configuration.<\/p>\n<hr class=\"\" data-start=\"286\" data-end=\"289\" \/>\n<h3 class=\"\" data-start=\"291\" data-end=\"333\"><span style=\"font-size: 24pt;\"><strong data-start=\"297\" data-end=\"333\">7. Installing Postfix (Send-Only)<\/strong><\/span><\/h3>\n<p class=\"\" data-start=\"335\" data-end=\"460\">Installed Postfix as a <strong data-start=\"358\" data-end=\"391\">send-only mail transfer agent<\/strong> to accept mail from copiers and hand it off to <code data-start=\"439\" data-end=\"446\">msmtp<\/code> for delivery.<\/p>\n<div class=\"contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary\">\n<div dir=\"ltr\"><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">sudo apt install postfix<br \/>\n<\/code><\/div>\n<\/div>\n<p class=\"\" data-start=\"500\" data-end=\"513\">During setup:<\/p>\n<ul data-start=\"514\" data-end=\"585\">\n<li class=\"\" data-start=\"514\" data-end=\"545\">\n<p class=\"\" data-start=\"516\" data-end=\"545\">Selected <strong data-start=\"525\" data-end=\"544\">\u201cInternet Site\u201d<\/strong>.<\/p>\n<\/li>\n<li class=\"\" data-start=\"546\" data-end=\"585\">\n<p class=\"\" data-start=\"548\" data-end=\"585\">Set mail name to <code data-start=\"565\" data-end=\"584\">exampledomain.com<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p class=\"\" data-start=\"587\" data-end=\"635\">Verified <code data-start=\"596\" data-end=\"616\">\/usr\/sbin\/sendmail<\/code> points to Postfix:<\/p>\n<div class=\"contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-sidebar-surface-primary text-token-text-secondary dark:bg-token-main-surface-secondary flex items-center rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\"><span class=\"hljs-built_in\">ls<\/span> -l \/usr\/sbin\/sendmail<br \/>\n<\/code><\/div>\n<\/div>\n<p class=\"\" data-start=\"675\" data-end=\"715\">Confirmed Postfix installed and ready.<\/p>\n<h3 data-start=\"722\" data-end=\"750\"><\/h3>\n<h3 class=\"\" data-start=\"722\" data-end=\"750\"><span style=\"font-size: 24pt;\"><strong data-start=\"728\" data-end=\"750\">8. Installing msmtp<\/strong><\/span><\/h3>\n<p class=\"\" data-start=\"752\" data-end=\"819\">Installed <code data-start=\"762\" data-end=\"769\">msmtp<\/code> to act as the authenticated SMTP client to Gmail:<\/p>\n<div class=\"contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-sidebar-surface-primary text-token-text-secondary dark:bg-token-main-surface-secondary flex items-center rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">sudo apt install msmtp<\/code><\/div>\n<\/div>\n<hr class=\"\" data-start=\"857\" data-end=\"860\" \/>\n<h3 class=\"\" data-start=\"862\" data-end=\"891\"><span style=\"font-size: 24pt;\"><strong data-start=\"868\" data-end=\"891\">9. Configuring msmtp<\/strong><\/span><\/h3>\n<p class=\"\" data-start=\"893\" data-end=\"948\">Created configuration file at <code data-start=\"923\" data-end=\"947\">\/usr\/local\/etc\/msmtprc<\/code>:<\/p>\n<div class=\"contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-9\">\n<div class=\"bg-token-sidebar-surface-primary text-token-text-secondary dark:bg-token-main-surface-secondary flex items-center rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-ini\">defaults<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-ini\">auth oauthbearer<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-ini\">tls on<br \/>\ntls_trust_file \/etc\/ssl\/certs\/ca-certificates.crt<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-ini\">logfile \/var\/log\/msmtp.log<br \/>\n<\/code><\/div>\n<div dir=\"ltr\"><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-ini\">account gmail<br \/>\nhost smtp.gmail.com<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-ini\">port 587<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-ini\">from copier@exampledomain.com<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-ini\">user copier@exampledomain.com<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-ini\">passwordeval \/usr\/local\/bin\/refresh_token.sh<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-ini\">account default : gmail<br \/>\n<\/code><\/div>\n<\/div>\n<p class=\"\" data-start=\"1246\" data-end=\"1355\">This config instructs <code data-start=\"1270\" data-end=\"1277\">msmtp<\/code> to use Gmail SMTP with OAuth2, pulling access tokens from the refresh script.<\/p>\n<hr class=\"\" data-start=\"1357\" data-end=\"1360\" \/>\n<h3 class=\"\" data-start=\"1362\" data-end=\"1408\"><span style=\"font-size: 24pt;\"><strong data-start=\"1368\" data-end=\"1408\">10. OAuth2 Token Refresh Script<\/strong><\/span><\/h3>\n<p class=\"\" data-start=\"1410\" data-end=\"1526\">Created <code data-start=\"1418\" data-end=\"1451\">\/usr\/local\/bin\/refresh_token.sh<\/code> to automatically fetch a fresh access token using the saved refresh token:<\/p>\n<div class=\"contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-sidebar-surface-primary text-token-text-secondary dark:bg-token-main-surface-secondary flex items-center rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\"><span class=\"hljs-meta\">#!\/bin\/bash<\/span><\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">CLIENT_ID=<span class=\"hljs-string\">\"your-client-id.apps.googleusercontent.com\"<\/span><br \/>\nCLIENT_SECRET=<span class=\"hljs-string\">\"your-client-secret\"<\/span><\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">REFRESH_TOKEN=<span class=\"hljs-string\">\"your-refresh-token\"<\/span><br \/>\nTOKEN_URL=<span class=\"hljs-string\">\"https:\/\/oauth2.googleapis.com\/token\"<\/span><\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">ACCESS_TOKEN=$(curl -s \\<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">\u00a0-d client_id=<span class=\"hljs-variable\">$CLIENT_ID<\/span> \\<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">\u00a0-d client_secret=<span class=\"hljs-variable\">$CLIENT_SECRET<\/span> \\<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">\u00a0-d refresh_token=<span class=\"hljs-variable\">$REFRESH_TOKEN<\/span> \\<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">\u00a0-d grant_type=refresh_token \\<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\"><span class=\"hljs-variable\">\u00a0$TOKEN_URL<\/span> | jq -r <span class=\"hljs-string\">'.access_token'<\/span>)<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\"><span class=\"hljs-built_in\">echo<\/span> <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$ACCESS_TOKEN<\/span><\/span>\"<\/code><\/div>\n<\/div>\n<p class=\"\" data-start=\"1944\" data-end=\"1971\">Made the script executable:<\/p>\n<div class=\"contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-sidebar-surface-primary text-token-text-secondary dark:bg-token-main-surface-secondary flex items-center rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\"><span class=\"hljs-built_in\">chmod<\/span> +x \/usr\/local\/bin\/refresh_token.sh<\/code><\/div>\n<div dir=\"ltr\"><\/div>\n<div dir=\"ltr\"><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\">Tested:<\/div>\n<div dir=\"ltr\"><\/div>\n<\/div>\n<\/div>\n<div><\/div>\n<div class=\"_tableWrapper_16hzy_14 group flex w-fit flex-col-reverse\">\n<div class=\"contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary\">\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">\/usr\/local\/bin\/refresh_token.sh<\/code><\/div>\n<\/div>\n<p class=\"\" data-start=\"2081\" data-end=\"2119\">Confirmed valid access token output.<\/p>\n<hr class=\"\" data-start=\"2121\" data-end=\"2124\" \/>\n<h3 class=\"\" data-start=\"2126\" data-end=\"2179\"><span style=\"font-size: 24pt;\"><strong data-start=\"2132\" data-end=\"2179\">11. msmtp Wrapper Script for Postfix<\/strong><\/span><\/h3>\n<p class=\"\" data-start=\"2181\" data-end=\"2278\">Postfix uses <code data-start=\"2194\" data-end=\"2204\">sendmail<\/code> or a pipe command to send mail, so I created a wrapper to invoke <code data-start=\"2270\" data-end=\"2277\">msmtp<\/code>:<\/p>\n<div class=\"contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-sidebar-surface-primary text-token-text-secondary dark:bg-token-main-surface-secondary flex items-center rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">sudo nano \/usr\/local\/bin\/msmtp-wrapper<br \/>\n<\/code><\/div>\n<\/div>\n<p class=\"\" data-start=\"2332\" data-end=\"2341\">Contents:<\/p>\n<div class=\"contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-sidebar-surface-primary text-token-text-secondary dark:bg-token-main-surface-secondary flex items-center rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\"><span class=\"hljs-meta\">#!\/bin\/bash<\/span><br \/>\n<span class=\"hljs-built_in\">exec<\/span> \/usr\/bin\/msmtp --file=\/usr\/local\/etc\/msmtprc -- <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$@<\/span><\/span>\"<br \/>\n<\/code><\/div>\n<\/div>\n<p class=\"\" data-start=\"2426\" data-end=\"2442\">Made executable:<\/p>\n<div class=\"contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-sidebar-surface-primary text-token-text-secondary dark:bg-token-main-surface-secondary flex items-center rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\"><span class=\"hljs-built_in\">chmod<\/span> +x \/usr\/local\/bin\/msmtp-wrapper<\/code><\/div>\n<\/div>\n<\/div>\n<\/div>\n<div dir=\"ltr\"><\/div>\n<div dir=\"ltr\">\n<h2 class=\"\" data-start=\"142\" data-end=\"208\"><span style=\"font-size: 24pt;\"><strong data-start=\"149\" data-end=\"208\">12. Configuring Postfix to Use msmtp\u00a0<\/strong><\/span><\/h2>\n<p class=\"\" data-start=\"210\" data-end=\"371\">Once <code data-start=\"215\" data-end=\"222\">msmtp<\/code> and the wrapper script were ready, I integrated it with Postfix and secured the relay so that only authorized copier IPs could send mail through it.<\/p>\n<hr class=\"\" data-start=\"373\" data-end=\"376\" \/>\n<h3 class=\"\" data-start=\"378\" data-end=\"420\"><strong data-start=\"384\" data-end=\"420\">Integrating msmtp into Postfix<\/strong><\/h3>\n<h4 class=\"\" data-start=\"422\" data-end=\"493\">Edited <code data-start=\"434\" data-end=\"458\">\/etc\/postfix\/master.cf<\/code> to add a custom <code data-start=\"475\" data-end=\"482\">msmtp<\/code> transport:<\/h4>\n<div class=\"contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-sidebar-surface-primary text-token-text-secondary dark:bg-token-main-surface-secondary flex items-center rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-ini\">msmtp   unix  -       n       n       -       -       pipe<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-ini\">  <span class=\"hljs-attr\">flags<\/span>=F user=postfix argv=\/usr\/local\/bin\/msmtp-wrapper -t<br \/>\n<\/code><\/div>\n<\/div>\n<p class=\"\" data-start=\"626\" data-end=\"700\">This tells Postfix to hand off messages using the wrapper script we wrote.<\/p>\n<hr class=\"\" data-start=\"702\" data-end=\"705\" \/>\n<h4 class=\"\" data-start=\"707\" data-end=\"772\">Edited <code data-start=\"719\" data-end=\"741\">\/etc\/postfix\/main.cf<\/code> to activate the new transport:<\/h4>\n<div class=\"contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-sidebar-surface-primary text-token-text-secondary dark:bg-token-main-surface-secondary flex items-center rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-ini\"><span class=\"hljs-attr\">default_transport<\/span> = msmtp<br \/>\n<span class=\"hljs-attr\">relay_transport<\/span> = msmtp<br \/>\n<\/code><\/div>\n<\/div>\n<p class=\"\" data-start=\"836\" data-end=\"853\">Reloaded Postfix:<\/p>\n<div class=\"contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary\">\n<div class=\"flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]\"><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">sudo systemctl restart postfix<br \/>\n<\/code><\/div>\n<\/div>\n<p class=\"\" data-start=\"899\" data-end=\"1012\">At this point, mail accepted by Postfix is passed directly to <code data-start=\"963\" data-end=\"970\">msmtp<\/code> for authenticated delivery through Gmail.<\/p>\n<hr class=\"\" data-start=\"1014\" data-end=\"1017\" \/>\n<h3 class=\"\" data-start=\"1019\" data-end=\"1066\"><span style=\"font-size: 24pt;\">13<strong data-start=\"1025\" data-end=\"1066\">. Restricting Access to Copier Subnet<\/strong><\/span><\/h3>\n<p class=\"\" data-start=\"1068\" data-end=\"1198\">To ensure only authorized copiers could send mail, I updated the Postfix config to allow mail only from a trusted internal subnet.<\/p>\n<p class=\"\" data-start=\"1200\" data-end=\"1235\">In <code data-start=\"1203\" data-end=\"1225\">\/etc\/postfix\/main.cf<\/code>, I added:<\/p>\n<div class=\"contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-sidebar-surface-primary text-token-text-secondary dark:bg-token-main-surface-secondary flex items-center rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-ini\"><span class=\"hljs-attr\">mynetworks<\/span> = <span class=\"hljs-number\">127.0<\/span>.<span class=\"hljs-number\">0.0<\/span>\/<span class=\"hljs-number\">8<\/span>, [::<span class=\"hljs-number\">1<\/span>]\/<span class=\"hljs-number\">128<\/span>, <span class=\"hljs-number\">192.0<\/span>.<span class=\"hljs-number\">2.0<\/span>\/<span class=\"hljs-number\">24<\/span><br \/>\n<span class=\"hljs-attr\">smtpd_recipient_restrictions<\/span> = permit_mynetworks, reject_unauth_destination<br \/>\n<\/code><\/div>\n<\/div>\n<ul data-start=\"1375\" data-end=\"1502\">\n<li class=\"\" data-start=\"1375\" data-end=\"1433\">\n<p class=\"\" data-start=\"1377\" data-end=\"1433\"><code data-start=\"1377\" data-end=\"1389\">mynetworks<\/code> defines allowed source IPs (copier subnet).<\/p>\n<\/li>\n<li class=\"\" data-start=\"1434\" data-end=\"1502\">\n<p class=\"\" data-start=\"1436\" data-end=\"1502\"><code data-start=\"1436\" data-end=\"1466\">smtpd_recipient_restrictions<\/code> blocks all other relaying attempts.<\/p>\n<\/li>\n<\/ul>\n<p class=\"\" data-start=\"1504\" data-end=\"1527\">Reloaded Postfix again:<\/p>\n<div class=\"contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-sidebar-surface-primary text-token-text-secondary dark:bg-token-main-surface-secondary flex items-center rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">sudo systemctl restart postfix<br \/>\n<\/code><\/div>\n<\/div>\n<p class=\"\" data-start=\"1573\" data-end=\"1656\">This ensures <strong data-start=\"1588\" data-end=\"1625\">only devices on the copier subnet<\/strong> are allowed to relay messages.<\/p>\n<h2 class=\"\" data-start=\"138\" data-end=\"193\"><span style=\"font-size: 24pt;\"><strong data-start=\"145\" data-end=\"193\">14. Configuring the Copier to Use the SMTP Relay<\/strong><\/span><\/h2>\n<p class=\"\" data-start=\"195\" data-end=\"323\">Once the relay server was configured and secured, I updated the copier\u2019s SMTP settings so it could send scans through the relay.<\/p>\n<hr class=\"\" data-start=\"325\" data-end=\"328\" \/>\n<h3 class=\"\" data-start=\"330\" data-end=\"360\"><strong data-start=\"336\" data-end=\"360\">Copier SMTP Settings<\/strong><\/h3>\n<p class=\"\" data-start=\"362\" data-end=\"422\">On the copier\u2019s admin interface, I configured the following:<\/p>\n<div class=\"_tableContainer_16hzy_1\">\n<div class=\"_tableWrapper_16hzy_14 group flex w-fit flex-col-reverse\">\n<table class=\"w-fit min-w-(--thread-content-width)\" data-start=\"424\" data-end=\"765\">\n<thead data-start=\"424\" data-end=\"472\">\n<tr data-start=\"424\" data-end=\"472\">\n<th data-start=\"424\" data-end=\"446\" data-col-size=\"sm\">Setting<\/th>\n<th data-start=\"446\" data-end=\"472\" data-col-size=\"sm\">Value<\/th>\n<\/tr>\n<\/thead>\n<tbody data-start=\"520\" data-end=\"765\">\n<tr data-start=\"520\" data-end=\"567\">\n<td data-start=\"520\" data-end=\"542\" data-col-size=\"sm\"><strong data-start=\"522\" data-end=\"537\">SMTP Server<\/strong><\/td>\n<td data-col-size=\"sm\" data-start=\"542\" data-end=\"567\"><code data-start=\"544\" data-end=\"556\">192.0.2.10<\/code><\/td>\n<\/tr>\n<tr data-start=\"568\" data-end=\"615\">\n<td data-start=\"568\" data-end=\"590\" data-col-size=\"sm\"><strong data-start=\"570\" data-end=\"578\">Port<\/strong><\/td>\n<td data-col-size=\"sm\" data-start=\"590\" data-end=\"615\"><code data-start=\"592\" data-end=\"596\">25<\/code><\/td>\n<\/tr>\n<tr data-start=\"616\" data-end=\"663\">\n<td data-start=\"616\" data-end=\"638\" data-col-size=\"sm\"><strong data-start=\"618\" data-end=\"629\">SSL\/TLS<\/strong><\/td>\n<td data-col-size=\"sm\" data-start=\"638\" data-end=\"663\">Disabled<\/td>\n<\/tr>\n<tr data-start=\"664\" data-end=\"711\">\n<td data-start=\"664\" data-end=\"686\" data-col-size=\"sm\"><strong data-start=\"666\" data-end=\"684\">Authentication<\/strong><\/td>\n<td data-col-size=\"sm\" data-start=\"686\" data-end=\"711\">None<\/td>\n<\/tr>\n<tr data-start=\"712\" data-end=\"765\">\n<td data-start=\"712\" data-end=\"735\" data-col-size=\"sm\"><strong data-start=\"714\" data-end=\"732\">Sender Address<\/strong><\/td>\n<td data-start=\"735\" data-end=\"765\" data-col-size=\"sm\"><code data-start=\"737\" data-end=\"763\">copier@exampledomain.com<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<p><!----comment node----><!--a=1--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. Overview This guide documents how I configured a Linux-based SMTP relay server to allow office copiers to send email securely through Gmail. The project solved the challenge of devices that do not support OAuth2 authentication, enabling them to send authenticated email while complying with Gmail&#8217;s security requirements. This SMTP relay solution: Authenticates outbound email &hellip; <a href=\"https:\/\/wordpress.nationaltrail.k12.oh.us\/ittech\/2026\/05\/14\/setting-up-smtp-relay-using-postfix-and-msmtp\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Setting Up SMTP Relay Using Postfix and MSMTP<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":288,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-4862","post","type-post","status-publish","format-standard","hentry","category-nt-it-reviews"],"_links":{"self":[{"href":"https:\/\/wordpress.nationaltrail.k12.oh.us\/ittech\/wp-json\/wp\/v2\/posts\/4862","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.nationaltrail.k12.oh.us\/ittech\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.nationaltrail.k12.oh.us\/ittech\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.nationaltrail.k12.oh.us\/ittech\/wp-json\/wp\/v2\/users\/288"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.nationaltrail.k12.oh.us\/ittech\/wp-json\/wp\/v2\/comments?post=4862"}],"version-history":[{"count":6,"href":"https:\/\/wordpress.nationaltrail.k12.oh.us\/ittech\/wp-json\/wp\/v2\/posts\/4862\/revisions"}],"predecessor-version":[{"id":5159,"href":"https:\/\/wordpress.nationaltrail.k12.oh.us\/ittech\/wp-json\/wp\/v2\/posts\/4862\/revisions\/5159"}],"wp:attachment":[{"href":"https:\/\/wordpress.nationaltrail.k12.oh.us\/ittech\/wp-json\/wp\/v2\/media?parent=4862"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.nationaltrail.k12.oh.us\/ittech\/wp-json\/wp\/v2\/categories?post=4862"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.nationaltrail.k12.oh.us\/ittech\/wp-json\/wp\/v2\/tags?post=4862"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}