Отправляем Email через терминал Windows Powershell (командная строка)

Windows Powershell

Следует начать с того, что Windows Powershell — это не стандартная командная строка с черным фоном. Это другая оболочка и фон у нее темно-синий. Она поставляется в системы Windows начиная в 7 версии. И с ее помощью можно отравлять письма на почту через SMPT сервер. В некоторых случаях такой способ отправки Email может выручить, когда все другие по каким-то причинам вам недоступны. Ну и для общей практики и знакомства с терминалом Windows Powershell и некоторыми его командами, которые в нем называются — командлеты. Вызвать окно Powershell очень просто. Достаточно нажать Win + R и вписать туда Powershell.

Для отправки вам потребуется доступ к почте (логин и пароль). С этого адреса будет отправлен Email.

А вот и сам скрипт:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$EmailTo = "po4ta@mail.ru"
$EmailFrom = "PowerShell mymail@yandex.ru"
$Subject = "Отправка из PowerShell"
$Body = "Тестовое сообщение, <b>отправленное</b> из командной строки PowerShell"
$SMTPServer = "smtp.yandex.ru" 
$filenameAndPath = "C:\Users\777\Downloads\003435.pdf"
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
$attachment = New-Object System.Net.Mail.Attachment($filenameAndPath)
$SMTPMessage.IsBodyHTML=$true
$SMTPMessage.Attachments.Add($attachment)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("mymail@ya.ru", "mymail123");
$SMTPClient.Send($SMTPMessage)

Теперь разберем более подробно.

1 Куда отправляем Email
2 Имя и адрес отправителя
3 Тема письма
4 Текст письма
5 Имя SMTP сервера
6 Путь к файлу-вложению (если нужен)
7, 8 Формирование объекта сообщения
9 Включение возможности отправлять HTML письма
10 Добавление вложения к письму
11 Указание порта SMTP сервера
12 Включение защищенного соединения SSl
13 Адрес и пароль почты. с которого будет отправка
14 Отправка сообщения

Особенное внимание прошу обратить на 9 строчку. Это полноценная возможность отправлять HTML письма через Windows Powershell по тому же принципу, как это делается в PHP. Необходимо ввести Email, кому вы хотите отправить сообщение, ввести свой адрес почты и пароль, написать текст, потом вставить все это в окно Powershell и нажать Enter. Можете потренироваться на своем ящике. У меня это выглядит вот так:

Отправка email через Windows Powershell
А само письмо вот так:
Email send from PowerShell

В основном эти терминалом пользуются системные администраторы и с его помощью можно решать различные задачи, но рядовому пользователю достаточно знать, что он есть (кстати многие не знают) и умеnь от править через него письмо. На этом знакомство с Windows Powershell подошло к концу. Напишите, знали вы о таком приложении в Виндовс или узнали впервые?

Длина строки и массива в PHP

Узнать длину строки и массива в PHP

Привет. В PHP довольно часто приходится работать со строками и массивами и почти во всех случаях требуется узнать их длину (length). Вполне типичная ситуация и для нее есть встроенные функции в PHP. Но есть некоторые нюансы, к примеру то, что одна из функций, которая показывает длину строки — srtlen считает не количество символов в тексте, а количество байт, который занимает каждый символ. Если латинский символ занимает 1 байт, то на кириллице он займет 2 байта. Об этом я же упоминал в статье по теме: как обрезать текст по количеству слов и символов. Но сейчас постараемся рассмотреть некоторые примеры более детально.

Узнать длину строки в PHP

Первая функция, которая будет вычислять длину строки в PHP, будет strlen.

1
2
3
$str = "Hello World";
echo strlen($str);
// 11 символов вместе с пробелом

А если мы напишем примерно то же самое, но на русском, то получим такой вариант:

1
2
3
$str = "Привет Мир";
echo strlen($str);
// 19 символов вместе с пробелом

В этом случае, как я уже говорил ранее, каждый символ займет 2 байта + 1 байт — это пробел. В итоге мы получим не совсем то, что ожидали. Поэтому в случае с кириллицей, чтобы определить длину строки, следует использовать другие функции. Первая — mb_strlen

1
2
3
$str = "Привет Мир";
echo mb_strlen($str);
// 10 символов вместе с пробелом

В этом случае подсчет символов в строки будет одинаковым как на английском, так и на русском языках. Даже если символ занимает несколько байт, то будет посчитан, как один. Так же есть еще одна функция, чтобы узнать длину строки в символах — iconv_strlen

1
2
3
$str = "Привет Мир";
echo iconv_strlen($str);
// 10 символов вместе с пробелом

iconv_strlen учитывает кодировку строки, ее можно указать вторым параметром. Если она не указана, то кодировка будет внутренней. То есть самого файла.

echo iconv_strlen($str, "UTF-8");

