Валидация электронной почты с проверкой MX на Golang

package main

import (
	"net"
	"regexp"
	"strings"
)

func isEmailValid(e string) bool {

	var emailRegex = regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$")

	if len(e) < 3 || len(e) > 254 {
		return false
	}
	if !emailRegex.MatchString(e) {
		return false
	}
	parts := strings.Split(e, "@")
	mx, err := net.LookupMX(parts[1])
	if err != nil || len(mx) == 0 {
		return false
	}
	return true

}

Отправка почты Sendmail SMTP яндекс на Golang

package main

import (
	"crypto/tls"
	"fmt"
	"log"
	"net"
	"net/mail"
	"net/smtp"
)

func sendmail(toEmail string, subj string, body string) {

	from := mail.Address{Name: "Name", Address: "no-replay@mail.com"}
	to := mail.Address{Name: "", Address: toEmail}

	headers := make(map[string]string)
	headers["From"] = from.String()
	headers["To"] = to.String()
	headers["Subject"] = subj

	message := ""
	for k, v := range headers {
		message += fmt.Sprintf("%s: %s\r\n", k, v)
	}
	message += "\r\n" + body

	servername := "smtp.yandex.ru:465"

	host, _, _ := net.SplitHostPort(servername)

	auth := smtp.PlainAuth("", "LOGIN", "PASSWORD", host)

	tlsconfig := &tls.Config{
		InsecureSkipVerify: true,
		ServerName:         host,
	}

	conn, err := tls.Dial("tcp", servername, tlsconfig)
	if err != nil {
		log.Panic(err)
	}

	a, err := smtp.NewClient(conn, host)
	if err != nil {
		log.Panic(err)
	}

	// Auth
	if err = a.Auth(auth); err != nil {
		log.Panic(err)
	}

	// To && From
	if err = a.Mail(from.Address); err != nil {
		log.Panic(err)
	}

	if err = a.Rcpt(to.Address); err != nil {
		log.Panic(err)
	}

	// Data
	w, err := a.Data()
	if err != nil {
		log.Panic(err)
	}

	_, err = w.Write([]byte(message))
	if err != nil {
		log.Panic(err)
	}

	err = w.Close()
	if err != nil {
		log.Panic(err)
	}

	a.Quit()

}

Ответы на вопросы компания MindK на темы Environment Automation and Services

Environment Automation

  • Знаком с базовыми принципами Continuous Integration.
    Это практика разработки ПО, которая заключается в слиянии рабочих копий в общую основную ветвь разработки и выполнении частых автоматизированных сборок проекта выполнении тестов и доставки его на продакт.
  • Знаком с одной из систем Continuous Integration.
    Jenkins, TeamCity, Travis CI
  • Настраивал простую сборку веб-проекта из системы контроля версий (например, GIT) на Linux сервер.
    Hook Pre-commit, post-commit
  • Имею практический опыт работы с Docker.
    Программное обеспечение для автоматизации развёртывания и управления приложениями в средах с поддержкой контейнеризации
  • Знаю как попасть по ssh в Docker контейнер.
    Для этого нужно установить и запустить на докер контейнере sshd
    apt-get install openssh-server
    mkdir /var/run/sshd
    chmod 0755 /var/run/sshd
    /usr/sbin/sshd
    useradd --create-home --shell /bin/bash --groups sudo username ## includes 'sudo'
    passwd username ## Enter a password

    А для выполнения произвольных команд достаточно попасть на баш
    docker ps
    docker exec -it bash
  • Знаю что такое и есть опыт работы с docker-compose.
    Файл compose используется для определения необходимых для приложения сервисов. Пример, подымаем веб = пхп + нджинкс:
version: '3'
services:
  web:
    image: nginx:alpine
    volumes:
      - "./etc/default.conf:/etc/nginx/conf.d/default.conf"
      - ".:/var/www/html"
      - "./etc/default.template.conf:/etc/nginx/conf.d/default.template"
    ports:
      - "80:80"
    environment:
      - NGINX_HOST=${NGINX_HOST}
    command: /bin/sh -c "envsubst '$$NGINX_HOST' < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
    restart: always
    depends_on:
      - php
  php:
    image: nanoninja/php-fpm:${PHP_VERSION}
    restart: always
    volumes:
      - "./etc/php.ini:/usr/local/etc/php/conf.d/php.ini"
      - .:/var/www/html

