شما می توانید به صورت برنامه نویسی ایمیل در Golang ارسال کنید. یاد بگیرید که چگونه این کار را بدون استفاده از هیچ بسته خارجی انجام دهید.
ممکن است اغلب نیاز داشته باشید که با استفاده از برنامه هایی برای احراز هویت و بسیاری از اهداف دیگر به بسیاری از حساب ها ایمیل ارسال کنید.
پروتکل SMTP استانداردهایی را تعریف می کند که امکان برقراری ارتباط ایمیل بین سرورهای ایمیل و عوامل انتقال نامه را فراهم می کند، در حالی که پروتکل IMAP برای دریافت ایمیل است.
Go عملکردی را برای فعالیتهای مرتبط با ایمیل تعریف شده توسط RFC در بسته net/smtp ارائه میکند، که همچنین شامل پسوندهای 8BITMIME، AUTH و STARTTLS است.
کد مورد استفاده در این پروژه در a موجود است
مخزن GitHub
و استفاده از آن تحت مجوز MIT برای شما رایگان است.
نحوه ارسال ایمیل در Go با استفاده از بسته Net/SMTP
بسته net/smtp بخشی از کتابخانه استاندارد Go است، بنابراین نیازی به نصب هیچ بسته خارجی ندارید. شما فقط باید بسته را قبل از استفاده از آن وارد کنید.
import (
"net/smtp"
"log"
"crypto/tls"
"fmt"
)
همچنین باید بسته log را برای ثبت خطاها به کنسول وارد کنید و بسته crypto/tls را برای پیکربندی اتصال ایمن وارد کنید.
هنگامی که بسته net/smtp را وارد کردید، باید یک تابع ()SendMail برای ارسال نامه بنویسید و سپس تابع را در تابع اصلی فراخوانی کنید.
func main() {
fmt.Print(SendMail())
}
func SendMail() string {
// Add code here
}
تابع SendMail() حاوی کدی است که نامه را برای گیرندگان می فرستد.
نحوه کار ارسال ایمیل
پروتکل SMTP پارامترهایی را تعریف می کند که هر نامه ای باید داشته باشد. این پارامترها عبارتند از آدرس ایمیل فرستنده و گیرنده، پورتی که نامه بر روی آن ارسال می شود، سرور میزبان و یک پیام.
پارامترهای ذکر شده در بالا برای ارسال ایمیل مهم هستند.
در این آموزش، ارسال ایمیل یاهو را یاد خواهید گرفت. با این حال، فرآیند برای هر Mail Server Provider (MSP) که استفاده می کنید یکسان است.
از آنجایی که از ایمیل یاهو استفاده می کنید، وارد حساب یاهو میل خود شوید، به اطلاعات حساب بروید و روی تب امنیت حساب کلیک کنید. سپس یک رمز عبور برنامه ایجاد کنید. شما باید نام برنامه را انتخاب کنید و سپس Yahoo Mail یک رمز عبور برای برنامه ایجاد می کند و می توانید رمز عبور را در کد خود به همراه آدرس ایمیل خود استفاده کنید.
در تابع SendMail() سه متغیر را اعلام خواهید کرد. متغیری که رشته ایمیل شما را نگه می دارد، یکی که رمز ایمیل شما را نگه می دارد و رشته ای که آدرس ایمیلی را که به آن پیام می فرستید را نگه می دارد.
from := "yourMail@gmail.com"
password := "aSecurePasswordHere"
to := "anemail@gmail.com"
اگر میخواهید عناصر را برای چندین گیرنده ارسال کنید، میتوانید از یک برش استفاده کنید و از میان آنها حلقه بزنید.
دریافت و تنظیم هاست و پورت ایمیل
پروتکل SMTP از شماره هاست و پورت برای شناسایی منبع ایمیل استفاده می کند. این جایی است که MSP شما وارد می شود. شما باید شماره هاست و پورت را بدانید که MSP شما به شما اجازه استفاده از آن را می دهد.
اگر از ایمیلهای عمومی مانند Gmail، Yahoo یا Outlook استفاده میکنید، این منبع را برای فهرستی از میزبانهای MSP و شماره پورت بررسی کنید. گوگل «برنامههای کمتر امن» را برای جیمیل خاموش کرده است. اگر از Gmail استفاده می کنید، ممکن است بخواهید برنامه خود را ایمن کنید.
هنگامی که شماره پورت و آدرس میزبان را دریافت کردید، آنها را به متغیرهایی مانند زیر اختصاص دهید:
host := "smtp.mail.yahoo.com"
port := "465"
شماره هاست و پورت بالا از Yahoo Mail برای استفاده در حساب های معمولی است. سرور در smtp.mail.yahoo.com میزبانی می شود و شما مجاز به استفاده از پورت 465 برای ارسال ایمیل هستید.
اعلام محتویات ایمیل
مرحله بعدی این است که محتوای نامه را به عنوان متغیر اعلام کنید. موضوع و بدن پیام را می سازند.
subject := "Hey, I'm Just Checking On You."
body := "Hope you're doing okay! How are you doing today. "
متغیر موضوع موضوع ایمیل است. متغیر body متن ایمیلی است که شما ارسال می کنید.
تنظیم سرصفحه های ایمیل
برای نشان دادن سرصفحه های ایمیل، باید یک نقشه از رشته ها تهیه کنید.
headers := make(map[string]string)
headers["From"] = from
headers["To"] = to
headers["Subject"] = subject
message := ""
for k, v := range headers {
message += fmt.Sprintf("%s: %s\r", k, v)
}
message += "\r" + body
ابتدا نقشه ای از کلیدها و مقادیر رشته ایجاد می کنید و هدر آدرس خود، آدرس گیرنده و موضوع را مطابق تصویر بالا تنظیم می کنید. با استفاده از یک محدوده برای حلقه در نقشه سرصفحه ها، یک متغیر پیام حاوی سرصفحه ها و پیام با استفاده از قالب بندی رشته ای اعلام می شود.
احراز هویت ایمیل
ایمیل برای تایید منبع نیاز به احراز هویت دارد. بسته smtp قابلیتی برای احراز هویت ایمیل با استفاده از PlainAuth فراهم می کند. متد PlainAuth هویت، ایمیل فرستنده، رمز عبور و میزبان را به عنوان پارامترها در نظر می گیرد و یک شی Auth را که برای ارسال ایمیل استفاده می کنید، برمی گرداند.
authenticate := smtp.PlainAuth("", from, password, host)
هویت همان نام کاربری شما است که همانطور که در این مورد مشاهده می شود می توان آن را خالی گذاشت.
ایجاد یک اتصال برای ایمیل
برخی از ارائه دهندگان خدمات ایمیل از شما می خواهند که ایمیل را از طریق یک اتصال ارسال کنید. در این مقاله، ما یک اتصال TCP به سرور با تنظیمات TLS ایجاد می کنیم.
tlsConfig := &tls.Config{
InsecureSkipVerify: true,
ServerName: host,
}
در کد بالا، با ارجاع به ساختار Config که در آن InsecureSkipVerify روی true تنظیم شده بود، یک پیکربندی TLS ایجاد کردید و نام سرور به متغیر میزبان اختصاص داده شد.
باید با استفاده از روش Dial بسته tls یک اتصال TCP ایجاد کنید. روش شماره گیری نوع اتصال (TCP)، در این مورد، آدرس سرور و تنظیمات اتصال TLS را می گیرد.
connection, err := tls.Dial("tcp", serverAddress, tlsConfig) err != nil {
log.Panic(err)
}
در کد بالا، یک اتصال TCP ایجاد کردید و خطاها را مدیریت کردید. شما یک بسته جدید smtp را با استفاده از روش NewClient از بسته net/smtp ارائه خواهید کرد. روش NewClient به ترتیب یک اتصال و میزبان را می گیرد.
smtpClient, err := smtp.NewClient(connection, host)
if err != nil {
log.Panic(err)
}
اکنون که یک نمونه مشتری smtp ایجاد کرده اید، باید پارامترهای smtpClient را تنظیم کرده و خطاها را مدیریت کنید.
if err = smtpClient.Auth(authenticate); err != nil {
log.Panic(err)
}
if err = smtpClient.Mail(from); err != nil {
log.Panic(err)
}
if err = smtpClient.Rcpt(headers["To"]); err != nil {
log.Panic(err)
}
در مثال بالا، شما پارامترهای احراز هویت، آدرس فرستنده و آدرس گیرنده را به روشهای مربوطه ارسال کردید و خطاها را مدیریت کردید.
در نهایت، شما باید در نمونه اتصال بنویسید، و می توانید با ایجاد یک نویسنده با استفاده از روش Data نمونه مشتری smtp خود، این کار را انجام دهید.
writer, err := smtpClient.Data()
if err != nil {
log.Panic(err)
}
_, err = writer.Write([]byte(message))
if err != nil {
log.Panic(err)
}
پس از ایجاد یک رایتر، با استفاده از روش Write مانند مثال بالا، یک تکه بایتی از پیام را می نویسید.
err = writer.Close()
if err != nil {
log.Panic(err)
}
err = smtpClient.Quit()
if err != nil {
return
}
return "Successful, the mail was sent!"
رایتر را ببندید و با استفاده از کد بالا از نمونه اتصال کلاینت smtp خارج شوید. تابع SendMail() یک پیام موفقیت آمیز برمی گرداند، همانطور که در بالا نشان داده شده است.
هنگام فراخوانی تابع SendMail() در تابع اصلی، باید پیام موفقیت را در کنسول خود ثبت کنید و ایمیل را برای گیرنده خود ارسال کنید.
چیزهای بیشتری به بسته Net وجود دارد
بسته net شامل بسته های زیادی برای عملکردهای مرتبط با شبکه است که بسته smtp تنها یکی از آنهاست. همچنین می توانید از بسته های TCP و HTTP برای توسعه مرتبط با شبکه استفاده کنید.
اگر شما یک توسعه دهنده باطن نیستید، ممکن است بسته net/smtp بسیار زیاد باشد. گزینه های بسیار دیگری برای ارسال سریع ایمیل با خطوط کد کمتر وجود دارد. میتوانید شرکتهای بازاریابی ایمیلی مانند SendGrid، Twilio، و MailChimp و سرویسهای خبرنامه مانند Substack و Revue را بررسی کنید که به شما امکان میدهند بدون استرس برای بسیاری از کاربران ایمیل ارسال کنید.