Если возникла необходимость проверить длину строки без пробелов, то потребуется дополнительная функция str_replace

1
2
3
4
$str = "Привет Мир";
echo iconv_strlen(str_replace(' ', '', $str));
// 9 символов без пробелов
//iconv_strlen или mb_strlen

Узнать длину массива в PHP

функция, которая позволяет узнать длину массива в PHP — count.

1
2
3
$arr = ["Иван", "Марина", "Сергей", "Алина"];
echo 'Длина массива ' . count($arr) . ' элемента';
// Длина массива: 4 элемента

То же самое будет с массивом, где есть ключи и значения.

1
2
3
$arr = ['name' => "Иван", "city" => "NY", "age" => 34];
echo 'Длина массива ' . count($arr) . ' элемента';
// Длина массива: 3 элемента

Можно резюмировать:

strlen() Подсчет количества байт в строке
mb_stren() Подсчет символов в строке
iconv_strlen() Подсчет символов строки с учетом кодировки
count() Подсчет элементов массива

На этом можно завершить. Теперь вы можете самостоятельно узнать длину строки в PHP и определить длину массива. А если возникнут вопросы, задавайте их в комментариях.

Если в фотошопе пропала кисть (не видно размер)

Вернуть размер кисти в фотошопе

Привет. Если у вас в фотошопе пропала кисть, то есть сам кружок (радиус) кисти и не видно какого она размера, а вместо этого появился крестик. Не видя четкие границы кисти очень сложно что-то нарисовать. Причем с инструментом Ластик происходит то же самое. Если вы хотите узнать как вернуть все обратно, чтобы снова был виден контур кисти, то это даже проще, чем вы думаете. Дело в том, что на многие инструменты в фотошопе назначены горячие клавиши и на размер кисти назначена клавиша Caps Lock и по всей видимости вы случайно ее нажали.

Клавиша Caps Lock на клавиатуре

Чтобы вернуть размер кисти в исходное состояние вам нужно всего лишь еще раз нажать на клавишу Caps Lock И как вы уже поняли, это занимает 1 секунду. Зато теперь вы знаете почему пропадает кисть в фотошопе и сможете легко и , что самое главное, — быстро это исправить и вернуть кисть как она должна быть изначально. Это, наверное, самый короткий урок на моем сайте.

Проверка на массив, на наличие элементов и на пустоту в PHP

Проверка массива на пустоту

В этой статье будем делать различные проверки массива. В том числе проверим является ли переменная массивом, а так же проверим есть ли у ключей массива пустые значения. Будем двигаться от простого к более сложному. И первое, что можно сделать, это проверить на массив. Для этого нам помоет встроенная в язык PHP функция is_array. Разберем небольшой пример.

1
2
3
4
5
6
$arr = ['id', 'name', 'email']; // Массив элементов
if(is_array($arr)){
  echo 'Это массив';
}else{
  echo 'Это не массив';
}

Функция вернет true, если это массив и false — если не массив. Это простой пример и сложностей возникнуть не должно. Перейдем к следующему примеру.

Проверка массива на пустоту и пустые элементы в PHP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$arr = [];
if(empty($arr)){
  echo 'Массив пустой';  
}else{
  echo 'Есть элементы';
}
// Выведет сообщение, что массив пустой
 
$arr = ['']; 
if(empty($arr)){
  echo 'Массив пустой';  
}else{
  echo 'Есть элементы';
}
// Массив будет не пустым даже если в нем только кавычки.

Функция empty сработает только в том случае, когда в массиве нет вообще никаких элементов. Поэтому ее лучше не использовать при проверке массивов. В этом случае нам поможет еще одна функция — array_diff. С ее помощью мы сравним исходный массив с другим массивом и в случае расхождения выведем элементы массива, которые не совпадают. Может быть немного сумбурно и не понятно, но давайте разберем на примере.

1
2
3
4
$arr = ['name', '', 'num', NULL, '', false, 'Alex', ''];
var_dump($arr);
$new_arr = array_diff($arr, array('', NULL, false));
var_dump($new_arr);

Получим следующее:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
array(8) {
  [0]=>
  string(4) "name"
  [1]=>
  string(0) ""
  [2]=>
  string(3) "num"
  [3]=>
  [4]=>
  string(0) ""
  [5]=>
  [6]=>
  string(4) "Alex"
  [7]=>
  string(0) ""
}
 
array(3) {
  [0]=>
  string(4) "name"
  [2]=>
  string(3) "num"
  [6]=>
  string(4) "Alex"
}

Функция пропустит все пустые элемент массива, в том числе NULL и false и выведет только те, в которых что-то есть. Мы так же можем проверить какой именно элемент массива был пустой с помощью цикла for.

1
2
3
4
5
6
7
8
$arr = ['name', '', 'num', NULL, '', false, 'Alex', ''];
for($i=0; $i < count($arr); $i++) {
 if (empty($arr[$i])){
echo "Элемент $i пустой"."<br>";
}else{
echo "Элемент $i не пустой"."<br />";
}
 }