Services

  • Знаю сервисы Firebase и есть опыт работы с ними
    Firebase дает инструменты для быстрой разработки приложений
  • Realtime Database
    Облачная NoSQL база данных
  • Cloud Functions
    Выполнение бекенд кода на гугловском облаке
  • Authentication
    Бекенд сервисы (телефон, пароль, провайдеры типа твиттер и фейсбук) SDK для авторизации
  • Cloud Storage
    Облачное хранилище для файлов
  • Знаю сервисы AWS и есть опыт работы с ними.
    https://aws.amazon.com/ru/
  • Есть опыт работы с Google API (e.g. Google Maps API, OAUTH).
    https://developers.google.com/apis-explorer/#p/

Ответы на вопросы компания MindK на тему Client-server Model

– Знаю, что такое DNS и как его переопределить для локального компьютера.
Это система доменных имён, которая связывает названия доменов с IP-адресами компьютеров

– Знаю и понимаю предназначение HTTP протокола.
Протокол прикладного уровня передачи данных изначально — в виде гипертекстовых документов в формате «HTML»

– Знаю, что такое cookies.
Фрагмент данных, отправленный веб-сервером и хранимый на компьютере пользователя. Веб-клиент всякий раз при попытке открыть страницу сайта пересылает этот фрагмент данных веб-серверу в составе HTTP-запроса

– Знаю что такое URI/URL и из каких фрагментов он состоит.
Символьная строка, позволяющая идентифицировать какой-либо ресурс: документ, изображение, файл, службу, ящик электронной почты и т. Состоит из: схема, источник, путь, запрос, фрагмент.

– Знаю и работал на практике с GET и POST запросами, понимаю их отличие и специфику применения.
GET запрашивает представление указанного ресурса
POST передает данные, подлежащие обработке (например, из формы) в идентифицированный ресурс

– Знаю предназначение HEAD запроса.
Тот же GET только не возвращает тело ответа

– Знаю и использовал на практике запросы типа DELETE, PUT, UPDATE.
DELETE удаляет указанный ресурс, PUT заменяет все текущие представления ресурса данными запроса
UPDATE – такого нету

– Знаю основные коды состояний ответов (1XX, 2XX, 3XX, 4XX, 5XX).
1xx – информационные ( 00 Continue, 01 Switching Protocols, 02 Processing)
2хх – успешные ответы ( 00 OK, 01 Created, 02 Accepted )
3хх – редиректы ( 01 Moved Permanently, 07 Temporary Redirect, 02 Found, 02 Moved Temporarily )
4хх – ошибки ответа ( 00 Bad Request, 01 Unauthorized, 02 Payment Required, 03 Forbidden, 04 Not Found, 05 Method Not Allowed )
5хх – ошибки обработки сервера ( 00 Internal Server Error, 01 Not Implemented, 02 Bad Gateway, 03 Service Unavailable, 04 Gateway Timeout)

– Знаю структуру HTTP-запроса и обязательные параметры заголовков.

  1. строка запроса (Request Line)
  2. заголовки (Message Headers)
    Пустая строка (разделитель)
  3. тело сообщения (Entity Body) – необязательный параметр
    Обязательные параметры это GET(POST и тд) И Host

– Знаю отличия HTTP- и HTTPS-протоколов.
HTTPS надстройка над HTTP и позволяет передавать зашифрованные данные SSL или TLS

– Понимаю REST-подход к разработке веб-приложений и применял его на практике.
REST (RESTful) – это общие принципы организации взаимодействия приложения/сайта с сервером посредством протокола HTTP
GET – получить, POST – добавить, PUT – обновить, DELETE – удалить

– Понимаю предназначение и использовал на практике кросс-доменные запросы.
Это запрос с одного хоста на другой. Обычно запрещен браузером. Для разрешения используют заголовок Access-Control-Allow-Origin содержащий домен запроса.

Ответы на вопросы компания MindK по теме Unix

✓ Умею искать файлы по названию и содержимому.
find /home -name top
grep -r "top" /home

