Send email: Difference between revisions
Content added Content deleted
(Added Wren) |
m (→{{header|Phix}}: added syntax colouring, marked p2js incompatible) |
||
Line 1,253: | Line 1,253: | ||
Obviously, USER/PWD/URL/etc. would all need altering for your details. |
Obviously, USER/PWD/URL/etc. would all need altering for your details. |
||
For gmail, make sure you enable https://myaccount.google.com/lesssecureapps |
For gmail, make sure you enable https://myaccount.google.com/lesssecureapps |
||
<lang Phix> |
<!--<lang Phix>(notonline)--> |
||
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span> <span style="color: #000080;font-style:italic;">-- (libcurl)</span> |
|||
<span style="color: #008080;">include</span> <span style="color: #000000;">builtins</span><span style="color: #0000FF;">\</span><span style="color: #000000;">libcurl</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span> |
|||
constant USER = "you@gmail.com", |
|||
PWD = "secret", |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">USER</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"you@gmail.com"</span><span style="color: #0000FF;">,</span> |
|||
URL = "smtps://smtp.gmail.com:465", |
|||
<span style="color: #000000;">PWD</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"secret"</span><span style="color: #0000FF;">,</span> |
|||
FROM = "sender@gmail.com", |
|||
<span style="color: #000000;">URL</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"smtps://smtp.gmail.com:465"</span><span style="color: #0000FF;">,</span> |
|||
TO = "addressee@email.com", |
|||
<span style="color: #000000;">FROM</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"sender@gmail.com"</span><span style="color: #0000FF;">,</span> |
|||
CC = "info@example.org", |
|||
<span style="color: #000000;">TO</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"addressee@email.com"</span><span style="color: #0000FF;">,</span> |
|||
FMT = "Date: Mon, 13 Jun 2018 11:30:00 +0100\r\n"& |
|||
<span style="color: #000000;">CC</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"info@example.org"</span><span style="color: #0000FF;">,</span> |
|||
"To: %s\r\n"& |
|||
<span style="color: #000000;">FMT</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"Date: Mon, 13 Jun 2018 11:30:00 +0100\r\n"</span><span style="color: #0000FF;">&</span> |
|||
"From: %s (Example User)\r\n"& |
|||
" |
<span style="color: #008000;">"To: %s\r\n"</span><span style="color: #0000FF;">&</span> |
||
" |
<span style="color: #008000;">"From: %s (Example User)\r\n"</span><span style="color: #0000FF;">&</span> |
||
<span style="color: #008000;">"Cc: %s (Another example User)\r\n"</span><span style="color: #0000FF;">&</span> |
|||
"\r\n"& |
|||
<span style="color: #008000;">"Subject: Sanding mail via Phix\r\n"</span><span style="color: #0000FF;">&</span> |
|||
"\r\n"& |
<span style="color: #008000;">"\r\n"</span><span style="color: #0000FF;">&</span> |
||
<span style="color: #008000;">"This mail is being sent by a Phix program.\r\n"</span><span style="color: #0000FF;">&</span> |
|||
<span style="color: #008000;">"\r\n"</span><span style="color: #0000FF;">&</span> |
|||
"Which is, however, probably not written in Phix.\r\n" |
|||
<span style="color: #008000;">"It connects to the GMail SMTP server, by far the most popular mail program of all.\r\n"</span><span style="color: #0000FF;">&</span> |
|||
<span style="color: #008000;">"Which is, however, probably not written in Phix.\r\n"</span> |
|||
function read_callback(atom pbuffer, integer size, nmemb, atom pUserData) |
|||
-- copy a maximum of size*nmemb bytes into pbuffer |
|||
<span style="color: #008080;">function</span> <span style="color: #000000;">read_callback</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">pbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">size</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">nmemb</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">pUserData</span><span style="color: #0000FF;">)</span> |
|||
if size==0 or nmemb==0 or size*nmemb<1 then return 0 end if |
|||
<span style="color: #000080;font-style:italic;">-- copy a maximum of size*nmemb bytes into pbuffer</span> |
|||
{integer sent, integer len, atom pPayload} = peekns({pUserData,3}) |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">size</span><span style="color: #0000FF;">==</span><span style="color: #000000;">0</span> <span style="color: #008080;">or</span> <span style="color: #000000;">nmemb</span><span style="color: #0000FF;">==</span><span style="color: #000000;">0</span> <span style="color: #008080;">or</span> <span style="color: #000000;">size</span><span style="color: #0000FF;">*</span><span style="color: #000000;">nmemb</span><span style="color: #0000FF;"><</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
integer bytes_written = min(size*nmemb,len-sent) |
|||
<span style="color: #0000FF;">{</span><span style="color: #004080;">integer</span> <span style="color: #000000;">sent</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">len</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">pPayload</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">peekns</span><span style="color: #0000FF;">({</span><span style="color: #000000;">pUserData</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">})</span> |
|||
mem_copy(pbuffer,pPayload+sent,bytes_written) |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">bytes_written</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">min</span><span style="color: #0000FF;">(</span><span style="color: #000000;">size</span><span style="color: #0000FF;">*</span><span style="color: #000000;">nmemb</span><span style="color: #0000FF;">,</span><span style="color: #000000;">len</span><span style="color: #0000FF;">-</span><span style="color: #000000;">sent</span><span style="color: #0000FF;">)</span> |
|||
sent += bytes_written |
|||
<span style="color: #7060A8;">mem_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pbuffer</span><span style="color: #0000FF;">,</span><span style="color: #000000;">pPayload</span><span style="color: #0000FF;">+</span><span style="color: #000000;">sent</span><span style="color: #0000FF;">,</span><span style="color: #000000;">bytes_written</span><span style="color: #0000FF;">)</span> |
|||
pokeN(pUserData,sent,machine_word()) |
|||
<span style="color: #000000;">sent</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">bytes_written</span> |
|||
-- printf(2, "*** We read %d bytes from file\n", bytes_written) |
|||
<span style="color: #7060A8;">pokeN</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pUserData</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sent</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">machine_word</span><span style="color: #0000FF;">())</span> |
|||
return bytes_written |
|||
<span style="color: #008080;">return</span> <span style="color: #000000;">bytes_written</span> |
|||
end function |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
constant read_cb = call_back({'+',routine_id("read_callback")}) |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">read_cb</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">call_back</span><span style="color: #0000FF;">({</span><span style="color: #008000;">'+'</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">routine_id</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"read_callback"</span><span style="color: #0000FF;">)})</span> |
|||
constant string payload_text = sprintf(FMT,{TO,FROM,CC}) |
|||
<span style="color: #008080;">constant</span> <span style="color: #004080;">string</span> <span style="color: #000000;">payload_text</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">FMT</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">TO</span><span style="color: #0000FF;">,</span><span style="color: #000000;">FROM</span><span style="color: #0000FF;">,</span><span style="color: #000000;">CC</span><span style="color: #0000FF;">})</span> |
|||
curl_global_init() |
|||
<span style="color: #7060A8;">curl_global_init</span><span style="color: #0000FF;">()</span> |
|||
CURLcode res = CURLE_OK |
|||
<span style="color: #004080;">CURLcode</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">CURLE_OK</span> |
|||
atom slist_recipients = NULL |
|||
<span style="color: #004080;">atom</span> <span style="color: #000000;">slist_recipients</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">NULL</span> |
|||
atom curl = curl_easy_init() |
|||
<span style="color: #004080;">atom</span> <span style="color: #000000;">curl</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">curl_easy_init</span><span style="color: #0000FF;">()</span> |
|||
curl_easy_setopt(curl, CURLOPT_USERNAME, USER) |
|||
<span style="color: #7060A8;">curl_easy_setopt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CURLOPT_USERNAME</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">USER</span><span style="color: #0000FF;">)</span> |
|||
curl_easy_setopt(curl, CURLOPT_PASSWORD, PWD) |
|||
<span style="color: #7060A8;">curl_easy_setopt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CURLOPT_PASSWORD</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">PWD</span><span style="color: #0000FF;">)</span> |
|||
curl_easy_setopt(curl, CURLOPT_URL, URL) |
|||
<span style="color: #7060A8;">curl_easy_setopt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CURLOPT_URL</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">URL</span><span style="color: #0000FF;">)</span> |
|||
curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL) |
|||
<span style="color: #7060A8;">curl_easy_setopt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CURLOPT_USE_SSL</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CURLUSESSL_ALL</span><span style="color: #0000FF;">)</span> |
|||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0) |
|||
<span style="color: #7060A8;">curl_easy_setopt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CURLOPT_SSL_VERIFYPEER</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> |
|||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0) |
|||
<span style="color: #7060A8;">curl_easy_setopt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CURLOPT_SSL_VERIFYHOST</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> |
|||
curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM) |
|||
<span style="color: #7060A8;">curl_easy_setopt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CURLOPT_MAIL_FROM</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">FROM</span><span style="color: #0000FF;">)</span> |
|||
slist_recipients = curl_slist_append(slist_recipients, TO) |
|||
<span style="color: #000000;">slist_recipients</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">curl_slist_append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">slist_recipients</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">TO</span><span style="color: #0000FF;">)</span> |
|||
slist_recipients = curl_slist_append(slist_recipients, CC) |
|||
<span style="color: #000000;">slist_recipients</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">curl_slist_append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">slist_recipients</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">CC</span><span style="color: #0000FF;">)</span> |
|||
curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, slist_recipients) |
|||
<span style="color: #7060A8;">curl_easy_setopt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CURLOPT_MAIL_RCPT</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">slist_recipients</span><span style="color: #0000FF;">)</span> |
|||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb); |
|||
<span style="color: #7060A8;">curl_easy_setopt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CURLOPT_READFUNCTION</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">read_cb</span><span style="color: #0000FF;">);</span> |
|||
atom pUserData = allocate(machine_word()*3), |
|||
<span style="color: #004080;">atom</span> <span style="color: #000000;">pUserData</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">allocate</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">machine_word</span><span style="color: #0000FF;">()*</span><span style="color: #000000;">3</span><span style="color: #0000FF;">),</span> |
|||
pPayload = allocate_string(payload_text) |
|||
<span style="color: #000000;">pPayload</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">allocate_string</span><span style="color: #0000FF;">(</span><span style="color: #000000;">payload_text</span><span style="color: #0000FF;">)</span> |
|||
pokeN(pUserData,{0,length(payload_text),pPayload},machine_word()) |
|||
<span style="color: #7060A8;">pokeN</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pUserData</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">payload_text</span><span style="color: #0000FF;">),</span><span style="color: #000000;">pPayload</span><span style="color: #0000FF;">},</span><span style="color: #7060A8;">machine_word</span><span style="color: #0000FF;">())</span> |
|||
curl_easy_setopt(curl, CURLOPT_READDATA, pUserData) |
|||
<span style="color: #7060A8;">curl_easy_setopt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CURLOPT_READDATA</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">pUserData</span><span style="color: #0000FF;">)</span> |
|||
curl_easy_setopt(curl, CURLOPT_UPLOAD, true) |
|||
<span style="color: #7060A8;">curl_easy_setopt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CURLOPT_UPLOAD</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">true</span><span style="color: #0000FF;">)</span> |
|||
--curl_easy_setopt(curl, CURLOPT_VERBOSE, true) |
|||
<span style="color: #000080;font-style:italic;">--curl_easy_setopt(curl, CURLOPT_VERBOSE, true)</span> |
|||
res = curl_easy_perform(curl) |
|||
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">curl_easy_perform</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">)</span> |
|||
if res!=CURLE_OK then |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">res</span><span style="color: #0000FF;">!=</span><span style="color: #004600;">CURLE_OK</span> <span style="color: #008080;">then</span> |
|||
printf(2, "curl_easy_perform() failed: %d (%s)\n",{res,curl_easy_strerror(res)}) |
|||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"curl_easy_perform() failed: %d (%s)\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">curl_easy_strerror</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">)})</span> |
|||
end if |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
curl_slist_free_all(slist_recipients) |
|||
<span style="color: #7060A8;">curl_slist_free_all</span><span style="color: #0000FF;">(</span><span style="color: #000000;">slist_recipients</span><span style="color: #0000FF;">)</span> |
|||
curl_easy_cleanup(curl) |
|||
<span style="color: #7060A8;">curl_easy_cleanup</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">)</span> |
|||
curl_global_cleanup()</lang> |
|||
<span style="color: #7060A8;">curl_global_cleanup</span><span style="color: #0000FF;">()</span> |
|||
<!--</lang>--> |
|||
=={{header|PHP}}== |
=={{header|PHP}}== |