В итоге получим это:

1
2
3
4
5
6
7
8
Элемент 0 не пустой
Элемент 1 пустой
Элемент 2 не пустой
Элемент 3 пустой
Элемент 4 пустой
Элемент 5 пустой
Элемент 6 не пустой
Элемент 7 пустой

Но массивы бывают разные, в том числе с ключами и значениями. И цикл for в этом случае тоже справится точно так же.

1
2
3
4
5
6
7
8
$arr=['age'=> 34,'name'=>'Ivan','city'=>'', 'number'=>''];
for($i=0; $i < count($arr); $i++) {
 if (empty($arr[$i])){
echo "Элемент $i пустой"."<br>";
}else{
echo "Элемент $i не пустой"."<br />";
}
 }

При желании можно принудительно удалить ключи массива, в которых пустые значения. Для этого задействуем цикл foreach и функцию unset.

1
2
3
4
5
6
7
8
$arr=['age'=> 34,'name'=>'Ivan','city'=>'', 'number'=>''];
var_dump($arr);
foreach ($arr as $key => $value) {
  if (empty($value)) { //проверrf на пустоту
    unset($arr[$key]); // Удаляем ключ массива
}
  }
var_dump($arr);

Получаем следующее:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
array(4) {
  ["age"]=>
  int(34)
  ["name"]=>
  string(4) "Ivan"
  ["city"]=>
  string(0) ""
  ["number"]=>
  string(0) ""
}
array(2) {
  ["age"]=>
  int(34)
  ["name"]=>
  string(4) "Ivan"
}

Проверить наличие элемента в массиве

Для этих целей подойдет функция in_array. Она проверяет на присутствие в массиве значения.

1
2
3
4
5
6
7
$arr=['age'=> 34,'name'=>'Ivan','city'=>'', 'number'=>''];
 
if (in_array('Ivan', $arr)) {
  echo 'YES';
}else{
  echo 'NO';
}

Первым аргументом указываем что будем искать, вторым — где. На этом по работе с массивами окончен. Надеюсь, что вам в нем все было понятно. Но если остались какие-то вопросы, задавайте их в комментариях.

Защита формы обратной связи от спама на PHP и JavaScript

Спам не пройдет

Всем привет. Если вы читаете эту статью, то вероятнее всего столкнулись с проблемой, которая выражается в виде спама через форму обратной связи на сайте. К сожалению спама меньше не становится и нужно от этого как-то защищаться. Способы существуют, их несколько, но мы рассмотрим один, на мой взгляд весьма эффективный. Сразу скажу, что не будем привязываться к какому-то конкретному движку, сделаем все своими руками. Прежде, чем писать защиту формы от спама, следует отметить, что в большинстве случаев спам приходит автоматический, это так называемые спам-боты, которые рассылают сообщения на тысячи сайтов. Сканируется сайт на наличие формы обратной связи и если она есть, поля заполняются и тут же идет отправка.

Защита формы от спама. Теория

Что бы будем делать?

  • Добавим к форме input с типом hidden и пустым значением (value)
  • По нажатию на кнопку отправки данных формы будем подставлять какое-то значение в скрытый input
  • На стороне сервера примем данные из скрытого инпута
  • Сделаем проверку. Если значение скрытого поля не равно тому, что мы в него передали через JS, то форма отправлена не будет.

Как правило боты не делают нажатие на кнопку отправки и это легко проверить, установив в Яндекс Метрике соответствующие цели. Поэтому такой способ должен защитить сайт от спама если не совсем, то ограничить его поступление до минимума. То есть будут приходить сообщения только если живой человек отправит форму самостоятельно, то есть нажмет на кнопку. Итак, приступим. Добавляем в форму скрытое поле:

Защита контактной формы от спама. Практика

<input type="hidden" name="code" value="" id="code"/>

В JavaScript пишем следующее:

1
2
3
4
let code = document.querySelector('#code'); // Получаем скрытый input
  document.querySelector('.btn').onclick = function(){ // Клик по кнопке отправки
    code.value = 'NOSPAM'; // Подставляем значение в value инпута
  };

После клика скрытое поле будет выглядеть примерно так:

<input type="hidden" name="code" value="NOSPAM" class="code"/>

Теперь сделаем проверку на PHP.

1
2
3
if ($_POST['code'] != 'NOSPAM') {
  exit;
}

На этом защиту от спама можно было бы завершить, но как быть с движками типа WordPress? Для CMS существует огромное количество плагинов по защите от различного рода взломов, атак и спама, но при желании можно внедрить и этот способ, но это тема для отдельной статьи или целого видео-урока. Возможно в ближайшее время я выпущу материал на эту тему. А какие способы защиты от спама знаете вы?