✓ Знаю, что делает команда sudo rm -rf /.
Удаляет все

✓ Знаю команду chmod и что означает каждая из цифр 467.
Меняет права на файлы и директории
4 – чтение
6 – 4+2 – чтение и запись
7 – 4+2+1 – чтение запись и выполнение

✓ Знаю, как поменять владельца директории.
chown – R USER: /dir

✓ Знаю, что такое группа пользователей и как добавить в нее нового юзера.
useradd -G newgroup user

✓ Знаю зачем нужна команда sudo.
Получить права супер пользователя

✓ Знаю, что такое крон и умею добавлять новые задачи.
Это демон планировщик задач
crontab –e

✓ Знаю, как посмотреть все процессы пользователя www-data.
top –u www-data
ps –u www-data

✓ Знаю, как завершить нужный процесс.
killall process

✓ Умею работать с менеджером пакетов.
apt-get install packages
apt-get remove packages
apt-get update

✓ Знаю, что такое symlink и как его создать.
Символическая ссылка
ln -s {/путь/к/файлу или директории} {файл-линк}

✓ Знаю в чем отличие soft link от hard link.
Софтлинк – ссылка, удалив файл на который ссылается она станет недоступной. Хардлинк удаляя файл он будет существовать и работать пока не удалится все хардлинки.

✓ Знаю, что такое ssh и как с ним работать.
Протокол сетевого уровня. Для удаленного управления.

✓ Умею копировать файлы с локального на удаленный сервер по ssh.
scp file.gz root@server.my:/home/dir

✓ Знаю, как распаковать tar архив.
tar -xvf file.tar
tar -xzvf file.tar.gz
tar -xjvf file.tar.bz2

✓ Знаю, как работать в редакторе vim.
vi file.conf
Затем можно нажать клавишу i (или insert) и внести нужные изменения
После редактирования нажмите (esc)
:q! – выйти без сохранения
:wq – записать файл и выйти
Поиск по тексту (esc)/словокотороеищем

Примеры типовых docker-compose файлов

Запускаем контейнер php +apache

version: '3'

services:
    php:
        image: nanoninja/php-fpm:latest
        restart: always
        volumes:
            - ./web:/var/www/html
    apache2:
        image: webdevops/apache:latest
        environment:
            - WEB_PHP_SOCKET=php:9000
            - WEB_DOCUMENT_ROOT=/var/www/html
        volumes:
            - ./web:/var/www/html
        ports:
            - 80:80
        links:
            - php

nginx + php-fpm + composer + mongodb + redis + mailhog

version: "3.7"
services:

    web:
        image: nginx:latest
        container_name: nginx
        ports:
            - "80:80"
            - "443:443"
        restart: always
        volumes:
            - "./etc/nginx:/etc/nginx/conf.d"
            - "./etc/ssl:/etc/ssl"
            - "./site.loc:/var/www/site.loc"
        depends_on:
            - "php"
            - "mongodb"
            - "redis"
        links:
            - php
            
    php:
        image: nanoninja/php-fpm
        restart: always
        volumes:
            - "./etc/php/php.ini:/usr/local/etc/php/conf.d/php.ini"
            - "./site.loc:/var/www/site.loc"

    composer:
        image: composer/composer
        volumes:
            - "./site.loc:/var/www/site.loc"
        command: install
            
    mongodb:
        image: mongo
        container_name: mongo
        restart: always
        volumes:
            - "/SITE/DEV/data/db/mongo:/data/db"
        ports:
            - "27017:27017"
        # command: --storageEngine wiredTiger
            
    redis:
        image: redis
        container_name: redis
        restart: always
        command: redis-server --appendonly yes
        ports:
            - "6379:6379"
        volumes:
          - "./data:/data"
          
    mailhog:
        image: mailhog/mailhog:v1.0.0
        ports:
            - "1025:1025"
            - "8025:8025"
      

nginx + mysql

version: '3.3'
services:
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: 'db'
      MYSQL_USER: 'user'
      MYSQL_PASSWORD: 'password'
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      - '3306:3306'
    expose:
      - '3306'
    volumes:
      - my-db:/var/lib/mysql
volumes:
  my-db:
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. ...
  11. 229
Scroll Up